【发布时间】:2019-07-01 22:38:55
【问题描述】:
我们有多个数据框。
其中一个数据框是主数据框,它使用左外连接与其他数据框连接。 所有这些数据框都连接在 4 列上(比如 col1、col2、col3、col4)。
为了减少数据混洗,目前我们正在重新分区 4 个连接列上的所有数据帧,然后连接这些数据帧(左外)。
有没有更好的方法来加入/重新分区这些数据帧,以使数据洗牌最少?
谢谢
【问题讨论】:
标签: apache-spark apache-spark-sql
我们有多个数据框。
其中一个数据框是主数据框,它使用左外连接与其他数据框连接。 所有这些数据框都连接在 4 列上(比如 col1、col2、col3、col4)。
为了减少数据混洗,目前我们正在重新分区 4 个连接列上的所有数据帧,然后连接这些数据帧(左外)。
有没有更好的方法来加入/重新分区这些数据帧,以使数据洗牌最少?
谢谢
【问题讨论】:
标签: apache-spark apache-spark-sql
重新分区不会避免洗牌,它会优化连接。如果您的两个数据框都很大并且不够小以适合广播哈希连接的内存..您可以将您的数据框保存为分桶表,然后可以执行排序合并连接。这样,您可以跳过通常在加入两个大数据帧之前发生的排序阶段 shuffle。请参阅下面的链接Spark join *without* shuffle 这种技术仅在您必须多次加入相同的数据帧时才有用。因为对这些表进行分桶也会导致Spark 应用程序的一些开销。
【讨论】:
我的帖子回复晚了。 我们最终使用了广播。
我们从两个数据帧中删除了重新分区,并广播了较小的数据帧。
【讨论】: