我目前的工作是使用Spark 2.2和Hive支持使用Spark 2.2创建ETL进程(所有表都在Hive仓库/ HDFS上)。
一个特定的过程需要将具有1b个唯一记录的表与另一个5b唯一记录连接起来。
连接键是倾斜的,因为某些键的重复方式比其他键重复,但我们的Hive没有配置为偏向该字段,也不可能在当前的cenario中实现。
目前,我将每个表读入两个独立的数据帧,并在它们之间执行连接。尝试在5b表上进行内连接和右外连接,看看是否有任何性能提升(之后我删除了带有空记录的行)。无法注意到一个,但它可能是由于集群不稳定造成的(我不确定正确的连接是否需要比内部连接更少的改组)
尝试通过创建临时视图并在5b表的select语句中添加where子句来过滤5b上的1b表中的键,但仍然无法注意到任何性能提升(obs:it&#39) ;不能从1b表中收集唯一键,因为它会触发内存异常)。还试过在一个SQL查询上做了整个事情,但是再次,没有运气。
我读过一些人谈论创建PairRDD并使用hashPartitioner执行partitionBy,但这似乎已经过时了数据帧的发布。现在,我正在寻找一些可靠的指导来处理这两个非常大的数据集的连接。
编辑那里有一个答案here几乎可以解决我遇到的同样问题,但它已经2年了,只是告诉我首先加入一个广播的记录集,这些记录对应于重复的密钥,然后与其余记录执行另一个联接,并将结果合并。这仍然是解决我问题的最佳方法吗?我在两张桌子上都有歪斜的键