我有一个 Hadoop 集群,我使用 Hive 进行查询,我想加入两个大表,其中一个有小桶,从我读到的内容看来,如果我将两个表都存储在连接键上,这将有助于提高性能.
所以我的设置是:
- 将连接键上的两个表分桶到相同数量的桶中,
- 较小的表的存储桶适合内存,
- 设置 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呢?为什么它不上传原始桶然后在map任务中进行散列,从而实现并行处理和更快的速度?