通常我使用纱线客户端模式在驱动程序中使用不同版本的Python运行我的代码,而不是在工作节点中运行。
例如,我通常在驱动程序中使用python3.5,在工作程序中使用默认的python2.6,这非常有效。
我目前正处于需要致电
的项目中sqlContext.createDataFrame
但是这似乎试图在python中执行这个句子,然后我得到了在工作者中安装相同版本的python的要求,这是我想要避免的。
那么,对于使用“sqlContext.createDataFrame”,需要在驱动程序和工作程序中使用相同的python版本吗?
如果是这样,其他“纯”pyspark.sql api调用也会有这个要求吗?
谢谢, 何
答案 0 :(得分:1)
udf
或DataFrame.rdd.*
)都会触发相同的异常。答案 1 :(得分:1)
通常,许多pyspark操作只是在JVM上调用spark操作的包装器。对于这些操作,无论在worker中使用什么版本的python都没关系,因为在worker上没有执行python,只有JVM操作。
此类操作的示例包括从文件读取数据帧,所有内置函数都不需要python对象/函数作为输入等。
一旦函数需要一个实际的python对象或函数,这就变得有点棘手了。 例如,假设您要使用UDF并使用lambda x:x + 1作为函数。 Spark并不真正知道函数是什么。而是将它序列化并将其发送给依次反序列化的工作者。
要使此序列化/反序列化过程起作用,双方的版本需要兼容,而且通常不是这种情况(特别是在主要版本之间)。
所有这些都将我们引向了createDataFrame。例如,如果您使用RDD作为参数之一,则RDD将包含python对象作为记录,这些对象需要序列化和反序列化,因此必须具有相同的版本。