pyspark:如何以“yyyy-MM-dd HH”格式按日期列分区

Posted

技术标签:

【中文标题】pyspark:如何以“yyyy-MM-dd HH”格式按日期列分区【英文标题】:pyspark: how to partition by date column in format 'yyyy-MM-dd HH' 【发布时间】:2020-12-26 18:28:34 【问题描述】:

我尝试了以下方法:

df = (spark.createDataFrame([(1, '2020-12-03 01:01:01'), (2, '2022-11-04 10:10:10'),], ['id', 'txt'])
  .withColumn("testCol", to_timestamp(col("txt"), "yyyy-MM-dd HH")))

我基本上想要格式为 (yyyy-MM-dd HH) 的时间戳/日期时间列。上面的代码给出了以下结果,如图所示。但是,当我尝试将其写入按此时间列分区的 Azure Blob 存储时,它会产生一些垃圾,例如:

有没有更简洁的方法来做到这一点,使列格式保持时间戳/日期时间的格式(yyyy-MM-dd HH),同时在写入分区时它看起来以同样的方式干净而不是垃圾'%3A55%....'的字符串

谢谢。

【问题讨论】:

【参考方案1】:

使用date_format:

import pyspark.sql.functions as F

df = spark.createDataFrame(
    [(1, '2020-12-03 01:01:01'), (2, '2022-11-04 10:10:10')],
    ['id', 'txt']
)
df = df.withColumn("testCol", F.col("txt").cast("timestamp"))
df.withColumn("testCol", F.date_format("txt", "yyyy-MM-dd HH")).write.partitionBy('testCol').csv('output')

df.show()
+---+-------------------+-------------------+
| id|                txt|            testCol|
+---+-------------------+-------------------+
|  1|2020-12-03 01:01:01|2020-12-03 01:01:01|
|  2|2022-11-04 10:10:10|2022-11-04 10:10:10|
+---+-------------------+-------------------+

df.printSchema()
root
 |-- id: long (nullable = true)
 |-- txt: string (nullable = true)
 |-- testCol: timestamp (nullable = true)

$ ls output
_SUCCESS  testCol=2020-12-03 01  testCol=2022-11-04 10

【讨论】:

但是这里的 testCol 列是拼写错误的字符串。我想保持类型为时间戳/日期时间 @user3868051 日期时间不能被格式化,除非它们被转换为字符串 @user3868051 我添加了一行将txt 列转换为时间戳类型。所以现在有两列,一列是时间戳类型 (txt),另一列是字符串类型,它是格式化的时间戳 (testCol)。你还想要什么吗? 是的,我希望 'testCol' 列作为时间戳/日期时间,并将其用于正确分区。我不想将其格式用作“字符串”。这就是我遇到的问题 @user3868051 我已经编辑了我的答案 - 该列可以在 write 操作之前进行格式化,这不会影响数据框。这能满足您的需求吗?

以上是关于pyspark:如何以“yyyy-MM-dd HH”格式按日期列分区的主要内容,如果未能解决你的问题,请参考以下文章

如何快速转换日期 yyyy-mm-dd'T'HH:mm:ss.SSSZ [重复]

如何从日期格式“yyyy-MM-dd'T'HH:mm:ss.SSSZ”中分别获取日期、年份、小时、分钟?

如何在进行选择查询时将 YYYY-MM-DD HH:mm:ss 中的时间戳转换为 Hive 中的 YYYY-MM-DD HH:mm:ss.SSS?

JS 如何将 yyyy-MM-dd HH:mm:ss字符串 转换成yyyy-MM-dd字符串

如何快速将 yyyy-MM-dd'T'HH:mm:ss.SSS'Z' 转换为 MM-dd-yyyy

java如何实现各国时间格式转换成yyyy-MM-dd HH:mm:ss时间格式?