【发布时间】:2016-07-25 22:14:50
【问题描述】:
我有一个 Hadoop 集群,我使用 Hive 进行查询,我想加入两个大表,其中一个有小桶,从我读到的内容看来,如果我将两个表都存储在 join-key 上,那将帮助性能。
所以我的设置是:
- 将连接键上的两个表分桶到相同数量的桶中,
- 较小的表的存储桶适合内存,
- 设置 hive.optimize.bucketmapjoin = true;
- 运行以下查询:
SELECT /*+ MAPJOIN(a) */
count(*)
FROM a JOIN B ON a.join_key = b.join_key;
问题一:以上设置是否足以触发bucket map join?
问题2:我对bucket map join的理解是,它启动一个本地任务,创建每个bucket的hash表,然后将hashed buckets上传到每个mapper。这种理解正确吗?
问题3:如果上面的理解正确,那为什么Hive会在本地做hash呢?为什么它不上传raw bucket然后在map任务中进行hash,从而实现并行处理和更快的速度?
【问题讨论】: