当前位置:   article > 正文

Hive表join数据倾斜(skewjoin)_hive.skewjoin.key

hive.skewjoin.key

一、运行时优化

使用场景:如果大表和大表进行join操作,则可采用skewjoin(倾斜关联来开启对倾斜数据的优化)

  1. skewjoin原理:
  2. 1. 对于skewjoin.key,在执行job时,将它们存入临时的HDFS目录,其它数据正常执行
  3. 2. 对倾斜数据开启map join操作(多个map并行处理),对非倾斜值采取普通join操作
  4. 3. 将倾斜数据集和非倾斜数据集进行合并Union操作。

二、编译时优化

上面的配置项其实应该理解为hive.optimize.skewjoin.runtime,也就是sql运行时来对倾斜信息进行优化;除此之外还有另外一个配置:

set hive.optimize.skewjoin.compiletime=true;  #默认关闭。

此参数的用处和上面的hive.optimize.skewjoin一致,但在编译sql时就已经将执行计划优化完毕。但要注意的是,只有在表的元数据中存储的有数据倾斜信息时,才能生效。因此建议runtime和compiletime都设置为true。

可以通过建表语句来指定数据倾斜元数据:

  1. CREATE TABLE list_bucket_single (key STRING, value STRING)
  2. -- 倾斜的字段和需要拆分的key
  3. SKEWED BY (key) ON (1,5,6)
  4. -- 为倾斜值创建子目录单独存放
  5. [STORED AS DIRECTORIES];

三、Union优化

应用了表连接倾斜优化以后,会在执行计划中插入一个新的union操作,此时建议开启对union的优化配置

  1. -- 默认关闭
  2. set hive.optimize.union.remove=true;

此配置项减少对Union all子查询中间结果的二次读写,可以避免union输出的额外扫描过程,当开启了skewjoin时尤其有用,建议同时开启

  1. set hive.optimize.skewjoin=true;
  2. set hive.optimize.skewjoin.compiletime=true;
  3. set hive.optimize.union.remove=true;

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号