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 --> [4,4,4,4]
在我们从 Python 2.7 升级并升级我们的 EMR 版本(我相信它使用 Pyspark 2.3)之前它一直有效
有人知道这是什么原因吗?
【问题讨论】:
请发帖minimal reproducible example。看起来您至少混合了不同的DataFrames
(df_agg
和df
)并且使用类需要非常小心。并且udf
你发布的单独工作正常。
抱歉,错误地复制了代码(将 df_agg
更改为 df
)
这段代码仍然无法重现。
@user9613318 好吧,您必须设置一个与我的配置相同的 EMR 集群,所以它不容易“重现”。不过我修好了;在下面回答。
【参考方案1】:
看起来这与新版本中对 UDF 的改进有关(或者更确切地说,是旧语法的弃用)。更改 udf 装饰器对我有用。 @F.udf("array<int>")
--> @F.udf(ArrayType(IntegerType()))
【讨论】:
以上是关于Pyspark UDF AttributeError:“NoneType”对象没有属性“_jvm”的主要内容,如果未能解决你的问题,请参考以下文章
SparkSession 中的 udf 和 pyspark.sql.functions 中的 udf 有啥区别