在我的例子中,我有一个小的DataFrame small_df
和一个大的DataFrame big_df
,我想在它们之间执行一个连接-
big_df.join(small_df, 'id', 'left_semi')
为了使过程更高效,我想广播small_df
,但我看到有两个选项-
1. big_df.join(pyspark.sql.functions.broadcast(small_df), 'id', 'left_semi')
2. big_df.join(sc.broadcast(small_df).value, 'id', 'left_semi')
正确的方法是什么?它们之间的区别是什么?
另外,如果我理解正确的话,为了使用sc.broadcast
,我需要调用collect
,对吗?因为否则,我会得到一个关于使用SparkContext的异常,因为它不是来自驱动程序。
1条答案
按热度按时间pcww981p1#
从pyspark docu:
Docu用于SC广播
因此,第一个更像是对Catalyst的提示,即应该使用广播连接来连接此df,即使通常算法更喜欢sort-merge连接
如果你想了解更多关于连接提示的信息,这里有一个来自Spark代码的示例注解,它描述了这个行为和其他连接提示
第二个选项创建广播变量,这就是为什么你必须收集它(因为它需要是值而不是 Dataframe )有趣的是,当你使用广播加入你的df也将被收集到驱动程序,因为这是广播现在在Spark中的工作方式
在您的情况下,您应该使用pyspark.sql.functions.broadcast(df)。当您希望在每个执行器中提供一些变量的副本以供其他处理时(例如,如果您希望在每个执行器上有一些小的元数据),而不是在连接期间使用pyspark. broadcast,因此最好使用hint