在hive中,例如order by,count(1),reduce数字只能设置为1。 那么,这是什么原因?感谢
答案 0 :(得分:0)
在某些情况下,hive必须生成map-reduce程序,最终将使用单个reducer 对于你的情况:
count()
:执行计数操作时,hiveserver最终会向客户端返回一个表示记录数量的数字。这个单一的号码必须从一个map-reduce程序返回到hiveserver
这个限制转化为count()
的最终map-reduce必须有一个减速器这一事实
从性能方面来说,这根本不会打扰你,这个阶段的预还原器部分中的映射器将使用组合器,因此每个映射器将计算自己的行,而reducer只是添加那些的结果计数(在设置hive.map.aggr
时适用)
自hive 0.12以来,此行为已更改,hive可在运行计数时完全跳过reducer部分。看here
order by
:运行此命令,您要求hive返回全局排序的数据。使用map-reduce执行引擎时,我们可以考虑如何完成此顺序
候选人是此操作的映射器或缩减器。由于映射器没有任何共享,没有一个映射器可以生成包含整个表的输出,有序,在最好的情况下,它可以订购自己的分割。
现在我们有减速器,我们可以将数据从映射器移动到减速器,因此第一个选择是将所有数据混合到一个减速器中,它可以轻松地对其进行排序。
第二种选择是在不同的减速器之间分配,然后每个减速器只能订购它收到的数据
例如,reducer#1在排序后得到了这个数据[3,1,6]
和reducer#2:[5,2]
,reducer#1将输出[1,3,6]
和#2:[2,5]
。 />
结合两个输出togather将导致{strong>未订购设置为[1,3,6,2,5]
。
确保多个Reducer(每个都对自己的数据进行排序)将产生全局排序结果集的唯一方法是改变当前map-reduce分区器的工作方式。
目前,数据通过hash
的{{1}}从映射器传递到reducer,如果我们可以以这样的方式对数据进行混洗,例如,所有小于3的值将转到reducer#1并且大于等于3将减速器#2然后,减速器#1将输出key
和#2:[1,2]
。
结合两个输出togather将导致有序设置为[3,5,6]
因此,在原始map-reducer程序中,由于shuffle限制,您只能使用单个reducer。这也似乎从hive 0.12(here)改变了,但我还没有测试过我自己。