我知道当我们想要为一组RDD而不是单个RDD元素初始化一些资源时,理想情况下我们应该使用mapPartition和foreachPartition。例如,在为每个数据分区初始化JDBC连接的情况下。但是有些情况我们不应该使用它们中的任何一个而是使用普通的vanilla map()和foreach()转换和操作。
答案 0 :(得分:2)
当您编写使用mapPartition或foreachPartition的Spark作业时,您只需修改分区数据本身或仅分别遍历分区数据。作为参数传递的匿名函数将在执行程序上执行,因此没有可行的方法来执行调用所有节点的代码,例如:来自一个特定执行程序的df.reduceByKey。此代码只能从驱动程序节点执行。因此,只有驱动程序代码才能访问数据框,数据集和火花会话。
请查看here关于此问题和可能的解决方案的详细讨论