Функция Pyspark to_date () дает разные ответы на Windows и WSL Ubuntu - PullRequest
3 голосов
/ 07 мая 2020

У меня есть функция, которая преобразует int в дату, которая затем передается в dateiff, чтобы узнать, сколько дней прошло с момента события. Один из наших тестов проходит в PySpark Windows и в нашем Azure DevOps pipeline, но не работает при запуске в PySpark в WSL Ubuntu. Мы сузили его до функции to_date(), дающей разные результаты на двух платформах, но не понимаем почему.

import pyspark.sql.functions as F
import datetime
def from_int_to_date(int_date: int) -> datetime.datetime:
    """
    Convert an integer in YYYYMMDD format into a datetime object
    """
    return datetime.datetime.strptime(str(int_date), "%Y%m%d")

Если я вычисляю F.to_date(F.lit(from_int_to_date(20190401))), я получаю Column<b"to_date(TIMESTAMP '2019-04-01 00:00:00')"> на Windows и Column<b"to_date(TIMESTAMP('2019-03-31 23:00:00.0'))> в версии, работающей под WSL.

Я живу в Великобритании, и 1 апреля 2019 года мы изменили наши часы на лето, поэтому я могу понять причину, по которой они возвращаются на час назад, поскольку проблема не возникает с входным int 20190331. Я просто пытаюсь понять, почему поведение to_date () различается в двух системах и что мы должны сделать, чтобы смягчить это (и любые другие различия), поскольку в идеале наш код был бы агностикой платформы c.

1 Ответ

0 голосов
/ 16 мая 2020

Установите часовой пояс для драйвера Spark с конфигурацией spark.sql.session.timeZone, чтобы вы не зависели от системных часов.

spark.conf.set("spark.sql.session.timeZone", "Europe/London")

Этот параметр может быть установлен даже при создании сеанса Spark.

...