Scala Spark将时间戳类型转换为格式为yyyyMMddHHmm的字符串

Scala Spark将时间戳类型转换为格式为yyyyMMddHHmm的字符串,scala,apache-spark,timestamp,datetime-format,datetime-conversion,Scala,Apache Spark,Timestamp,Datetime Format,Datetime Conversion,在我的数据帧中,我有一列TimestampType格式为'2019-03-16T16:54:42.968Z',我想将其转换为格式为'201903161654'的StringType列,而不是一般的timestamp列。这是因为我需要根据字符串格式的时间戳对多个目录进行分区,如果在时间戳列上进行分区,则在创建目录时会创建特殊字符 在spark中是否有任何api可用于将时间戳列转换为具有上述格式的字符串类型 使用date\u格式功能:date\u格式(日期/时间戳/字符串ts,字符串fmt) 将日期

在我的数据帧中,我有一列TimestampType格式为'2019-03-16T16:54:42.968Z',我想将其转换为格式为'201903161654'的StringType列,而不是一般的timestamp列。这是因为我需要根据字符串格式的时间戳对多个目录进行分区,如果在时间戳列上进行分区,则在创建目录时会创建特殊字符


在spark中是否有任何api可用于将时间戳列转换为具有上述格式的字符串类型

使用
date\u格式
功能:
date\u格式(日期/时间戳/字符串ts,字符串fmt)


将日期/时间戳/字符串转换为日期格式
fmt
指定格式的字符串值。支持的格式为。第二个参数
fmt
应该是常量。示例:
date\u格式('2015-04-08','y')
“2015”

使用
date\u格式
功能:
date\u格式(日期/时间戳/字符串ts,字符串fmt)


将日期/时间戳/字符串转换为日期格式
fmt
指定格式的字符串值。支持的格式为。第二个参数
fmt
应该是常量。示例:
date\u格式('2015-04-08','y')
是使用unix\u时间戳和date\u格式函数的
“2015”

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>
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>
或者只使用时间戳和日期格式函数

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>
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>

使用unix\u时间戳和日期\u格式函数

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>
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>
或者只使用时间戳和日期格式函数

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>
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>

值得注意的是,由于这不是一个完整的答案,因此它实际上应该是“yyyyMMddHHmm”作为日期格式过滤器,而不仅仅是“yMdH”,在某些情况下,它的输出完全不同。上面的示例直接来自Hive文档,这正是Spark的兼容性所基于的。但是,是的,你是绝对正确的:你必须仔细阅读Java格式文档才能选择正确的格式。注意,因为这不是一个完整的答案,所以应该使用“yyyyMMddHHmm”作为日期格式过滤器,而不仅仅是“yMdH”,这在某些情况下有完全不同的输出。上面的例子直接来自Hive文档,这就是Spark兼容性的基础。但是,是的,您是绝对正确的:您必须仔细阅读Java格式文档才能选择正确的格式。