Мы используем pyspark для анализа набора данных, содержащего столбцы даты, преобразованные в метку времени UTC, с кодом, который выглядит следующим образом:
from datetime import datetime
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, to_timestamp, to_utc_timestamp
session = (SparkSession
.builder
.appName('test_spark')
.master('local[*]')
.config('spark.sql.session.timeZone', 'UTC')
.getOrCreate())
date_df = session.createDataFrame([{'date': '2017-10-29'}])
result_df = (date_df
.withColumn('date', to_timestamp(col('date')))
.withColumn('date', to_utc_timestamp(col('date'), 'Europe/Madrid')))
expected_df = session.createDataFrame([{'date': datetime(2017, 10, 29, 0, 0)}])
print("Expected")
print(expected_df.collect())
print("Result")
print(result_df.collect())
В Linux этот код печатается (регистрация Spark опущена):
Expected
[Row(date=datetime.datetime(2017, 10, 29, 0, 0))]
Result
[Row(date=datetime.datetime(2017, 10, 29, 0, 0))]
В Windows 10, однако, вывод:
Expected
[Row(date=datetime.datetime(2017, 10, 29, 0, 0))]
Result
[Row(date=datetime.datetime(2017, 10, 29, 1, 0))]
Как видите, в Windows проанализированная дата на 1 час больше, чем результат в Linux.
Я проверил это с OpenJDK JRE и Oracle JRE (всегда версия 8), но результат тот же.
Что, черт возьми, здесь происходит?Если я изменяю год или месяц дат, «ошибка» больше не возникает, похоже, она появляется только 29 октября 2017 года, что делает этот день таким особенным?