当 Pyspark UDF 的 return 语句中的 func 调用没有返回输出

Posted

技术标签:

【中文标题】当 Pyspark UDF 的 return 语句中的 func 调用没有返回输出【英文标题】:When func call in return statement of Pyspark UDF no output returned 【发布时间】:2018-06-22 09:25:03 【问题描述】:

我正在尝试在 Pyspark DataFrame 中对 ArrayType col 进行排序。 以下是 不提供任何输出的 pyspark 代码:

from operator import itemgetter
from pyspark.sql.functions import *
from pyspark.sql.types import *

def sort_data_array(row):
    return sorted(row, key=itemgetter(1))
# sorting the ArrayType cols according to ascending order of 1st index elems of inner lists

df1 = spark.createDataFrame([[1,[[3,2,3], [1,5,4], [5,6,6]]], [2,[[12,3,6], [9,5,1], [5,3,1]]]], StructType([StructField('_1', IntegerType()), StructField('_2', ArrayType(ArrayType(IntegerType())))]))
sorting_udf = udf(sort_data_array, ArrayType(ArrayType(IntegerType())))
df1 = df1.withColumn('sorted_2', sorting_udf(df1['_2']))
df1.take(2)

当我进行此更改时此代码运行并提供所需的输出:

def sort_data_array(row):
    sorted_row = sorted(row, key=itemgetter(1))
    return sorted_row

为什么会这样?

【问题讨论】:

两个代码示例给出相同的结果。 [Row(_1=1, _2=[[3, 2, 3], [1, 5, 4], [5, 6, 6]], sorted_2=[[None, None, None], [None, None , 无], [无, 无, 无]]), 行(_1=2, _2=[[12, 3, 6], [9, 5, 1], [5, 3, 1]], sorted_2= [[无,无,无],[无,无,无],[无,无,无]])] 这是由于整数类型在 udf 输出中被转换为 Double。请立即重试。 【参考方案1】:

请在函数中更改索引,

def sort_data_array(row):
    return sorted(row, key=itemgetter(0)) # 0 index

现在输出是:

[Row(_1=1, _2=[[3, 2, 3], [1, 5, 4], [5, 6, 6]], sorted_2=[[1, 5, 4], [3, 2, 3], [5, 6, 6]]), 

Row(_1=2, _2=[[12, 3, 6], [9, 5, 1], [5, 3, 1]], sorted_2=[[5, 3, 1], [9, 5, 1], [12, 3, 6]])]

【讨论】:

以上是关于当 Pyspark UDF 的 return 语句中的 func 调用没有返回输出的主要内容,如果未能解决你的问题,请参考以下文章

如何将标量 Pyspark UDF 转换为 Pandas UDF?

Pyspark UDF 中自定义 Python 对象的使用

在 pandas udf pyspark 中使用 numpy

在 pyspark 中使用 UDF 和简单数据帧

何时使用 UDF 与 PySpark 中的函数? [复制]

PySpark UDF 测试从 String 到 Int 的转换