PySpark date_sub函数可在PySpark.sql中使用,但在常规Python中失败

时间:2019-07-01 14:05:37

标签: python apache-spark pyspark apache-spark-sql pyspark-sql

我一直在使用Pyspark.sql.functions.date_sub方法,从文档和先前的SO答案中可以看出,它应该能够将两个列名称作为字符串并以这种方式减去日期。但是,用Pythonic代码编写时会失败

这可以通过selectExpr使用spark.sql, pythonic版本有效,但仅当days参数作为整数而不是列传递时有效。

df = 'dataframe'
date_col = 'column in dataframe with a date type value'
subtractor = 'column in dataframe containing integer'
df.selectExpr('date_sub(date_col, subtractor) as test') 

这将按预期工作。

理论上,下面的方法应该起作用

df = df.withColumn('test', F.date_sub(date_col, subtractor))

但是它出错了,

如果我将列名作为实际列传递,也会出现同样的问题,

df = df.withColumn('test', F.date_sub(df[date_col], df[subtractor]))

相反,我收到错误消息,说

py4j.Py4JException:方法date_sub([class org.apache.spark.sql.Column,class java.lang.String])不存在

1 个答案:

答案 0 :(得分:1)

@pault建议了该问题的正确答案,

在pyspark.sql接口中,正确地选择了列,正如@cronoik指出的那样,该函数旨在采用col和一个整数(可疑的api设计imo,但这是另一个争论) 因此,解决问题spark.sql.functions.expr节省了一天。以下代码段将起作用!

df=df.withColumn('test', F.expr('date_sub(date_col, sutractor)')