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我已经编辑了我的答案-可以在写入操作之前格式化列,这不会影响数据帧。这能满足你的需要吗?