PySpark UDF Returns [Ljava.lang.Object;@]

PySpark UDF Returns [Ljava.lang.Object;@]

我有以下功能

from pyspark.sql.functions import udf, struct
from pyspark.sql.types import StringType, ArrayType

def f(row):
    .
    .
    .
    <compute my_field>
    print(f'my_field: {my_field}; type(my_field): {type(my_field)}')
    return str(my_field), StringType()


f_udf = udf(f)
new_df = df.withColumn('new_field', udf(struct([df[column] for column in df.columns if column != 'reserved']))

这是打印出来的示例 -

my_field: erfSSSWqd; type(my_field): <class 'str'>

这里是new_df

+--------------+----------------------------+
|field         |new_field                   |
+--------------+----------------------------+
|WERWERV511    |[Ljava.lang.Object;@280692a3|
|WEQMNHV381    |[Ljava.lang.Object;@3ee30d9c|
|FSLQCXV881    |[Ljava.lang.Object;@16cbf3a9|
|SDTEHLV980    |[Ljava.lang.Object;@54e6686 |
|SDFWERV321    |[Ljava.lang.Object;@72377b29|
+--------------+----------------------------+

但我希望 new_field 列中有字符串。 看起来类型没问题。事实上,我什至不需要用 str() 包裹 my_field,但我这样做是为了以防万一。

有人知道如何解决这个问题吗?

而不是 return 元组 str(my_field), StringType() 只有 return 值 str(my_field).

此外,您可以在此处指定 UDF 的 return 类型作为第二个参数

f_udf = udf(f,StringType())

让我知道这是否适合你。