******* ОБНОВЛЕНИЕ ********
Как предложено в комментариях, я исключил несущественную часть кода:
Мои требования:
- Укажите количество миллисекунд до 3
- Преобразовать строку в метку времени и сохранить значение в UTC
Создать фрейм данных:
val df = Seq("2018-09-02T05:05:03.456Z","2018-09-02T04:08:32.1Z","2018-09-02T05:05:45.65Z").toDF("Timestamp")
Здесь результаты с использованием искровой оболочки:
![enter image description here](https://i.stack.imgur.com/dNIs5.jpg)
************ ОБНОВЛЕНИЕ КОНЦА *********************************
У меня приятная головная боль, когда я пытаюсь разобраться с часовыми поясами и форматами отметок времени в Spark, используя scala.
Это упрощение моего сценария для объяснения моей проблемы:
import org.apache.spark.sql.functions._
val jsonRDD = sc.wholeTextFiles("file:///data/home2/phernandez/vpp/Test_Message.json")
val jsonDF = spark.read.json(jsonRDD.map(f => f._2))
Это результирующая схема:
root
|-- MeasuredValues: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- MeasuredValue: double (nullable = true)
| | |-- Status: long (nullable = true)
| | |-- Timestamp: string (nullable = true)
Затем я просто выбираю поле Timestamp следующим образом
jsonDF.select(explode($"MeasuredValues").as("Values")).select($"Values.Timestamp").show(5,false)
![Timestamp with different milliseconds length](https://i.stack.imgur.com/qyoYb.png)
Первое, что я хочу исправить, - это количество миллисекунд каждой метки времени и унифицируйте его до трех.
Я применил date_format следующим образом
jsonDF.select(explode($"MeasuredValues").as("Values")).select(date_format($"Values.Timestamp","yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")).show(5,false)
![Milliseconds unified but time zone change](https://i.stack.imgur.com/Cxm2S.png)
Формат в миллисекундах был исправлен, но метка времени конвертируется из UTC в местное время.
Чтобы решить эту проблему, я применил to_utc_timestamp вместе с моим местным часовым поясом.
jsonDF.select(explode($"MeasuredValues").as("Values")).select(to_utc_timestamp(date_format($"Values.Timestamp","yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"),"Europe/Berlin").as("Timestamp")).show(5,false)
![to_utc_timestamp output](https://i.stack.imgur.com/h8X0C.png)
Еще хуже, значение UTC не возвращается, а формат в миллисекундах теряется.
Есть идеи, как с этим бороться? Я буду признателен за это 10
BR. Пол