我有一个用hadoop mapreduce分析的csv文件。我想知道hadoop是否会逐行解析它?如果是的话,我想使用逗号分隔字符串来获取想要分析的字段。还是有其他更好的方法来解析csv并将其提供给hadoop?该文件是10 GB,逗号分隔。我想用hadoop使用java。下面的map()方法中Tex类型的参数“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) {...}
}
答案 0 :(得分:4)
是的,默认情况下,Hadoop使用文本输入阅读器,从输入文件中逐行提供映射器。映射器中的键是读取行的偏移量。但请注意CSV文件,因为单个列/字段可以包含换行符。您可能希望查找类似这样的CSV输入阅读器:https://github.com/mvallebr/CSVInputFormat/blob/master/src/main/java/org/apache/hadoop/mapreduce/lib/input/CSVNLineInputFormat.java
答案 1 :(得分:2)
以下map()方法中Tex类型的参数“value”包含Map / Reduce解析的每一行? - 这是我最困惑的地方。
是(假设您使用的是默认的InputFormat,即 TextInputFormat )。但这个过程有点复杂。实际上 RecordReader 决定了InputFormat创建的 InputSplit 将如何作为记录(或键/值对)发送到映射器。 TextInputFormat使用 LinerecordReader ,整行被视为记录。请记住,mapper不会同时处理整个InputSplit。它是一个离散的过程,其中InputSplit以记录的形式发送给映射器,以便进行处理。
我想知道hadoop是否会逐行解析它?如果是,我想使用逗号分隔字符串来获取想要分析的字段。
我发现你的方法没有任何问题。这就是人们通常处理csv文件的方式。在行中读取文本值,将它们转换为字符串并使用 split()。但是有一个小建议。在使用 Context.write()发出Java类型之前将其转换为适当的MA类型,例如 crimeType 到 Text()和年份到<强> IntWritable 强>
这是你需要的吗?
答案 2 :(得分:0)
当您已经解析并处理了csv文件时,可以使用hadoop。 Hadoop需要映射任务的键值对。
因此,使用类似opencsv API的方法,从文件中获取数据,并根据键/值将其提供给Hadoop的映射器类。
有关详细说明,请查看this link。