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)
2条答案
按热度按时间sauutmhj1#
是的,您可以在一个查询中联接多个表。这使得配置单元有很多机会进行优化,如果将其分解为单独的查询,则无法完成这些优化。
xxls0lw82#
Hive中的五路连接当然是可能的,而且(自然地)也可能是缓慢到非常缓慢的。
您应该考虑对上的表进行共分区
相同的分区列
相同数量的分区
其他选项包括提示。例如,考虑其中一张table是大的,其他的是小的。然后您可以使用streamtble提示
假设a很大:
改编自:https://cwiki.apache.org/confluence/display/hive/languagemanual+joins :
所有五个表都连接在一个map/reduce作业中,表b、c、d和e的键的特定值被缓冲在reducer的内存中。然后,对于从中检索到的每一行,使用缓冲行计算联接。如果省略streamtable提示,则配置单元将对联接中最右边的表进行流式处理。
另一个提示是mapjoin,它有助于在内存中缓存小表。
假设a很大,而b、c、d、e足够小,可以放入每个Map器的内存中: