Spark с использованием метки времени внутри RDD - PullRequest
2 голосов
/ 06 июня 2019

Я пытаюсь сравнить временные метки на карте, но Spark, похоже, использует другой часовой пояс или что-то еще, что действительно странно. Я прочитал фиктивный CSV-файл, как показано ниже, чтобы создать входной фрейм данных:

"ts"
"1970-01-01 00:00:00"
"1970-01-01 00:00:00"
df.show(2)
+-------------------+
|        ts         |
+-------------------+
|1970-01-01 00:00:00|
|1970-01-01 00:00:00|
+-------------------+

Пока нечего сообщать, но потом:

df.rdd.map { row =>
  val timestamp = row.getTimestamp(0)
  val timestampMilli = timestamp.toInstant.toEpochMilli
  val epoch = Timestamp.from(Instant.EPOCH)
  val epochMilli = epoch.toInstant.toEpochMilli
  (timestamp, timestampMilli, epoch, epochMilli)
}.foreach(println)
(1970-01-01 00:00:00.0,-3600000,1970-01-01 01:00:00.0,0)
(1970-01-01 00:00:00.0,-3600000,1970-01-01 01:00:00.0,0)

Я не понимаю, почему обе отметки времени не 1970-01-01 00:00:00.0, 0. Кто-нибудь знает, что мне не хватает?

Примечание: я уже настроил часовой пояс сеанса на UTC , используя следующие свойства.

spark.sql.session.timeZone=UTC
user.timezone=UTC

1 Ответ

4 голосов
/ 06 июня 2019

Класс java.sql.Timestamp наследуется от java.util.Date.Они оба имеют поведение , сохраняющее числовую временную метку на основе UTC, но отображающее время в местном часовом поясе.Вы увидите это с .toString() в Java, так же, как с println в приведенном коде.

Я полагаю, что ваша ОС (или среда) настроена на что-то похожее на Europe/London.Имейте в виду, что в эпоху Unix (1970-01-01T00:00:00Z) Лондон был на BST (UTC + 1).

Ваша переменная timestampMilli показывает -3600000, потому что она интерпретировала вашувведите местное время как 1970-01-01T00:00:00+01:00, что эквивалентно 1969-12-31T23:00:00Z.

Ваша переменная epoch показывает 1970-01-01 01:00:00.0, поскольку 0 эквивалентно 1970-01-01T00:00:00Z, что эквивалентно 1970-01-01T01:00:00+01:00.

См. Также:

Я вижувы отметили, что вы установили часовой пояс сеанса в UTC, что теоретически должно работатьНо результаты ясно показывают, что он этим не пользуется.Извините, но я не знаю Spark достаточно хорошо, чтобы сказать вам, почему.Но я бы сосредоточился на этой части проблемы.

...