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
。
我有一个简单的查询:
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
。