【问题标题】:Multiple table join in hive蜂巢中的多表连接
【发布时间】:2015-05-15 17:19:09
【问题描述】:

我已将 Teradata 表的数据迁移到 hive 中。

现在我必须在导入的数据之上构建汇总表。汇总表需要从五个源表构建

如果我使用连接,我需要连接五个表,这可能在 hive 中吗?还是我应该将查询分成五个部分? 对于这个问题应该采取什么建议的方法?

请推荐

【问题讨论】:

    标签: hadoop hive teradata sqoop


    【解决方案1】:

    hive 中的五路连接当然是可能的,而且(自然)可能会慢到非常慢。

    您应该考虑在

    上对表进行共同分区
    • 相同的分区列
    • 分区数相同

    其他选项包括提示。例如,考虑其中一张桌子很大而其他桌子很小。然后您就可以使用 streamtble 提示

    假设 a 很大:

    SELECT /*+ STREAMTABLE(a) */ a.val, b.val, c.val, d.val, e.val 
    FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1) join d on (d.key = c.key) join e on (e.key = d.key)
    

    改编自:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins :

    所有五个表都连接到一个 map/reduce 作业中,并且值 对于表 b、c、d 和 e 的键的特定值是 缓冲在减速器的内存中。然后对于检索到的每一行 从 a 开始,连接是用缓冲的行计算的。如果 省略STREAMTABLE 提示,Hive 流式传输最右边的表 加入。

    另一个提示是 mapjoin,它有助于在内存中缓存小表。

    假设 a 很大,b,c,d,e 小到足以放入每个映射器的内存中:

     SELECT /*+ MAPJOIN(b,c,d,e) */  a.val, b.val, c.val, d.val, e.val 
     FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1) 
     join d on (d.key = c.key) join e on (e.key = d.key)
    

    【讨论】:

    • 嘿,谢谢!!我正在研究如何提高 hive 连接查询的性能
    • @chhayavishwakarma 。是的 - 这个答案提供了这些方法。
    【解决方案2】:

    是的,您可以在单个查询中join multiple tables。这为 Hive 提供了很多机会来进行优化,如果您将其分解为单独的查询则无法完成。

    【讨论】:

    • 感谢杰里米·比尔德!我正在研究如何提高 hive 连接查询的性能,以优化方式进行此类连接的最佳实践是什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多