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字符串