【发布时间】:2015-05-15 17:19:09
【问题描述】:
我已将 Teradata 表的数据迁移到 hive 中。
现在我必须在导入的数据之上构建汇总表。汇总表需要从五个源表构建
如果我使用连接,我需要连接五个表,这可能在 hive 中吗?还是我应该将查询分成五个部分? 对于这个问题应该采取什么建议的方法?
请推荐
【问题讨论】:
标签: hadoop hive teradata sqoop
我已将 Teradata 表的数据迁移到 hive 中。
现在我必须在导入的数据之上构建汇总表。汇总表需要从五个源表构建
如果我使用连接,我需要连接五个表,这可能在 hive 中吗?还是我应该将查询分成五个部分? 对于这个问题应该采取什么建议的方法?
请推荐
【问题讨论】:
标签: hadoop hive teradata sqoop
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)
【讨论】:
是的,您可以在单个查询中join multiple tables。这为 Hive 提供了很多机会来进行优化,如果您将其分解为单独的查询则无法完成。
【讨论】: