【问题标题】:Hive Sort Merge Bucket JoinHive 排序合并桶连接
【发布时间】:2016-11-04 17:07:30
【问题描述】:

Sort merge Bucket Join 与 Sort Merge Bucket Map join 不同吗?如果是这样,应该添加什么提示来启用 SMB 加入? SMBM join 比 SMB join 有什么优势?

“set hive.auto.convert.sortmerge.join=true”这个提示是否足以用于 SMB 加入?否则也应包括以下提示。

设置 hive.optimize.bucketmapjoin = true 设置 hive.optimize.bucketmapjoin.sortedmerge = true

我问的原因是,提示说Bucket map join,但这里没有执行MAP join。我假设 SMB 中涉及 map 和 reduce 任务,而 SMBM 中只涉及 map 任务。

如果我错了,请纠正我。

【问题讨论】:

    标签: join hive


    【解决方案1】:

    如果您的表很大(由“set hive.mapjoin.smalltable.filesize;”确定),则不能进行地图侧连接。除了你的表被分桶和排序,并且你打开了“set hive.optimize.bucketmapjoin.sortedmerge = true”,那么你仍然可以在大表上进行地图侧连接。 (当然还是需要“set hive.optimize.bucketmapjoin = true”)

    确保您的表确实在同一列上进行了分桶和排序。犯错太容易了。要获得分桶和排序表,您需要

    1. 设置 hive.enforce.bucketing=true;
    2. 设置 hive.enforce.sorting=true;
    3. DDL 脚本

      CREATE table XXX ( id int, name string ) CLUSTERED BY (id) SORTED BY (id) INTO XXX BUCKETS ; INSERT OVERWRITE TABLE XXX select * from XXX CLUSTER BY member_id ;

    使用describe formatted XXX 并查找Num Buckets, Bucket Columns, Sort Columns 以确保其设置正确。

    桶连接的其他要求是两个表应该有

    1. 在同一列上分桶的数据,它们在 ON 子句中使用。
    2. 一个表的桶数必须是另一表的桶数的倍数。

    如果您满足所有要求,则将执行 MAP 加入。而且速度会快如闪电。

    顺便说一下,SMB Map Join 在 Hive 1.X 中对 ORC 格式没有很好的支持。你会得到一个null exception。该错误已在 2.X 中修复。

    【讨论】:

    • 分区呢?分桶是否分别应用于每个分区?在这种情况下,我们将拥有出色的可扩展性:复杂性降低系数为P*B,其中每个分区的 P=#partitions 和 B=#buckets。
    • 我没有尝试,但我认为它也应该适用于分区,因为分区只是一个包含实际数据文件的路径/目录,将被分桶。
    • 阅读更多内容后 - 是的,它应该应用于每个分区:例如 into 64 buckets 将应用于 每个 分区
    • 是的,正确!每个分区都有指定数量的桶。因此,假设分区键列有 10 个不同的分区值,并且您将存储桶的数量定义为 128,那么您总共将有 1280 个文件夹代表您的整个数据集!
    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多