多个表连接在配置单元中

时间:2015-03-13 09:20:39

标签: hadoop hive teradata sqoop

我已经迁移了Teradata桌子'数据进入蜂巢。

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

如果我选择加入,我需要加入五个表,是否有可能进入蜂巢?或者我应该分五个部分打破查询? 对于这个问题应该采取什么方法?

请建议

2 个答案:

答案 0 :(得分:11)

蜂巢中的五种连接当然是可能的,并且(自然地)可能慢到非常慢。

您应该考虑在

上共同划分表格
  • 相同的分区列
  • 相同数量的分区

其他选项包括提示。例如,考虑其中一个表是否很大而其他表是否较小。然后,您可以使用 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)

答案 1 :(得分:0)

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