【发布时间】:2015-02-08 07:46:36
【问题描述】:
我在同一个文件夹中有成百上千个输入文件 (.csv) 和元数据文件 (.json)。 $HDFS_ROOT/输入文件夹
// 输入数据.csv文件
input_1.csv, input_2.csv..input_N.csv
// 输入元数据.json文件
input_1.json, input_2.json..input_N.json
谁能告诉我如何让每个映射器获取文件对,即整个输入文件 (.csv) 及其元数据文件 (.json)。
注意:input_i.csv 和 input_i.json 应该转到同一个映射器,以便输入及其元数据都有意义进行验证。
我尝试了什么: 我尝试分别使用从 FileInputFormat 和 RecordReader 扩展的 WholeFileInputFormat 和 WholeFileRecordReader。这仅适用于 .csv 文件。此外,我将 .json 文件放入分布式缓存中,以便映射器访问。这不是一个好的解决方案。
【问题讨论】:
-
你尝试了什么?这不是其他人为您编码的编码服务。
-
冷静。我尝试分别使用从 FileInputFormat 和 RecordReader 扩展的 WholeFileInputFormat 和 WholeFileRecordReader。这仅适用于 .csv 文件。此外,我将 .json 文件放入分布式缓存中。这不是一个好的解决方案。
-
为什么不把这个留给reducer呢?使用 MultipleInputs 将您的 CSV 和 JSON 数据导入不同的映射器,然后在 reduce 阶段加入它们。这将是处理这个问题的预期方式。我认为这对你来说不是很好,因为你想做进一步的加入,所以也许这个工作在 MapReduce 之外处理会更好?级联可以让你做 map -> reduce -> reduce。
-
感谢您的意见。刚刚在这里也看到了 MultipleInputs 的示例:lichun.cc/blog/2012/05/hadoop-multipleinputs-usage 如果我理解您基于 MR 的想法,请纠正我。每个 Mapper 都会将键作为“input_i”发出,并将 .csv 和 .json 的相应(整个)数据作为文本发出,在 reducer 中,我们将获得键“input_i”和 iterable
的值。现在,reducer 可以进行验证、转换等,或者只是将键“input_i”和值作为 .json 数据 + .csv 数据发出。 MR 的下一阶段现在可以访问 .json + .csv 数据进行处理。 -
我看到的一些问题是:reducer 的文本值顺序可能不同,即第一个值可能是由 .csv 数据或 .json 数据组成的文本。此外,如果 .csv 的文件大小大于 64MB 或 128MB 怎么办。那么值可能 > 2。我们如何确定 iterable
中的值是 .csv 数据还是 .json 数据。
标签: java hadoop mapreduce hbase