Pyspark SparkContext只能在驱动程序上使用

Pyspark SparkContext只能在驱动程序上使用,pyspark,Pyspark,我正在尝试使用SparkContext.binaryFiles函数来处理一组ZIP文件。设置是从文件名的RDD映射,其中映射函数使用binaryFiles函数 问题是映射函数中引用了SparkContext,我得到了这个错误。我怎样才能修好它 PicklingError:无法序列化对象:异常:似乎您正试图从广播变量、操作或转换引用SparkContext。SparkContext只能在驱动程序上使用,不能在工作程序上运行的代码中使用。有关更多信息,请参阅SPARK-5063 示例代码: file

我正在尝试使用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\u list\u rdd
是(id,filename)元组的rdd。

您似乎需要调用函数而不引用spark上下文-如果这确实适用

还考虑将函数/DEF移动到映射体语句本身。这是很常见的——我们使用的是函数式语言。我一直无法解决序列化错误,除非我使用上述方法并将def移到Executor逻辑

一些文件处理也通过驱动程序完成。这篇文章可能很有趣:。根据您的代码片段,我将在这里看到这一点

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

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

现在,您正在从驱动程序和sc使用它。

实际上,在实际世界中。我们很少(几乎不)将SparkContext对象从驱动程序传输到工作者。那你为什么要这么做呢?那是因为binaryFiles函数只在SparkContext类中可用。。。请看你能分享一些代码吗。这是一个需要考虑的问题。用样本代码更新问题。我认为我的问题是我想要有两个级别——对于顶级RDD中的每一行,我想要创建一个新的RDD。但是,创建RDD的唯一方法是使用SparkContext,但是我不能在那里使用SparkContext…任何值,答案是?非常确定这是不可能的,并且您会得到一个错误。请看我发送的链接,我建议。SparkContext只能用于驱动程序。当您调用map时,您是在执行器上。我发送给您的链接运行并行收集,并从驱动程序调用,还执行一些压缩操作。我和那个人讨论了这个问题,因为这就是问题的症结所在。这是正确的方法。更新的答案。很高兴能提供帮助