Hadoop 配置单元中的多表联接

Hadoop 配置单元中的多表联接,hadoop,hive,teradata,sqoop,Hadoop,Hive,Teradata,Sqoop,我已将Teradata表的数据迁移到hive中 现在,我必须在导入的数据之上构建摘要表。汇总表需要从五个源表中构建 如果我使用联接,我将需要联接五个表,在hive中是否可能?或者我应该把这个问题分成五个部分? 对于这个问题,什么是可取的方法 请建议是的,您可以在单个查询中找到。这使得Hive有很多机会进行优化,如果将其分解为单独的查询,这些优化是无法完成的。当然,Hive中的五路连接是可能的,而且(自然)可能会变慢到非常慢 您应该考虑在上对表进行联合分区 相同的分区列 相同数量的分区 其他选

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

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

如果我使用联接,我将需要联接五个表,在hive中是否可能?或者我应该把这个问题分成五个部分? 对于这个问题,什么是可取的方法


请建议

是的,您可以在单个查询中找到。这使得Hive有很多机会进行优化,如果将其分解为单独的查询,这些优化是无法完成的。

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

您应该考虑在

上对表进行联合分区
  • 相同的分区列
  • 相同数量的分区
其他选项包括提示。例如,考虑其中一个表大而其他表小。然后,您可以使用streamtble提示

假设a很大:

改编自: :

所有五个表都连接在一个映射/减少作业中,并且 对于表b、c、d和e的键的特定值 缓冲在减速机的内存中。然后对于检索到的每一行 从中,使用缓冲行计算联接。如果 忽略STREAMTABLE提示,配置单元将流式处理中最右边的表 加入

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

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


嘿,谢谢!!我正在研究如何提高hive join的性能query@chhayavishwakarma . 是的-这个答案提供了这些方法。谢谢Jeremy Beard!!我正在研究如何提高配置单元连接查询的性能,以优化的方式进行此类连接的最佳实践是什么
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)
 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)