【问题标题】:Add integer column to timestamp column in PySpark dataframe将整数列添加到 PySpark 数据框中的时间戳列
【发布时间】:2022-01-18 15:49:16
【问题描述】:

假设您有一个 PySpark 数据框,其中包含一个整数类型列 days 和一个日期类型列 start,如下所示:

start                      days      
--------------------------------------
2021-04-08 02:49:09          8
2021-04-08 02:49:09          9
2020-05-05 08:43:02          7

我想成为一个新的专栏end,看起来像这样:

start                      days              end     
---------------------------------------------------------
2021-04-08 02:49:09          8      2021-04-16 02:49:09
2021-04-08 02:49:09          9      2021-04-17 02:49:09
2020-05-05 08:43:02          7      2020-05-12 08:43:02

【问题讨论】:

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


    【解决方案1】:

    您可以将days 转换为IntervalType,然后将其添加到start 列中。

    from pyspark.sql import functions as F
    
    data = [("2021-04-08 02:49:09", 8), ("2021-04-08 02:49:09", 9, ), ("2020-05-05 08:43:02", 7, )]
    df = spark.createDataFrame(data, ("start", "days")).withColumn("start", F.to_timestamp("start", 'yyyy-MM-dd HH:mm:ss'))
    
    df.withColumn("end", F.col("start") + F.concat(F.col("days"), F.lit(" days")).cast("interval")).show()
    

    输出

    +-------------------+----+-------------------+
    |              start|days|                end|
    +-------------------+----+-------------------+
    |2021-04-08 02:49:09|   8|2021-04-16 02:49:09|
    |2021-04-08 02:49:09|   9|2021-04-17 02:49:09|
    |2020-05-05 08:43:02|   7|2020-05-12 08:43:02|
    +-------------------+----+-------------------+
    

    【讨论】:

      【解决方案2】:

      使用date_add 函数添加天数并将小时部分连接到结果日期:

      from pyspark.sql import functions as F
      
      df2 = df.withColumn(
          "end",
          F.concat(
              F.expr("date_add(start, days)"),
              F.date_format("start", " HH:mm:ss")
          ).cast("timestamp")
      )
      
      df2.show()
      #+-------------------+----+-------------------+
      #|start              |days|end                |
      #+-------------------+----+-------------------+
      #|2021-04-08 02:49:09|8   |2021-04-16 02:49:09|
      #|2021-04-08 02:49:09|9   |2021-04-17 02:49:09|
      #|2020-05-05 08:43:02|7   |2020-05-12 08:43:02|
      #+-------------------+----+-------------------+
      

      【讨论】:

        【解决方案3】:

        使用日期实际上很容易做到这一点,但保持时间更难。我们使用 sql 表达式,以便我们可以让列一起播放。这里我使用了大量的空格进行格式化。(下面的可运行代码)

        import pyspark.sql.functions as F
        df = spark.createDataFrame(
          [
             ("2021-04-08 02:49:09",8),
             ("2021-04-08 02:49:09",9),
             ("2020-05-05 08:43:02",7
          ],
          [
             "start",
             "days"
          ]
        )
        df.withColumn(
          'end',
          F.to_timestamp(
            F.expr("date_add(start,days) || ' ' ||split(start,' ')[1]")
          )
        ).show()
        
        +-------------------+----+-------------------+
        |              start|days|                end|
        +-------------------+----+-------------------+
        |2021-04-08 02:49:09|   8|2021-04-16 02:49:09|
        |2021-04-08 02:49:09|   9|2021-04-17 02:49:09|
        |2020-05-05 08:43:02|   7|2020-05-12 08:43:02|
        +-------------------+----+-------------------+
        

        可运行格式的代码

        df = spark.createDataFrame([("2021-04-08 02:49:09",8),("2021-04-08 02:49:09",9),("2020-05-05 08:43:02",7)],["start","days"])
        import pyspark.sql.functions as F
        df.withColumn('end',F.to_timestamp(F.expr("date_add(start,days) || ' ' ||split(start,' ')[1]"))).show()
        

        【讨论】:

          猜你喜欢
          • 2019-05-15
          • 1970-01-01
          • 1970-01-01
          • 2023-02-08
          • 2022-12-03
          • 2022-01-25
          • 1970-01-01
          • 1970-01-01
          • 2023-03-22
          相关资源
          最近更新 更多