Spark SQL преобразует строку в метку времени

Я новичок в Spark SQL и пытаюсь преобразовать строку в метку времени в кадре с искровыми данными. У меня есть строка, которая выглядит как '2017-08-01T02:26:59.000Z' в столбце time_string

Мой код для преобразования этой строки в метку времени

CAST (time_string AS Timestamp)

Но это дает мне временную метку 2017-07-31 19:26:59

Почему он меняет время? Есть ли способ сделать это, не изменяя время?

Спасибо за любую помощь!

Ответ 1

Вы можете использовать unix_timestamp для преобразования даты форматирования utc в метку времени

val df2 = Seq(("a3fac", "2017-08-01T02:26:59.000Z")).toDF("id", "eventTime")

df2.withColumn("eventTime1", unix_timestamp($"eventTime", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").cast(TimestampType))

Вывод:

+-------------+---------------------+
|userid       |eventTime            |
+-------------+---------------------+
|a3fac        |2017-08-01 02:26:59.0|
+-------------+---------------------+

Надеюсь, это поможет!

Ответ 2

Решение на Java

Есть несколько функций Spark SQL, которые позволяют вам играть с форматом даты.

Пример конверсии: 201812240915302018-12-24 09:15:30

Решение (оператор Spark SQL):

SELECT
 ...
 to_timestamp(cast(DECIMAL_DATE as string),'yyyyMMddHHmmss') as 'TIME STAMP DATE',
 ...
FROM some_table

Вы можете использовать операторы SQL, используя экземпляр org.apache.spark.sql.SparkSession. Например, если вы хотите выполнить инструкцию sql, Spark предоставит следующее решение:

...
// You have to create an instance of SparkSession
sparkSession.sql(sqlStatement); 
...

Примечание:

  • Вам нужно преобразовать десятичную строку в строку, и после этого вы сможете выполнить синтаксический анализ в формате отметки времени
  • .Вы можете играть с форматом получить, какой формат вы хотите...