【问题标题】: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 bigdata hiveql hadoop2


【解决方案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】:

不确定这是否是最好的方法。 我已经为在一个公共列上分区的所有表创建了中间分区表。 现在对于每个分区,我已经增量地运行连接查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2018-10-30
    • 1970-01-01
    相关资源
    最近更新 更多