2013-10-20 40 views
3

Hive实现的默认MapReduce连接算法是什么?它是一个地图端加入,减少端,广播加入等?Apache Hive使用的默认MapReduce连接是什么?

它不是在原来的文件规定,也没有对蜂巢维基联接:

http://cs.brown.edu/courses/cs227/papers/hive.pdf
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins

+0

哪个Hive版本?在哪种配置下(例如'hive.auto.convert.join'是true还是false?) –

+0

Hive 0.12.0。 hive.auto.convert.join设置为true。 – Ace

回答

8

“默认”连接将是洗牌连接,又名。作为共同连接。请参阅JoinOperator.java。它依靠M/R shuffle来分割数据,并在Reduce端完成连接。正如洗牌过程中的数据大小复制一样,速度很慢。

更好的选择是MapJoin,请参阅MapJoinOpertator.java。如果你只有一个大表和一个或多个小表加入(例如,典型的星型模式),这将起作用。首先扫描小表,然后构建散列表并将其上载到HDFS缓存中,然后启动M/R作业,只需要拆分一个表(大表)即可。比shuffle join更高效,但要求小表适合M/R map任务的内存。通常Hive(至少从0.11开始)会尝试使用MapJoin,但它取决于你的配置。

专门的连接是bucket-sort-merge连接,又名。 SMBJoin,参见SMBJoinOperator.java。如果您有两个大表匹配连接键上的bucketing,则此功能可用。然后可以安排M/R作业拆分,以便地图任务触发器仅拆分形成保证在连接键上重叠的两个大表,以便地图任务可以使用散列表执行连接。

还有更多的细节,如倾斜连接支持和内存不足条件下的回退,但这可能会让您开始调查您的需求。

关于连接主题的非常好的演示文稿是Join Strategies in Hive。请记住,事情发展迅速,从2011年的一个呈现是有点过时。

+0

谢谢。和我想的一样。如果其中一个表很小,那么只能在地图一侧完成连接(MapJoin)。但是,我的表格非常大(1 TB +),无法使用MapJoin。因此,我假设我的查询使用了通用连接(Reduce-side连接)。 – Ace

4

请在蜂巢查询的explain,你可以看到执行计划。

相关问题