我的应用程序读取一个大的镶木地板文件并执行一些数据提取以获得一个小的spark数据帧对象。该数据帧的所有内容必须出现在每个执行器节点上,以用于下一个计算阶段。我知道我可以通过收集广播来实现这一点,就像在这个pyspark片段中一样
sc = pyspark.SparkContext()
sqlc = HiveContext(sc)
# --- register hive tables and generate spark dataframe
spark_df = sqlc.sql('sql statement')
# collect spark dataframe contents into a Pandas dataframe at the driver
global_df = spark_df.toPandas()
# broadcast Pandas dataframe to all the executor nodes
sc.broadcast(global_df)
我只是想知道:有没有更有效的方法来做到这一点?看起来这种模式会使驱动程序节点陷入瓶颈。
答案 0 :(得分:0)
这取决于您对小型数据帧的需求。如果你需要加入大型的,那么Spark可以优化这种连接自动广播小数据帧。可以广播的数据帧的最大大小由 spark.sql.autoBroadcastJoinThreshold 选项配置,如文档http://spark.apache.org/docs/latest/sql-programming-guide.html#other-configuration-options中所述