Dataproc: functools.partial no attribute '__module__' error for pyspark UDF



我正在使用GCP/Dataproc进行一些火花/图框计算。

在我的私有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

在主功能中,functools.partial在普通情况下工作良好,正如我们所期望的:

# see whether partial works as it is
square = partial(power, exponent=2)
print "*** Partial test = ", square(2)

但是,如果我把这个partial(power, exponent=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].

===========

我的独立集群没有这种问题。我的星火组版本是2.1.1。GCP数据处理程序是2.2.x

任何人都能认出是什么阻止我将partial函数传递给UDF?

正如评论中所讨论的,这个问题与spark 2.2有关。而且,由于spark 2.3也受到Dataproc的支持,因此在创建集群时只需使用--image-version=1.3就可以修复它

最新更新