【问题标题】:how does hadoop read input file?hadoop如何读取输入文件?
【发布时间】:2013-10-19 19:56:10
【问题描述】:

我有一个 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) {...}
 }

【问题讨论】:

    标签: csv hadoop


    【解决方案1】:

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

    【讨论】:

    • 键是行的offset不是行的number
    【解决方案2】:
    • 下面map()方法中Tex类型的参数“value”包含了Map/Reduce解析的每一行? - 这是我最困惑的地方。

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

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

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

    这是你需要的吗?

    【讨论】:

    • 如果我能得到反对票的原因,我将不胜感激。它将帮助我提供更好的答案。
    • 我没有发现你的方法有什么问题。这就是人们通常处理 csv 文件的方式。 以逗号分隔非常容易出错,因为在许多 CSV 文件中的引用值中通常都有逗号。
    • 我从未说过这是最好的方法。我只是说它在技术上没有任何问题。这只是一个起点。一旦用户习惯了该框架,他/她就可以轻松地改进他/她的方法。不要忘记,数据清理通常是 MR 处理管道的第一步。不过感谢您的评论。欣赏它。
    【解决方案3】:

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

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

    查看this link 了解详细说明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 2016-05-27
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多