优化配置单元中的多个连接

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 Bone B to many Cone C to many D 并且您同时加入它们,那么显然这种加入会导致大量行乘法。 这是很正常的连接行为。假设A 有 10 个键,BA 中每个键有 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 中的配置单元查询

优化MyBatis配置文件中的配置

nginx.conf 配置及基本优化

转MyBatis学习总结——优化MyBatis配置文件中的配置

MyBatis——优化MyBatis配置文件中的配置