如何从 Pyspark 中的日期列中减去天数列?

新手上路,请多包涵

给定以下 PySpark DataFrame

 df = sqlContext.createDataFrame([('2015-01-15', 10),
                                 ('2015-02-15', 5)],
                                 ('date_col', 'days_col'))

如何从日期列中减去天数列?在此示例中,结果列应为 ['2015-01-05', '2015-02-10']

我查看了 pyspark.sql.functions.date_sub() ,但它需要一个日期列和一天,即 date_sub(df['date_col'], 10) 。理想情况下,我更愿意做 date_sub(df['date_col'], df['days_col'])

我还尝试创建一个 UDF:

 from datetime import timedelta
def subtract_date(start_date, days_to_subtract):
    return start_date - timedelta(days_to_subtract)

subtract_date_udf = udf(subtract_date, DateType())
df.withColumn('subtracted_dates', subtract_date_udf(df['date_col'], df['days_col'])

这在技术上可行,但我读到在 Spark 和 Python 之间步进可能会导致大型数据集出现性能问题。我现在可以坚持使用这个解决方案(无需过早优化),但我的直觉告诉我,必须有一种方法可以在不使用 Python UDF 的情况下完成这个简单的事情。

原文由 kjmij 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 471
2 个回答

我能够使用 selectExpr 解决这个问题。

 df.selectExpr('date_sub(date_col, day_col) as subtracted_dates')

如果要将列附加到原始 DF,只需将 * 添加到表达式

df.selectExpr('*', 'date_sub(date_col, day_col) as subtracted_dates')

原文由 kjmij 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 expr 函数(如果你有 dynamic values 从要减去的列):

 >>> from pyspark.sql.functions import *
>>> df.withColumn('substracted_dates',expr("date_sub(date_col,days_col)"))

使用 withColumn 函数(如果你有 literal values 减去):

 >>> df.withColumn('substracted_dates',date_sub('date_col',<int_literal_value>))

原文由 notNull 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题