我有一个带有两列(类型为A
的{B
,double
)的PySpark数据帧,其值为0.0
或1.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时,情况才出现问题。我在做什么错了?
答案 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
。