使用随机字段排序和分区,而不仅仅是前k个字段

时间:2013-04-02 11:59:04

标签: sorting hadoop partitioning

我正在使用hadoop streaming做一些工作,我遇到了一个问题,就在这里。

mapper的输入文件在每行中有3个字段。我知道在将数据提供给mapper之前,reducer的输出将被排序和分区,我的问题是

1.我可以使用第三字段对这些数据进行排序/分区吗? 2.我可以使用整行对数据进行排序吗?

PS:

AFAIK,sort-key或partition-key应该是每行的前k个字段,对吧?如果是这样,是否意味着我应该将这些字段移到mapper中的行前面?

1 个答案:

答案 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 ?