用于左连接的蜂窝偏斜缓解 [英] Hive skew mitigation for left join

查看:18
本文介绍了用于左连接的蜂窝偏斜缓解的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个典型的影响左外部联接性能的不对称问题(左表很大,右表很小)。不对称的密钥主要是空的(很长一段时间),其次是&键X和键。

我尝试了几种不同的方法:

  1. 在偏斜的键上添加连接谓词";is Not Null";似乎没有任何明显的影响。此外,我还需要处理
  2. 我使用hive.Optimize.skewJoin的结果好坏参半
  3. 我在几篇文章中提到的关键腌制技术非常有效(速度快3倍-4倍)!但我注意到这会增加查询的复杂性,而且它确实需要修改每个问题查询、培训各种其他工程师等
  4. 我刚刚注意到一个非常有前景的功能,您可以specify skew in the metastore并让HIVE使用它来生成倾斜优化的执行计划。我很想在退回到选项3之前测试一下,但是我似乎不能将空值放入偏斜值列表中。它将接受这一点:

alter table T skewed by (skewed_key) on ('keyX');

但不是这个:

alter table T skewed by (skewed_key) on ('keyX',NULL);

您知道这个语法有什么问题吗?或者此功能不接受Null偏斜值?

一般情况下,我也愿意接受倾斜问题的其他解决方案:)

推荐答案

我的5分钱:我不打算完全解决这篇文章中的歪曲问题。我只是提供一些关于偏斜的空连接键的信息以及我是如何解决这个问题的,希望它能对我有所帮助

是的,密钥加盐起作用了,其他一切似乎都不稳定或根本不起作用。

如果歪曲的密钥为空,并且所有空记录都分发到同一个约简器,您可以通过将空密钥转换为不在允许范围内的随机密钥值来解决此问题,这样它们就不会被联接,而是均匀地分配给多个约简器。

类似这样的内容:

LEFT JOIN  asset_dim p ON NVL(f.asset_id, -9999999+RAND()*1000.0)%1000) = p.asset_id 
此方法依赖于这样一个事实,即您永远不会在-9999999…的范围内拥有负关键点-9998000

对于非空斜密钥,这种方法是危险的,特别是当您在带有Spot节点的EMR上运行时,这些节点在运行时可能会丢失。重新运行Containers将生成不同的RAND,并且相同的记录将被传递到不同的Reducer,这将导致部分数据复制或丢失,但对于未连接的NULL的这种特定情况,它工作得很好。

也适用于";KeyX";显式拆分Join+Union都可以很好地工作,但解决方案有点麻烦:

(select * from t1 where key!='KeyX') left join t2 on t1.key=t2.key --everything else
UNION ALL
(select * from t1 where key=='KeyX') left join t2 on t1.key=t2.key --skewed

这篇关于用于左连接的蜂窝偏斜缓解的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆