【问题标题】:Subtracting an int column from a date column with date_add in pyspark [duplicate]在pyspark中使用date_add从日期列中减去一个int列[重复]
【发布时间】:2020-03-17 20:39:45
【问题描述】:

我有一个 pyspark 数据框 df

+------------+------+
|  timestamp | days |
+------------+------+
| 2019-11-21 |    5 |
| 2019-10-22 |   21 |
|        ... |  ... |
+------------+------+

我想从时间戳中减去天数

import pyspark.sql.functions as F

df.withColumn("timestamp", F.date_add(F.col("timestamp"), -F.col("days")))

预期的结果是

+------------+------+
|  timestamp | days |
+------------+------+
| 2019-11-16 |    5 |
| 2019-10-01 |   21 |
|        ... |  ... |
+------------+------+

但我只收到错误TypeError: Column is not iterable

有没有办法让它工作?

【问题讨论】:

  • 具体:df.withColumn("timestamp", F.expr("date_add(timestamp, -days)")
  • 这个效果更好!请添加您的答案。
  • 它与我链接的副本相同。您可以接受副本并自行关闭。

标签: python pyspark


【解决方案1】:

使用 udf 是解决方案。

date_add_udf = F.udf(lambda date, days: F.date_add(date, days), pyspark.sql.types.TimestampType())

然后调用它

df.withColumn("timestamp", date_add_udf(F.col("timestamp"), -F.col("days")))

【讨论】:

  • 当我尝试这种方法时,我得到一个类似this post 的错误。看起来 pyspark.sql.functions 不允许在 UDF 中使用。这是 Databricks 特有的吗?
  • 刚刚找到an alternate answer。您使用 expr() 而不是 UDF。
猜你喜欢
  • 1970-01-01
  • 2015-08-20
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 2018-03-12
  • 1970-01-01
  • 2012-10-13
相关资源
最近更新 更多