假设在A.a=B.a
上加入B,并且它们都是大表。 Hive将通过公共连接处理此连接操作。执行图(由facebook给出):
但我对此图表感到困惑,是否只有减速机?
据我了解,地图输出键为table_name_tag_prefix+join_key
。但是在分区阶段,它仍然使用join_key来分区记录。在reduce阶段,每个reducer读取具有相同连接键的<join_key,value>
,reducer不需要读取所有地图分割。
答案 0 :(得分:2)
减速器的数量由hive.exec.reducers.bytes.per.reducer
定义(默认为1GB)
因此,对于映射器的每GB输入数据,您将获得1个减速器
然后,hive在连接列上使用hash()
函数,并对散列函数的输出进行模运算,并使用首先设置的reducer数。
因此,如果您加载10 GB的数据(两个表一起),应该有~10个减少器
不能说我们按列ID
加入,所以让我们假设下一个输出:
hash(101)=101 -> 101%10=1
hash(102)=102 -> 102%10=2
hash(1001)=1001 -> 1001%10=1
因此,ID列中值为101和1001的行将转到reducer#1,而ID 102将转到reducer#2。你仍然会有10个减速器但如果所有数据只有上面的ID那么8个减速器将没有输入,2个减速器将得到其余的。
答案 1 :(得分:1)
理论上,有两种情况只有一种或有多种减速剂。使用的减速器的确切数量取决于查询详细信息。
您可以尝试使用脚本中的以下内容设置要使用的缩减器数量。
set mapred.reduce.tasks=50
这是否实际导致性能提升取决于您正在执行的查询。有关更多详细信息,另请参阅this answer。
希望有所帮助。