Hadoop如何读取输入文件?

5
我有一个csv文件需要使用hadoop mapreduce进行分析。我想知道hadoop是否逐行解析它?如果是,我想使用逗号拆分字符串来获取要分析的字段。或者有没有更好的方法来解析csv并将其输入到hadoop中?该文件为10GB,以逗号分隔。我想使用java和hadoop。下面的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) {...}
 }
3个回答

4

4
关键在于行的偏移量而不是行数 - Tariq

2
  • 下面的map()方法中Tex类型的"value"参数包含了每个Map/Reduce解析的每一行数据吗?-这是我最困惑的地方。

    是的(假设您使用的默认InputFormat是TextInputFormat)。但是过程比较复杂。实际上,RecordReader决定了由InputFormat创建的InputSplit如何作为记录(或键/值对)发送到mapper。TextInputFormat使用LinerecordReader,而整行都被视为一条记录。请记住,mapper不会立即处理整个InputSplit。相反,它是一个离散的过程,其中将InputSplit作为Records发送给mapper以进行处理。

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

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

这是否符合您的需求?


如果您能在给我点“踩”的同时提供原因,我将不胜感激。这将有助于我提供更好的答案。 - Tariq
我认为你的方法没有问题。这是人们通常处理CSV文件的方式。在逗号上进行分割很容易出错,因为许多CSV文件中的引用值内通常也有逗号。 - Eric Wilson
2
我从未说过这是最佳方法。我只是说在技术上没有什么问题。这只是一个起点。一旦用户习惯了这个框架,就可以轻松地完善他/她的方法。更不要忘记,数据清洗通常是MR处理管道中涉及的第一步。虽然感谢评论。非常感谢。 - Tariq

0

当你已经解析并处理了CSV文件时,可以使用Hadoop。Hadoop需要键值对来执行映射任务。

因此,可以使用类似于opencsv API的工具从文件中获取数据,并将其以键/值的形式提供给Hadoop的Mapper类。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接