Spark преобразует TimestampType в строку формата yyyyMMddHHmm

#scala #apache-spark #timestamp #datetime-format #datetime-conversion

#scala #apache-spark #временная метка #datetime-формат #дата-время-преобразование

Вопрос:

В моем фрейме данных у меня есть столбец формата TimestampType ‘2019-03-16T16: 54: 42.968Z’. Я хотел бы преобразовать это в столбец StringType с форматом ‘201903161654’ вместо общего столбца timestamptype. Это потому, что мне нужно разделить несколько каталогов на основе временной метки в формате строки, если я разделяю столбец timestamp, это создает специальные символы при создании каталога.

Есть ли какой-либо API, который я могу использовать в spark для преобразования столбца Timestamptype в строковый тип с указанным выше форматом?

Ответ №1:

Используя функции 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>
  

Ответ №2:

Используйте date_format функцию: date_format(date/timestamp/string ts, string fmt) .

Преобразует дату / временную метку/ строку в значение string в формате, указанном в формате даты fmt . Поддерживаемые форматы — это форматы Java SimpleDateFormat. Второй аргумент fmt должен быть постоянным. Пример: date_format('2015-04-08', 'y') есть "2015" .

Комментарии:

1. В качестве примечания, поскольку это не полный ответ, в качестве фильтра формата даты действительно должно быть ‘yyyyMMddHHmm’, а не просто ‘yMdH’, при определенных обстоятельствах это приводит к совершенно другому результату.

2. Приведенный выше пример взят непосредственно из документации Hive, на чем основана совместимость Spark. cwiki.apache.org/confluence/display/Hive/LanguageManual UDF Но, да, вы абсолютно правы: нужно внимательно прочитать документы Java formats, чтобы выбрать правильный.