当 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?