我当前的工作是使用sparksql/scala创建etl流程,使用spark2.2和hive支持(所有表都在hivewarehouse/hdfs上)。
一个特定的过程需要将一个具有1b个唯一记录的表与另一个具有5b个唯一记录的表连接起来。
连接键是倾斜的,从某种意义上说,一些键的重复次数比其他键多,但是我们的配置单元没有配置为按该字段倾斜,在当前的cenario中也不可能实现这一点。
目前,我将每个表读入两个单独的Dataframe,并在它们之间执行连接。在5b表上尝试了内部连接和右外部连接,以查看是否有任何性能提升(之后我会删除记录为空的行)。无法注意到一个,但它可能是由群集不稳定引起的(我不确定正确的连接是否需要比内部连接更少的洗牌)
通过创建临时视图并在5b表的select语句中添加where子句,尝试从5b表的1b表中筛选密钥,但仍然没有注意到任何性能提高(obs:无法从1b表中收集唯一密钥,因为它将触发内存异常)。我们也尝试过在一个sql查询上完成整个操作,但同样没有成功。
我读过一些人谈论创建pairdd和使用hashpartitioner执行partitionby,但是随着dataframes的发布,这似乎已经过时了。现在,我正在寻找一些可靠的指南来处理这两个非常大的数据集的连接。
编辑:这里有一个答案和我遇到的问题差不多,但它已经2年了,它只是告诉我首先加入一组广播的记录,这些记录对应于重复次数很多的键,然后再与其他记录执行另一个连接,合并结果。这仍然是解决我问题的最佳方法吗?两张table上的钥匙都歪了
暂无答案!
目前还没有任何答案,快来回答吧!