Pyspark UDF AttributeError:“NoneType”对象没有属性“_jvm”

Posted

技术标签:

【中文标题】Pyspark UDF AttributeError:“NoneType”对象没有属性“_jvm”【英文标题】:Pyspark UDF AttributeError: 'NoneType' object has no attribute '_jvm' 【发布时间】:2018-04-13 16:18:48 【问题描述】:

我有一个udf函数:

@staticmethod
@F.udf("array<int>")
def create_users_array(val):
    """ Takes column of ints, returns column of arrays containing ints. """ 
    return [val for _ in range(val)]

我这样称呼它:

df.withColumn("myArray", create_users_array(df["myNumber"]))

我向它传递一个整数数据框列,它返回该整数的数组。

例如 4 --&gt; [4,4,4,4]

在我们从 Python 2.7 升级并升级我们的 EMR 版本(我相信它使用 Pyspark 2.3)之前它一直有效

有人知道这是什么原因吗?

【问题讨论】:

请发帖minimal reproducible example。看起来您至少混合了不同的DataFramesdf_aggdf)并且使用类需要非常小心。并且udf 你发布的单独工作正常。 抱歉,错误地复制了代码(将 df_agg 更改为 df 这段代码仍然无法重现。 @user9613318 好吧,您必须设置一个与我的配置相同的 EMR 集群,所以它不容易“重现”。不过我修好了;在下面回答。 【参考方案1】:

看起来这与新版本中对 UDF 的改进有关(或者更确切地说,是旧语法的弃用)。更改 udf 装饰器对我有用。 @F.udf("array&lt;int&gt;") --> @F.udf(ArrayType(IntegerType()))

【讨论】:

以上是关于Pyspark UDF AttributeError:“NoneType”对象没有属性“_jvm”的主要内容,如果未能解决你的问题,请参考以下文章

SparkSession 中的 udf 和 pyspark.sql.functions 中的 udf 有啥区别

在 PySpark 中重新加载 UDF

pyspark 的用户定义函数 (UDF) 是不是需要单元测试?

Pyspark:访问 UDF 中行内的列

为啥运行 pandas_udf 时 Pyspark 失败?

为啥 pySpark 无法仅运行 udf 函数?