Hive SQL 强制洗牌

Hive SQL force shuffle

我有一个简单的查询:

Select * 
from A
left join b on A.b = b.b
left join c on A.c = c.c
left join d on A.d = d.d
left join e on A.e = e.e
...
~20 tables

所有 tables b、c、d、e 等都很小,因此所有连接都是广播连接

问题是 table A 很大(比如 300m 条记录)并且分区不当。 它有大约 80 个分区,其中 15 个包含 90% 的数据。

因此,当发生广播连接时,只有 15 个核心执行所有连接数学运算,需要 2 小时才能完成。

我的解决方案是通过添加“order by”强制洗牌 A

Select * 
from 
    (select * from A order by A.a) A
left join b on A.b = b.b
left join c on A.c = c.c
left join d on A.d = d.d
left join e on A.e = e.e
...

这里A.a是唯一字段组合。

现在 A 被洗牌到 200(默认)半相等分区和资源以最佳方式使用,需要 35 分钟才能完成。

是否有更优雅的方法来强制随机播放 table A,比如一些提示魔法?

您可以在子查询中尝试 distribute by <some evenly distributed key> 而不是 order by