配置单元中的多表联接

5cnsuln7  于 2021-05-30  发布在  Hadoop
关注(0)|答案(2)|浏览(339)

我已将teradata表的数据迁移到hive中。
现在我必须在导入的数据之上构建摘要表。摘要表需要从五个源表构建
如果我使用联接,我将需要联接五个表,在hive中是否可能?或者我应该把这个问题分成五个部分?对于这个问题,什么样的方法是可取的?
请建议

sauutmhj

sauutmhj1#

是的,您可以在一个查询中联接多个表。这使得配置单元有很多机会进行优化,如果将其分解为单独的查询,则无法完成这些优化。

xxls0lw8

xxls0lw82#

Hive中的五路连接当然是可能的,而且(自然地)也可能是缓慢到非常缓慢的。
您应该考虑对上的表进行共分区
相同的分区列
相同数量的分区
其他选项包括提示。例如,考虑其中一张table是大的,其他的是小的。然后您可以使用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的键的特定值被缓冲在reducer的内存中。然后,对于从中检索到的每一行,使用缓冲行计算联接。如果省略streamtable提示,则配置单元将对联接中最右边的表进行流式处理。
另一个提示是mapjoin,它有助于在内存中缓存小表。
假设a很大,而b、c、d、e足够小,可以放入每个Map器的内存中:

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)

相关问题