pyspark-生成日期序列

Posted

技术标签:

【中文标题】pyspark-生成日期序列【英文标题】:pyspark- generating date sequence 【发布时间】:2020-03-17 15:27:32 【问题描述】:

我正在尝试生成日期序列

from pyspark.sql import functions as F

df1 = df.withColumn("start_dt", F.to_date(F.col("start_date"), "yyyy-mm-dd")) \
        .withColumn("end_dt", F.to_date(F.col("end_date"), "yyyy-mm-dd"))

df1.select("start_dt", "end_dt").show()
    
print("type(start_dt)", type("start_dt"))
print("type(end_dt)", type("end_dt"))

df2 = df1.withColumn("lineoffdate", F.expr("""sequence(start_dt,end_dt,1)"""))

下面是输出

+---------------+----------+
|   start_date  |  end_date|
+---------------+----------+
|     2020-02-01|2020-03-21|
+---------------+----------+

type(start_dt)  <class 'str'>
type(end_dt)  <class 'str'>

由于数据类型不匹配,无法解析 'sequence(start_dt, end_dt, 1)':sequence 仅支持整数、时间戳或日期类型;第 1 行 pos 0;

即使在将开始 dt 和结束 dt 转换为日期或时间戳之后,我看到列的类型仍然是 str 并且在生成日期序列时出现上述错误。

【问题讨论】:

我试图打印模式 |-- start_dt: date(nullable = true) |-- end_dt: date(nullable = true) 不明白为什么序列不起作用 【参考方案1】:

您说它应该与datetimestamp(日历类型)一起使用是正确的,但是,您犯的唯一错误是将"step" 放入sequence 作为integer,当它应该是日历间隔(如interval 1 day):

df.withColumn("start_date",F.to_date("start_date")) \
  .withColumn("end_date", F.to_date("end_date")) \
  .withColumn(
    "lineofdate", 
     F.expr("""sequence(start_date,end_date,interval 1 day)""") \
  ) \
  .show()

# output: 
# +----------+----------+--------------------+
# |start_date|  end_date|          lineofdate|
# +----------+----------+--------------------+
# |2020-02-01|2020-03-21|[2020-02-01, 2020...|
# +----------+----------+--------------------+

【讨论】:

以上是关于pyspark-生成日期序列的主要内容,如果未能解决你的问题,请参考以下文章

PySpark - 遍历每一行数据帧并运行配置单元查询

pyspark:在日期和时间上重新采样 pyspark 数据帧

在 pyspark.pandas 中添加/减去日期时间

如何根据来自其他 pyspark 数据帧的日期值过滤第二个 pyspark 数据帧?

按日期将pyspark数据集分成两个[重复]

在 PySpark 上将日期时间转换为日期