我有一个配置有50亿条记录的配置表。我希望将这50亿条记录中的每条记录与硬编码的52条记录结合起来。
为实现这一点,我正在像进行交叉连接
select *
from table1 join table 2
ON 1 = 1;
要花尽可能多的时间运行尽可能多的内存参数。
还有其他更短或更简单的方法可以在更短的时间内实现这一目标吗?
答案 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
。因此,它就像交叉联接一样工作,而仅发生地图端联接操作。