Dataproc:functools.partial无属性'__模块';pyspark UDF的错误

Dataproc:functools.partial无属性'__模块';pyspark UDF的错误,pyspark,user-defined-functions,google-cloud-dataproc,functools,Pyspark,User Defined Functions,Google Cloud Dataproc,Functools,我正在使用GCP/Dataproc进行一些spark/graphframe计算 在我的私人spark/hadoop独立集群中, 我在定义pysparkUDF时使用functools.partial没有问题 但是,现在使用GCP/Dataproc,我有一个问题如下 下面是一些基本设置,用于检查partial是否工作正常 import pyspark.sql.functions as F import pyspark.sql.types as T from functools import part

我正在使用GCP/Dataproc进行一些spark/graphframe计算

在我的私人spark/hadoop独立集群中, 我在定义pysparkUDF时使用
functools.partial
没有问题

但是,现在使用GCP/Dataproc,我有一个问题如下

下面是一些基本设置,用于检查
partial
是否工作正常

import pyspark.sql.functions as F
import pyspark.sql.types as T
from functools import partial

def power(base, exponent):
    return base ** exponent
在main函数中,
functools.partial
在正常情况下运行良好,正如我们所期望的:

# see whether partial works as it is
square = partial(power, exponent=2)
print "*** Partial test = ", square(2)
但是,如果我把这个
partial(幂,指数=2)
函数放到PySparkUDF中,如下所示

testSquareUDF = F.udf(partial(power, exponent=2),T.FloatType())    
testdf = inputdf.withColumn('pxsquare',testSquareUDF('px'))
我收到以下错误消息:

Traceback (most recent call last):
  File "/tmp/bf297080f57a457dba4d3b347ed53ef0/gcloudtest-partial-error.py", line 120, in <module>
    testSquareUDF = F.udf(square,T.FloatType())
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/functions.py", line 1971, in udf
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/functions.py", line 1955, in _udf
  File "/opt/conda/lib/python2.7/functools.py", line 33, in update_wrapper
    setattr(wrapper, attr, getattr(wrapped, attr))

AttributeError: 'functools.partial' object has no attribute '__module__'

ERROR: (gcloud.dataproc.jobs.submit.pyspark) Job [bf297080f57a457dba4d3b347ed53ef0] entered state [ERROR] while waiting for [DONE].
回溯(最近一次呼叫最后一次):
文件“/tmp/bf297080f57a457dba4d3b347ed53ef0/gcloudtest partial error.py”,第120行,在
testSquareUDF=F.udf(square,T.FloatType())
文件“/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/functions.py”,第1971行,在udf中
文件“/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/functions.py”,第1955行,在_udf中
更新包装中第33行的文件“/opt/conda/lib/python2.7/functools.py”
setattr(包装,attr,getattr(包装,attr))
AttributeError:'functools.partial'对象没有属性'\uu\u模块''
错误:(gcloud.dataproc.jobs.submit.pyspark)作业[bf297080f57a457dba4d3b347ed53ef0]在等待[DONE]时进入状态[ERROR]。
=========

我的独立集群没有这种问题。 我的spark cluster版本是2.1.1。 GCP dataproc的是2.2.x


任何人都能认识到是什么阻止我将
部分
函数传递给UDF?

正如评论中所讨论的,was使用spark 2.2。而且,由于spark 2.3也是,在创建集群时只需使用
--image version=1.3

我发现spark 2.2在将
functools.partial
传递给UDF时存在一些问题。这是固定的释放火花2.3。因此,如果大量使用
partial
,请避免使用2.2。仅供参考,Dataproc也支持Spark 2.3:。创建集群时只需传递
--image version=1.3