具有多个参数的PySpark UDF返回null

时间:2018-09-26 04:04:42

标签: apache-spark dataframe pyspark

我有一个带有两列(类型为A的{​​Bdouble)的PySpark数据帧,其值为0.01.0。 我试图添加一个新列,这是这两个的总和。 我遵循了Pyspark: Pass multiple columns in UDF

中的示例     
import pyspark.sql.functions as F
from pyspark.sql.types import IntegerType, StringType
sum_cols = F.udf(lambda x: x[0]+x[1], IntegerType())
df_with_sum = df.withColumn('SUM_COL',sum_cols(F.array('A','B')))
df_with_sum.select(['SUM_COL']).toPandas()

这显示了一系列NULL而不是我期望的结果。

我尝试了以下任何一种方法,以查看数据类型是否存在问题

sum_cols = F.udf(lambda x: x[0], IntegerType())
sum_cols = F.udf(lambda x: int(x[0]), IntegerType())

仍然得到Null。

我尝试删除数组:

sum_cols = F.udf(lambda x: x, IntegerType())
df_with_sum = df.withColumn('SUM_COL',sum_cols(df.A))

这正常工作并显示0/1

我尝试删除UDF,但保留数组:

df_with_sum = df.withColumn('SUM_COL', F.array('A','B'))

这很好用,并显示了一系列[0.0/1.0, 0.0/1.0]

的数组

因此,数组可以正常工作,UDF可以正常工作,只是当我尝试将数组传递给UDF时,情况才出现问题。我在做什么错了?

1 个答案:

答案 0 :(得分:0)

问题是,您试图在应该输出不适合的整数的函数中返回双精度数,并且默认情况下,当强制转换失败时,pyspark静默求助于NULL

df_with_doubles = spark.createDataFrame([(1.0,1.0), (2.0,2.0)], ['A', 'B'])
sum_cols = F.udf(lambda x: x[0]+x[1], IntegerType())
df_with_sum = df_with_double.withColumn('SUM_COL',sum_cols(F.array('A','B')))
df_with_sum.select(['SUM_COL']).toPandas()

您得到:

  SUM_COL
0    None
1    None

但是,如果您这样做:

df_with_integers = spark.createDataFrame([(1,1), (2,2)], ['A', 'B'])
sum_cols = F.udf(lambda x: x[0]+x[1], IntegerType())
df_with_sum = df_with_integers.withColumn('SUM_COL',sum_cols(F.array('A','B')))
df_with_sum.select(['SUM_COL']).toPandas()

您得到:

   SUM_COL
0        2
1        4

因此,可以将列预先转换为IntegerType(或在UDF中转换),或将UDF的返回类型更改为DoubleType