#python #apache-spark #datetime #pyspark #utc
#python #apache-spark #datetime #pyspark #utc
Вопрос:
У меня есть записная книжка Python Databricks, которая получает внешние данные, содержащие строки datetime со смещениями UTC между UTC-24:00 и UTC 24:00. Примером строки datetime является « 2020-06-26T03:05:52 20:00
. Однако я также использую библиотеку (Spark 3.x использует Java DateTimeFormatter), которая поддерживает только смещения UTC между UTC-18:00 и UTC 18:00. В Spark 3.x функция pyspark to_timestamp()
возвращает null
значения datetimes со смещением UTC, которые находятся за пределами диапазона /- 18:00.
Пример кода:
from pyspark.sql import SparkSession
from pyspark.sql import functions as F
spark = SparkSession.builder.master("local[2]").appName("test")
.config("spark.driver.memory", "2g")
.config("spark.executor.memory", "1g")
.config('spark.driver.extraJavaOptions', '-Duser.timezone=GMT')
.config('spark.executor.extraJavaOptions', '-Duser.timezone=GMT')
.config('spark.sql.session.timeZone', 'UTC')
.getOrCreate()
columns = ["datetime", "offset"]
data = [
("2020-06-26T03:05:52 20:00", " 20:00"),
("2020-06-26T03:05:52 02:00", " 2:00"),
]
test_df = spark.createDataFrame(data).toDF(*columns)
test_df_two = test_df.withColumn(
'to_ts', F.to_timestamp(F.col("datetime"))
)
test_df_two.show(truncate=False)
Вывод:
------------------------- ------ -------------------
|datetime |offset|to_ts |
------------------------- ------ -------------------
|2020-06-26T03:05:52 20:00| 20:00|null |
|2020-06-26T03:05:52 02:00| 2:00 |2020-06-26 01:05:52|
------------------------- ------ -------------------
Как я могу в общем случае преобразовать такие строки datetime в эквивалентные, которые находятся в пределах / — 18:00, установленного моей библиотекой?
Комментарии:
1. Можете ли вы сосредоточиться на классе, который отказывается анализировать большие смещения часовых поясов? Неясно, проблема в Spark или во встроенном в Java материале. Пример, который показывает только поведение проблемного класса, был бы действительно отличным.
2. Я нахожу, что java.time. ZonedDateTime.parse выдает исключение, когда смещение tz превышает 18 часов, так что, возможно, в этом причина проблемы. Это сводит с ума — я не вижу никакого оператора в ZonedDateTime, java.time.format . DateTimeFormatter или даже страница Википедии для ISO 8601 (извините, я не смог найти нормативную ссылку) о допустимом диапазоне для смещения tz. В отсутствие официального заявления об этом, похоже, что разработчики материала для анализа даты сделали ограничительное предположение о том, что является «разумным». Хм.
3. «В 2008 году смещения часовых поясов по всему миру расширились с -12:00 до 14:00. Чтобы предотвратить какие-либо проблемы с расширением этого диапазона, но при этом обеспечить проверку, диапазон смещений ограничен от -18:00 до 18:00 включительно. » Из : docs.oracle.com/javase/8/docs/api/java/time/ZoneOffset.html
4. Ха, ну это чушь. Это все равно, что сказать: «Количество атомов во вселенной несколько меньше 1e82, поэтому анализатор чисел выдает ошибку для чего-либо большего». Я все же хотел бы ознакомиться с тем, что на самом деле говорит или не говорит спецификация о смещении.
5. Изменение поведения в Spark 3.x упоминается в руководстве по миграции здесь ( spark.apache.org/docs/latest /… ) в соответствии с пунктом 12