5

我有一个 csv 文件要使用 hadoop mapreduce 进行分析。我想知道hadoop是否会逐行解析它?如果是,我想使用逗号分隔的字符串来获取要分析的字段。还是有其他更好的解析csv并将其输入hadoop的方法?该文件为 10 GB,以逗号分隔。我想将 java 与 hadoop 一起使用。下面 map() 方法中 Tex 类型的参数“值”包含 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) {...}
 }
4

3 回答 3

4

是的,默认情况下,Hadoop 使用文本输入阅读器,从输入文件中逐行输入映射器。映射器中的关键是读取的行的偏移​​量。不过要小心 CSV 文件,因为单个列/字段可以包含换行符。您可能想要寻找像这样的 CSV 输入阅读器:https://github.com/mvallebr/CSVInputFormat/blob/master/src/main/java/org/apache/hadoop/mapreduce/lib/input/CSVNLineInputFormat。爪哇

于 2013-10-20T15:41:51.273 回答
2
  • 下面 map() 方法中 Tex 类型的参数“值”包含 Map/Reduce 解析的每一行?- 这是我最困惑的地方。

    是的(假设您使用的是默认 InputFormat ,即TextInputFormat)。这个过程有点复杂。实际上是RecordReader决定由 InputFormat 创建的InputSplit将如何作为记录(或键/值对)发送到映射器。TextInputFormat 使用LinerecordReader并将整行视为一条记录。请记住,mapper 不会一次处理整个 InputSplit。它是一个离散的过程,其中 InputSplit 作为记录发送到映射器以便得到处理。

  • 我想知道hadoop是否会逐行解析它?如果是,我想使用逗号分隔的字符串来获取要分析的字段。

    我没有发现你的方法有什么问题。这就是人们通常处理 csv 文件的方式。将这些行作为Text 值读取,将它们转换为String并使用split()。不过有一个小建议。在使用Context.write()将 Java 类型转换为适当的 MA 类型之前,例如将 crimeType 转换Text()并将 year 转换为IntWritable

这是你需要的吗?

于 2013-10-20T22:54:15.457 回答
0

当您已经解析并处理了 csv 文件时,您可以使用 hadoop。Hadoop 需要用于映射任务的键值对。

因此,请使用 opencsv API 之类的东西从文件中获取数据,并根据键/值将其提供给 Hadoop 的映射器类。

请查看此链接以获取详细说明。

于 2013-10-19T21:54:16.477 回答