Apache spark pyspark:如何以';yyyy-MM-dd-HH';

Apache spark pyspark:如何以';yyyy-MM-dd-HH';,apache-spark,datetime,pyspark,apache-spark-sql,partitioning,Apache Spark,Datetime,Pyspark,Apache Spark Sql,Partitioning,我尝试了以下方法: 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)的timestamp/

我尝试了以下方法:

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)的timestamp/datetime列。上面的代码给出了如下结果,如图所示。但当我尝试将其写入按此时间列分区的Azure Blob存储时,它会产生一些垃圾,如:

是否有更干净的方法来执行此操作,以使列格式保持格式(yyyy-MM-dd-HH)中的timestamp/datetime,同时在写入分区时,它以相同的方式看起来干净,而不是“%3A55%”的垃圾字符串


谢谢。

使用
日期\u格式

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列是类型字符串。我想保留类型作为时间戳/datetime@user3868051无法格式化日期时间,除非将其转换为string@user3868051我添加了一行代码,将列
txt
转换为时间戳类型。现在有两列,一列是时间戳类型(
txt
),另一列是字符串类型,它是格式化的时间戳(
testCol
)。您还需要其他内容吗?是的,我想要'testCol'列作为timestamp/datetime,并使用它正确地进行分区。我不想将其格式用作“字符串”。这就是我所关心的问题having@user3868051我已经编辑了我的答案-可以在
写入操作之前格式化列,这不会影响数据帧。这能满足你的需要吗?