SparkContext只能在驱动程序上使用

时间:2018-08-27 06:25:35

标签: pyspark

我正在尝试使用SparkContext.binaryFiles函数来处理一组ZIP文件。设置是从文件名的RDD中进行映射,其中映射函数使用binaryFiles函数。

问题是在映射函数中引用了SparkContext,并且出现此错误。我该如何解决?

PicklingError:无法序列化对象:异常:似乎您正在尝试从广播变量,操作或转换引用SparkContext。 SparkContext只能在驱动程序上使用,而不能在工作程序上运行的代码中使用。有关更多信息,请参阅SPARK-5063。

示例代码:

file_list_rdd.map(lambda x: sc.binaryFiles("/FileStore/tables/xyz/" + x[1]))

其中file_list_rdd是(id,文件名)元组的RDD。

1 个答案:

答案 0 :(得分:0)

您似乎需要在不引用spark上下文的情况下调用该函数-并且如果实际可行的话。

还可以考虑将函数/ def移到地图主体语句本身中。通常是这样-我们正在使用一种功能语言。除非我采取上述措施并将def移至Executor逻辑,否则我将无所适从来解决序列化错误。

某些文件处理也通过驱动程序完成。该帖子可能很有趣:How to paralelize spark etl more w/out losing info (in file names)。根据您的代码段,我将在这里查看。

您应该使用类似的方法并进行相应处理:

 zip_data = sc.binaryFiles('/user/path-to-folder-with-zips/*.zip')

现在您可以在驱动程序和sc中使用它。