我一直在使用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])不存在
答案 0 :(得分:1)
@pault建议了该问题的正确答案,
在pyspark.sql接口中,正确地选择了列,正如@cronoik指出的那样,该函数旨在采用col和一个整数(可疑的api设计imo,但这是另一个争论) 因此,解决问题spark.sql.functions.expr节省了一天。以下代码段将起作用!
df=df.withColumn('test', F.expr('date_sub(date_col, sutractor)')