bigdata—优化多连接配置单元

gzszwxb4  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(373)

我有四张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(一对多外键关系)的父级
现在我必须加入这些表格;连接这些表的最佳方法是什么
我需要用a,b,c,d的列创建一个表e,a,b,c的列中的重复值可以

2w2cym1i

2w2cym1i1#

表相当大,在这种情况下,map join不是一个选项。如果 one A to many B 以及 one B to many C 以及 one C to many D 同时连接它们,很明显这样的连接会导致大量的行乘法。这是很正常的连接行为。说如果 A 有10把钥匙和 B 中每个键有100行 A 那么加入他们之后 10 x 100 = 1000 行(如果join键在 A 是唯一的),如果加入 A 不是唯一的。这将导致join reducer上的大量数据集。
我想您的最终目标是聚合行。在这种情况下,最好的方法是将行预聚合到所需的粒度,并连接聚合的数据集:

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...
rnmwe5a2

rnmwe5a22#

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

相关问题