【发布时间】:2018-09-30 16:06:25
【问题描述】:
我的问题如下:
我有一个名为
details的大型数据框,其中包含 900K 行,另一个包含 80M 行,名为attributes。两者都有一个列
A,我想在该列上进行左外连接,左侧数据框为deatils。在数据框
details的列A中只有 75K 唯一条目。数据框attributes80M 列A中的唯一条目。
实现join 操作的最佳方法是什么?
我尝试了什么?
简单的连接,即
details.join(attributes, "A", how="left_outer")只是超时(或内存不足)。-
由于
details中的A列中只有75K 唯一条目,我们不关心attributes中数据框中的其余部分。因此,首先我使用以下过滤器进行过滤:uniqueA = details.select('A').distinct().collect() uniqueA = map(lambda x: x.A, uniqueA) attributes_filtered = attributes.filter(attributes.A.isin(*uniqueA))我认为这会成功,因为
attributes表从 80M 行减少到仅 75K 行。但是,完成join仍然需要很长时间(而且永远不会完成)。 -
接下来,我以为分区太多了,要join的数据不在同一个分区上。虽然,我不知道如何将所有数据带到同一个分区,但我认为重新分区可能会有所帮助。就这样吧。
details_repartitioned = details.repartition("A") attributes_repartitioned = attributes.repartition("A") -
上述操作将
attributes中的分区数从70K减少到200个。details中的分区数约为1100。details_attributes = details_repartitioned.join(broadcast( attributes_repartitioned), "A", how='left_outer') # tried without broadcast too
毕竟,join 仍然不起作用。我仍在学习 PySpark,所以我可能误解了重新分区背后的基本原理。如果有人能阐明这一点,那就太好了。
附:我已经看过this 的问题,但这并不能回答这个问题。
【问题讨论】:
标签: python apache-spark dataframe pyspark bigdata