如何提高Hive TEZ中的交叉连接性能?

时间:2020-09-25 11:33:04

标签: performance hive hiveql cross-join apache-tez

我有一个配置有50亿条记录的配置表。我希望将这50亿条记录中的每条记录与硬编码的52条记录结合起来。

为实现这一点,我正在像进行交叉连接

select * 
from table1 join table 2
ON 1 = 1;

要花尽可能多的时间运行尽可能多的内存参数。

还有其他更短或更简单的方法可以在更短的时间内实现这一目标吗?

2 个答案:

答案 0 :(得分:2)

打开地图联接:

set hive.auto.convert.join=true;

select * 
 from table1 cross join table2;

表很小(52条记录),应该适合内存。 Map-join运算符会将小表加载到分布式缓存中,每个reducer容器将使用它来处理内存中的数据,这比common-join快得多。

答案 1 :(得分:1)

您的查询速度很慢,因为交叉连接(笛卡尔乘积)由一个单个化简器处理。解决方法是强制执行更高的并行度。一种方法是将查询转换为内部联接,以便利用地图端联接优化。

with t1 as (
  selct col1, col2,..., 0 as k from table1
)
,t2 as (
  selct col3, col4,..., 0 as k from table2 
)
selct 
  *
from t1 join t2 
    on t1.k = t2.k 

现在,每个表(CTE)都有一个伪造的列,名为k,具有相同的值0。因此,它就像交叉联接一样工作,而仅发生地图端联接操作。