返回介绍

Hive bucket map join

发布于 2024-06-23 16:10:22 字数 3860 浏览 0 评论 0 收藏 0

在 Hive 中,当表非常大,而且所有需要关联的表都是分桶表,并且关联字段都是分桶字段,那么我们就可以使用 bucket map join 来关联表。另外需要注意的是,一个表的分桶数是另一个表的分桶数的倍数。
hive bucket map join

用例子来理解一下什么是 bucket map join。如果一个表的分桶数是 2 ,那么其他表的分桶数必须是 2 或者是 2 的倍数(2,4,6等等)。因此如果满足了前面这些条件,那么表的 join 操作就只会在 mapper 端进行。否则,表的 join 就是一个普通的 inner join。

在每个 mapper 中,所有表的分桶中只有匹配的分桶会被复制到 mapper 内存中。因此,bucket map join 的执行效率是非常高的。注意在 bucket map join 中,确保数据没有排序。

另外需要注意的,默认情况下,Hive 不支持 bucket map join。所以我们需要把下面的属性设置为 true:

  1. set hive.optimize.bucketmapjoin = true

bucket map join 原理

多个表使用 bucket map join 来关联的时候,关联操作只会在 mapper 端进行。换一种方式来理解就是,mapper 处理 A 表的分桶1的时候,它只会从 B 表的分桶 1 取数据。即分桶之间做关联。

bucket map join 使用场景

bucket map join 适用于以下场景:

  • 所有的表都非常大
  • 关联字段使用的是表的分桶字段
  • 一个表的分桶数是另一个表的分桶数的倍数
  • 所有的表都是不排序的

bucket map join 缺点

使用 bucket map join 主要的缺点就是必须要根据 SQL 代码的特点来对表做分桶,也就是说,SQL 中的关联字段和表的分桶字段要一致才行。只要关联字段和分桶字段不一致,我们就没办法使用 bucket map join 了。

使用 bucket map join 相关技巧

首先,表的分桶字段与关联字段要保持一致。另外,在插入数据的时候要对表做分桶,其中有一种方式就是在插入数据之前把 hive.enforce.bucketing 参数设置为 true

  1. set hive.enforce.bucketing=true

比如:

  1. create table b1(
  2. col0 string,
  3. col1 string,
  4. col2 string,
  5. col3 string,
  6. col4 string,
  7. col5 string,
  8. col6 string
  9. )
  10. clustered by (col0) into 32 buckets;
  11. create table b2(
  12. col0 string,
  13. col1 string,
  14. col2 string,
  15. col3 string,
  16. col4 string,
  17. col5 string,
  18. col6 string
  19. )
  20. clustered by (col0) into 8 buckets;
  21. set hive.enforce.bucketing = true;
  22. insert OVERWRITE table b1 select * limit 10000;
  23. insert OVERWRITE table b2 select * limit 10000;

在做关联的时候把下面参数设置为 true

  1. set hive.optimize.bucketmapjoin=true;

关联代码:

  1. select /*+ MAPJOIN(b2) */ b1.*
  2. from b1,b2
  3. where b1.col0=b2.col0;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文