Spark 将 TimestampType 转换为格式为 yyyyMMddHHmm 的字符串
Spark convert TimestampType to String of format yyyyMMddHHmm
在我的数据框中,我有一列 TimestampType 格式为“2019-03-16T16:54:42.968Z”,我想将其转换为格式为“201903161654”而不是通用时间戳的 StringType 列柱子。这是因为我需要根据字符串格式的时间戳对多个目录进行分区,如果我在时间戳列上进行分区,它会在创建目录时创建特殊字符。
我可以在 spark 中使用 api 将 Timestamp 列转换为具有上述格式的字符串类型吗?
使用date_format
函数:date_format(date/timestamp/string ts, string fmt)
.
将 date/timestamp/string 转换为日期格式 fmt
指定格式的字符串值。支持的格式为 Java SimpleDateFormat formats。第二个参数 fmt
应该是常量。示例:date_format('2015-04-08', 'y')
是 "2015"
.
使用unix_timestamp和date_format函数
scala> val dt = Seq("2019-03-16T16:54:42.968Z").toDF("ts_str")
dt: org.apache.spark.sql.DataFrame = [ts_str: string]
scala> dt.select(unix_timestamp('ts_str,"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")).show
+----------------------------------------------------+
|unix_timestamp(ts_str, yyyy-MM-dd'T'HH:mm:ss.SSS'Z')|
+----------------------------------------------------+
| 1552735482|
+----------------------------------------------------+
scala> dt.select(date_format(unix_timestamp('ts_str,"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").cast("timestamp"), "yyyyMMddHHmm").as("res") ).show
+------------+
| res|
+------------+
|201903161654|
+------------+
scala>
或仅使用 to_timestamp 和 date_format 函数
scala> val dt = Seq("2019-03-16T16:54:42.968Z").toDF("ts_str")
dt: org.apache.spark.sql.DataFrame = [ts_str: string]
scala> dt.withColumn("ts_str",to_timestamp('ts_str,"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")).show(false)
+-------------------+
|ts_str |
+-------------------+
|2019-03-16 16:54:42|
+-------------------+
scala> dt.withColumn("ts_str",date_format(to_timestamp('ts_str,"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"), "yyyyMMddHHmm" )).show(false)
+------------+
|ts_str |
+------------+
|201903161654|
+------------+
scala>
在我的数据框中,我有一列 TimestampType 格式为“2019-03-16T16:54:42.968Z”,我想将其转换为格式为“201903161654”而不是通用时间戳的 StringType 列柱子。这是因为我需要根据字符串格式的时间戳对多个目录进行分区,如果我在时间戳列上进行分区,它会在创建目录时创建特殊字符。
我可以在 spark 中使用 api 将 Timestamp 列转换为具有上述格式的字符串类型吗?
使用date_format
函数:date_format(date/timestamp/string ts, string fmt)
.
将 date/timestamp/string 转换为日期格式 fmt
指定格式的字符串值。支持的格式为 Java SimpleDateFormat formats。第二个参数 fmt
应该是常量。示例:date_format('2015-04-08', 'y')
是 "2015"
.
使用unix_timestamp和date_format函数
scala> val dt = Seq("2019-03-16T16:54:42.968Z").toDF("ts_str")
dt: org.apache.spark.sql.DataFrame = [ts_str: string]
scala> dt.select(unix_timestamp('ts_str,"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")).show
+----------------------------------------------------+
|unix_timestamp(ts_str, yyyy-MM-dd'T'HH:mm:ss.SSS'Z')|
+----------------------------------------------------+
| 1552735482|
+----------------------------------------------------+
scala> dt.select(date_format(unix_timestamp('ts_str,"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").cast("timestamp"), "yyyyMMddHHmm").as("res") ).show
+------------+
| res|
+------------+
|201903161654|
+------------+
scala>
或仅使用 to_timestamp 和 date_format 函数
scala> val dt = Seq("2019-03-16T16:54:42.968Z").toDF("ts_str")
dt: org.apache.spark.sql.DataFrame = [ts_str: string]
scala> dt.withColumn("ts_str",to_timestamp('ts_str,"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")).show(false)
+-------------------+
|ts_str |
+-------------------+
|2019-03-16 16:54:42|
+-------------------+
scala> dt.withColumn("ts_str",date_format(to_timestamp('ts_str,"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"), "yyyyMMddHHmm" )).show(false)
+------------+
|ts_str |
+------------+
|201903161654|
+------------+
scala>