我正在使用hadoop streaming
做一些工作,我遇到了一个问题,就在这里。
mapper
的输入文件在每行中有3个字段。我知道在将数据提供给mapper
之前,reducer
的输出将被排序和分区,我的问题是
1.我可以使用第三字段对这些数据进行排序/分区吗? 2.我可以使用整行对数据进行排序吗?
PS:
AFAIK,sort-key或partition-key应该是每行的前k个字段,对吧?如果是这样,是否意味着我应该将这些字段移到mapper
中的行前面?
答案 0 :(得分:0)
Mapper的输出仅根据键进行排序。
所以,假设您输入记录为: field1 , field2 , field3
1)如果您不希望第一个字段成为您的密钥,并且可以管理 3rd 字段是否为密钥,则您不需要执行任何其他操作,因此您可以执行类似的操作如下:
output.collect(new Text(field3), new Text(field1 + ","+field2)); //Old API
context.write(new Text(field3), new Text(field1 + ","+field2)); //New API
2)类似地,你可以将所有内容作为键,将null作为值,这将导致按整行进行排序,可以完成以下操作:
output.collect(new Text(field1 + ","+field2 + "," + field3), null); // Old API
context.write(new Text(field1 + ","+field2 + "," + field3), null); // New API
不,就排序而言,字段在输入文件中的顺序完全无关紧要,它只取决于您从映射器发出的映射器输出。
但是,如果您需要将 field1 作为映射器输出中的键,但希望在 field3 上进行二次排序,请阅读:How to do a secondary sort on values ?