优化配置单元中的多个连接
Posted
技术标签:
【中文标题】优化配置单元中的多个连接【英文标题】:Optimising multiple join in hive 【发布时间】:2018-06-04 11:12:39 【问题描述】:我有 4 个四个 Hive 表:
A - 1.2 billion records and 250 GB
B - 4 billion records and 1 TB
C - 30 billion records and 2 TB
D - 2 billion records and 100 GB
所有表都没有分区 A 是 B 的父级(一对多外键关系),B 是 C 的父级(一对多外键关系),C 是 D 的父级(一对多外键关系)
现在我必须加入这些表格;加入这些表格的最佳方法是什么
我需要创建一个表 E,其中 A、B、C、D 的列在 A、B、C 的列中重复值是可以的
【问题讨论】:
我猜 hive 有能力自行优化连接。它有一个类似set hive.auto.convert.join = true
的配置设置not only converts joins to mapjoins but also merges MJ* patterns as much as possible
【参考方案1】:
表相当大,在这种情况下,地图连接不是一个选项。
如果one A to many B
和one B to many C
和one C to many D
并且您同时加入它们,那么显然这种加入会导致大量行乘法。
这是很正常的连接行为。假设A
有 10 个键,B
在A
中每个键有 100 行,那么在加入它们之后它将是 10 x 100 = 1000
行(如果 A
中的加入键是唯一的),如果加入键则更多在A
中不是唯一的。这导致连接缩减器上的数据集很大。
我想你的最终目标是聚合行。在这种情况下,最好的方法是将行预聚合到所需的粒度并连接聚合数据集:
select A.*, B.* --aggregate here if necessary
(select <some aggregation here > from A group by <key> ) A
join
(select <some aggregation here > from B group by <key> ) B
on A.key=B.key
and so on...
【讨论】:
遗憾的是我不需要在最终结果中进行任何聚合;我必须用 A,B,C,D 的一些列制作一个表 E。 A、B、C 可接受重复值【参考方案2】:不确定这是否是最好的方法。 我已经为在一个公共列上分区的所有表创建了中间分区表。 现在对于每个分区,我已经增量地运行连接查询。
【讨论】:
以上是关于优化配置单元中的多个连接的主要内容,如果未能解决你的问题,请参考以下文章
在 regexp_like 中组合 like 和 not like 以优化 Amazon Athena 中的配置单元查询