2016-04-15 68 views
0

我有多个文件,通过单个文件使用蜂巢union all,现在union all查询加入超过10个蜂巢表,并且非常缓慢。每个个人union all查询也有一个或多个连接条件。还需要配置单元性能联盟全部

我的预期最终结果以由主键进行分组,e.g:

table 1 

key1|val1|val2|.. 

table 2 

key1|val10|val11|.. 

insert overwrite <temptable> 
select key, output_string from 
(select key, concat (col1,col2,..) from table 1 where <join conditions> 
union all 
select key, concat(col10,col11,..) from table 2 where <join conditions> 
.. 
) 
cluster by key; 

union all将结合以上两个表中,我使用簇通过键,以产生期望的结果。蜂巢的表现非常缓慢,其他的选择是什么?

+0

我看@ veeraB的答案,看起来很权威。我想问的第一个问题是每个单独查询需要多长时间 - 任何长时间运行的查询都会影响整个“工会”链。接下来的问题是,Hive可以以这样的方式解析查询:并行运行每个查询,这可以通过'EXPLAIN'或者只是在执行时观察;如果不是,'hive.optimize.union.remove'设置可能是一个选项。 –

回答

0

注意此选项:

hive.optimize.union.remove 
Default Value: false 
Added In: Hive 0.10.0 with HIVE-3276 

是否删除工会和工会推动和文件水槽上方工会之间的运营商。这可以避免通过联合对输出进行额外扫描。

这对于联合查询是独立有用的,并且在hive.optimize.skewjoin.compiletime设置为true时特别有用,因为插入了一个额外联合。

如果hive.merge.mapfileshive.merge.mapredfiles中的任何一个设置为true,则会触发合并。

如果用户已设置hive.merge.mapfilestruehive.merge.mapredfilesfalse的想法是,减速器的数量少,所以文件的数量反正小。

但是,通过这种优化,我们可能会大幅增加文件数量。所以,我们积极合并。

+0

谢谢Tom和veeraB。 hive.optimize.skewjoin.compiletime应该可以做到。联盟的所有查询都在早期产生了100多个map-reduce作业,但是我做了一些更改以删除一些不必要的连接,现在它已经减少到12个以上的作业。 – rupal