PySpark自定义UDF返回[Ljava.lang.Object;@ 无法得到预期字符串如何修复
错误原因分析
你的代码存在3处核心问题,共同导致了返回对象地址而非字符串的问题:
- 自定义函数
f的返回值错误:你当前返回的是(str(my_field), StringType())二元组,而非预期的单个字符串值。StringType()是用来声明UDF返回类型的类,不应该作为函数返回值的一部分,返回二元组会被PySpark识别为数组类型。 - 注册UDF时没有显式指定返回类型,PySpark无法正确映射Python返回值到Spark数据类型,会默认使用通用对象类型处理。
- 调用UDF时没有使用已经注册好的
f_udf,反而重复调用udf()方法生成了匿名UDF,进一步导致类型映射失效。
修复后的完整代码
from pyspark.sql.functions import udf, struct from pyspark.sql.types import StringType def f(row): # 原有计算逻辑保持不变 <compute my_field> print(f'my_field: {my_field}; type(my_field): {type(my_field)}') # 仅返回计算得到的字符串值即可,不要附带StringType() return str(my_field) # 注册UDF时显式指定返回类型为StringType f_udf = udf(f, returnType=StringType()) # 调用时使用已经注册好的f_udf,不要重复调用udf()方法 new_df = df.withColumn('new_field', f_udf(struct([df[column] for column in df.columns if column != 'reserved'])))
验证方式
修复完成后可执行new_df.printSchema()确认new_field字段类型为string,再调用new_df.show()即可看到正常的字符串输出。
内容的提问来源于stack exchange,提问作者Joe Shmo
相关产品推荐
相关产品推荐

