hadoop如何读取输入文件?

z9gpfhce  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(261)

我有一个csv文件要用hadoopmapreduce分析。我想知道hadoop是否会逐行解析它?如果是,我想用逗号分隔的字符串来得到要分析的字段。或者有没有其他更好的方法来解析csv并将其输入hadoop?文件为10 gb,逗号分隔。我想用java和hadoop。below map()方法中tex type的参数“value”包含map/reduce?解析的每一行这是我最困惑的地方。
这是我的密码:

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    try {
       String[] tokens = value.toString().split(",");

       String crimeType = tokens[5].trim();      
       int year = Integer.parseInt(tokens[17].trim()); 

       context.write(crimeType, year);

     } catch (Exception e) {...}
 }
mpbci0fu

mpbci0fu1#

当您已经解析并处理csv文件时,可以使用hadoop。hadoop需要Map任务的键值对。
因此,使用类似opencsvapi的东西,从文件中获取数据,并以键/值的形式提供给hadoop的mapper类。
有关详细说明,请查看此链接。

yyhrrdl8

yyhrrdl82#

below map()方法中tex type的参数“value”包含map/reduce?解析的每一行这是我最困惑的地方。
是(假设您使用的是默认的inputformat,即textinputformat)。不过,这个过程要复杂一些。实际上是recordreader决定了inputformat创建的inputsplit如何作为记录(或键/值对)发送到Map器。textinputformat使用linerecordreader,整行被视为一条记录。记住,mapper不会一次处理整个inputsplit。它是一个离散的过程,其中inputsplit作为记录发送到Map器以进行处理。
我想知道hadoop是否会逐行解析它?如果是,我想用逗号分隔的字符串来得到要分析的字段。
我不觉得你的方法有什么问题。这就是人们通常处理csv文件的方式。将行作为文本值读入,将其转换为字符串并使用split()。一个小建议。使用context.write()将java类型转换为适当的ma类型,如crimetype to text()和year to intwritable。
这是你需要的吗?

dnph8jn4

dnph8jn43#

是的,默认情况下hadoop使用一个文本输入读取器,从输入文件逐行向Map器提供信息。Map器中的键是读取行的偏移量。但是要小心csv文件,因为单个列/字段可能包含换行符。您可能需要寻找如下csv输入读取器:https://github.com/mvallebr/csvinputformat/blob/master/src/main/java/org/apache/hadoop/mapreduce/lib/input/csvnlineinputformat.java

相关问题