2

我的 hadoop 工作需要了解每条记录的来源输入路径。

例如,假设我在一组 S3 对象上运行作业:

s3://bucket/file1
s3://bucket/file2
s3://bucket/file3

我想减少键值对,例如

s3://bucket/file1    record1
s3://bucket/file1    record2
s3://bucket/file2    record1
...

有没有扩展org.apache.hadoop.mapreduce.InputFormat可以做到这一点?或者有比使用自定义输入格式更好的方法吗?

我知道在映射器中可以从MapContextHow to get the input file name in the mapper in a Hadoop program?)中访问此信息,但我使用的是 Apache Crunch,我无法控制我的任何步骤是 Maps 还是 Reduces,但是我可以可靠地控制 InputFormat,所以在我看来它是执行此操作的地方。

4

1 回答 1

1

请查看我的博客文章来自定义 inputsplit 和 recordreader

该博客中的代码将密钥设置如下(记录阅读器代码的第 69-70 行)

value = new Text(line);
key = new LongWritable(splitstart);

在您的情况下,您需要如下设置密钥,但我没有测试它。

key = fsplit.getPath().toString();
于 2017-08-15T02:11:59.527 回答