0

我正在使用hadoopstreaming做一些工作,我遇到了一个问题,就是这样。

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

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

PS:

AFAIK,排序键或分区键应该是每行的前 k 个字段,对吧?如果是这样,这是否意味着我应该将这些字段移到行的最前面mapper

4

1 回答 1

0

Mapper 的输出仅根据键进行排序。

所以,假设你有输入记录:field1field2field3

1)如果您不想将第一个字段作为您的关键并且可以管理您的第三个字段是否是关键,那么您不需要做任何其他事情,所以您可以执行以下操作:

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进行二次排序,请阅读:如何对值进行二次排序?

于 2013-04-02T14:17:20.177 回答