我已经为我的应用程序实现了二次排序。
File-1 File-2 File-3
------ ------ ------
name,pos,r,value name,pos,r,value name,pos,r,value
aa,1,0,123 aa,2,1,1 aa,3,1,11
bb,1,0,234 aa,2,2,34 aa,3,2,12
aa,2,3,55 aa,3,3,13
bb,2,1,99 bb,3,1,15
bb,2,2,54 bb,3,2,19
bb,2,3,32 bb,3,3,13
对于 File-1 中的每条记录,File2 和 File3 中各有 3 条记录。
复合键是 ::name + (pos+r)
自然键是 :: 名称
排序顺序基于复合键。基于 (pos+r) 的升序
预期输出为
File1 特定名称 (aa) 的内容后跟所有 file2 内容(三行 aa 以 pos+r 排序),然后是文件三内容(三行 aa 以 pos+ 排序)
AA,123,1,34,55,11,12,13
bb,234,99,54,32,15,19,13
我已经使用 setGroupingComparatorClass、setSortComparatorClass 和自定义分区器在二次排序中实现了这一点。
我的疑问是:??
1)如何为此场景添加组合器。
- 据我了解,分组和排序发生在reducer阶段,一旦所有map输出(基于自然键分区)都转移到reduce机器。
2)如果添加了组合器,排序将如何以及何时发生,以便reduce函数以正确的顺序接收来自所有映射器的输出。
- 地图输出是否会被排序两次,一次在每个地图之后执行的组合器中,然后在归约器端对所有组合器输出进行排序?