排序和分区使用随机场不只是第一个k字段

1hdlvixo  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(307)

我在用hadoop streaming 做一些工作,我遇到一个问题,就在这里。
将输入文件 mapper 每行有3个字段。我知道 mapper 的输出将在将数据馈送到之前进行排序和分区 reducer ,我的问题是
1.我可以使用第3个字段对这些数据进行排序/分区吗?2.我能用整行数据排序吗?
附言:
另外,排序键或分区键应该是每行的前k个字段,对吗?如果是这样,是不是意味着我应该把这些字段移到 mapper ?

qmelpv7a

qmelpv7a1#

Map器的输出仅根据键进行排序。
所以,假设您有输入记录:field1,field2,field3
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

不,就排序而言,字段在输入文件中的顺序根本不重要,它只取决于作为Map器输出从Map器发出的内容。
但如果需要将field1作为Map器输出中的键,但希望对field3进行二次排序,请阅读:how to do a secondary sort on values?

相关问题