我试图使用SparkContext.binaryFiles函数来处理一组ZIP文件。设置是从文件名的RDD映射,其中映射函数使用binaryFiles函数。
问题是映射函数中引用了SparkContext,我得到了这个错误。我怎么才能修好它?
PicklingError:无法序列化对象:异常:似乎您试图从广播变量、操作或转换引用SparkContext。SparkContext只能在驱动程序上使用,而不能在它在工作人员上运行的代码中使用。有关更多信息,请参见火花-5063。
样本代码:
file_list_rdd.map(lambda x: sc.binaryFiles("/FileStore/tables/xyz/" + x[1]))
其中file_list_rdd是(id,filename)元组的RDD。
发布于 2018-08-27 07:16:35
看起来,您需要调用该函数而不引用星火上下文--如果这确实适用的话。
还可以考虑将函数/ def移动到map body语句本身。这通常是这样做的--我们使用的是函数式语言。我一直无法解决序列化错误,除非我诉诸上述,并移动防御到执行者逻辑。
一些文件处理也是通过驱动程序完成的。这篇文章可能会引起人们的兴趣: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。
https://stackoverflow.com/questions/52033611
复制相似问题