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

问题描述

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

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

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

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

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

解决方法

打开地图联接:

set hive.auto.convert.join=true;

select * 
 from table1 cross join table2;

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

,

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

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。因此,它就像交叉联接一样工作,而仅发生地图端联接操作。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...