Hive优化:Hive的执行计划、分桶、MapJoin、数据倾斜

文章目录

  • 1. hive的执行计划
  • 1.1 为什么使用EXPLAIN
    • 1.2 使用EXPLAIN的步骤
    • 1.3 EXPLAIN在什么场合使用
  • 2. 分桶
    • 2.1 为什么要使用分桶
  • 3. Map Join
    • 3.1 Map Join
      • 3.1.1 大小表关联
      • 3.1.2 不等连接
    • 3.2 Bucket-MapJoin
      • 3.2.1 作用
      • 3.2.2 条件
    • 3.3 SMB Join
      • 3.3.1 作用
  • 4. 数据倾斜
    • 4.1 表连接数据倾斜(Join skew in)
      • 4.1.1 运行时优化
      • 4.1.2 编译时优化
    • 4.2 分组统计数据倾斜(Groupby skew in)
      • 4.2.1 Map阶段聚合
      • 4.2.2 MRJob随机数打散

1. hive的执行计划

1.1 为什么使用EXPLAIN

在处理大数据查询时,性能是一个关键问题。复杂的查询可能涉及多个表的连接、过滤、分组和排序操作,这些操作如果处理不当,会导致查询效率低下,甚至无法完成。在Hive中,EXPLAIN命令可以帮助我们理解查询的执行计划识别出潜在的性能瓶颈,从而进行有针对性的优化

1.2 使用EXPLAIN的步骤

使用EXPLAIN命令只需在查询语句前加上EXPLAIN关键字,即可查看该查询的执行计划。通过EXPLAIN输出的执行计划,可以看到每个阶段的操作,如表扫描、数据过滤、分组聚合等。

  • 编写SQL查询:确定要执行的查询。
  • 添加EXPLAIN关键字:在查询面前加上EXPLAIN
EXPLAIN SELECT ...;

1.3 EXPLAIN在什么场合使用

EXPLAIN命令适用于以下场合:

  • 复杂查询:当查询涉及多个表的连接、复杂的过滤条件或分组聚合时,使用EXPLAIN可以帮助理解查询的执行步骤,并能找出性能瓶颈。
  • 查询优化:在优化查询性能时,EXPLAIN可以帮助验证优化的效果。
  • 调试查询:如果查询执行时间过长或结果不符合预期,使用EXPLAIN可以帮助诊断问题,发现潜在的错误或低效的操作。

2. 分桶

2.1 为什么要使用分桶

  • 为了抽样
    在处理大规模数据集时,在开发和修改查询的阶段,可以使用整个数据集的一部分进行抽样测试查询、修改。可以使得开发更高效。
  • 为了提高查询
    连接两个在(包含连接列的)相同列上划分了桶的表,可以使用Map端连接(Map-side join)高效的实现。
    比如join操作,对于join操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行join操作就可以,可以大大减少join的数据量。

3. Map Join

3.1 Map Join

Hive优化:Hive的执行计划、分桶、MapJoin、数据倾斜_第1张图片
Map Join就是在Map阶段进行表之间的连接。而不需要进入到Reduce阶段才进行连接。这样就节省了在shuffle阶段时要进行大量的数据传输,从而起到了优化作业的作用。
要使MapJoin能够顺利进行,就必须满足这样的条件:除了一份表的数据分布在不同的Map中外,其他连接的表的数据必须在每个Map中有完整拷贝。
所以并不是所有的场景都适合用Map join。它通常会用在如下的一些场景:在两个要连接的表中,有一个大表,有一个小表,这个小表可以存放在内存中而不影响性能。
这样就可以把小表文件复制到每一个Map任务的本地,再让Map把文件读到内存中待用。

3.1.1 大小表关联

select f.a

你可能感兴趣的:(Hive,hive,hadoop,数据仓库,大数据)