如何处理不同类型的PySpark UDF返回值?

时间:2020-01-23 02:00:54

标签: list dataframe pyspark typeerror user-defined-functions

我有一列数据框。在此数据帧的每一行中,都有一个列表。例如:

df = spark.createDataFrame(
    [
        [[13,23]],
        [[55,65]],
    ],
    ['col',]
)

然后,我定义了一个UDF,它基本上将1加到列表的第一个数字,并将1.5加到列表的第二个数字。

def calculate(mylist) :
  x = mylist[0] + 1
  y = mylist[1] + 1.5
  return x,y

问题是,当我将此函数应用于数据框时,它返回X值,但不返回Y值。 我认为这是因为Y值不是整数。 这就是我这样做的方式。

import pyspark.sql.functions as F
from pyspark.sql.types import IntegerType, ArrayType
func = F.udf(lambda x: calculate(x), ArrayType(IntegerType()))
df.withColumn('vals', func('col')).show()

如何获取Y值和X值?为了简化理解和解决,我简化了UDF和示例数据框。

1 个答案:

答案 0 :(得分:1)

计算udf返回integer,并返回给定输入的float类型。 如果用例的第一个值为整数,第二个值为float,则可以返回StructType

如果两者都需要使用相同的类型,则可以使用相同的代码并更改返回两个整数的计算udf

func = F.udf(lambda x: calculate(x), T.StructType(
        [T.StructField("val1", T.IntegerType(), True),
         T.StructField("val2", T.FloatType(), True)]))
相关问题