Преобразование к типу даты и времени в Spark SQL
Время есть величайшая иллюзия. Оно есть только внутренняя призма, через которую мы разлагаем бытие и жизнь (А.Ф. Амиель).
Рассмотрим способы преобразования колонок с датой и временем в Spark SQL. Для начала сформируем демонстрационный датафрейм и зарегистрируем его в качестве временной таблицы:
sdf = spark.createDataFrame([(1, '20200101 03:23:12', '2020-02-02', 23), (2, '20201211 11:12:33', '2021-01-12', 12), (3, '20200105 11:12:33', '2020-12-03', 12), (4, '20201121 23:23:02', '2020-12-22', 45)], ['id', 'dt1', 'dt2', 'val']) sdf.createOrReplaceTempView("test") sdf.show()
str2date
Функция to_date принимает в качестве параметров имя колонки и формат и преобразует в тип pyspark.sql.types.DateType:
spark.sql('''SELECT to_date(dt1, 'yyyyMMdd HH:mm:ss') as date1, to_date(dt2, 'yyyy-MM-dd') as date2 FROM test ''')
Функция to_timestamp работает аналогично, только возвращает дату и время (pyspark.sql.types.TimestampType):
spark.sql('''SELECT to_timestamp(dt1, 'yyyyMMdd HH:mm:ss') as date1, to_timestamp(dt2, 'yyyy-MM-dd') as date2 FROM test ''')
Описание символов формата можно взять здесь.
date2str
Функция date_format принимает колонку с типом даты или даты и времени, а также формат вывода и возвращает строковое поле:
spark.sql('''WITH test_mod AS (SELECT to_timestamp(dt1, 'yyyyMMdd HH:mm:ss') as date1, to_timestamp(dt2, 'yyyy-MM-dd') as date2 FROM test) SELECT date_format(date1, 'MM/dd/yy') FROM test_mod ''')
date2unix
unix_timestamp принимает в качестве параметров дату и время/дату или строку в заданном формате (задается вторым параметром) и возвращает в количество секунд, прошедших с 1970-01-01 00:00:00. Ниже пример для нашего датафрейма:
spark.sql('''SELECT unix_timestamp(dt1, 'yyyyMMdd HH:mm:ss'), unix_timestamp(dt2, 'yyyy-MM-dd') FROM test ''')
А здесь пример работы unix_timestamp с метками даты и времени на подзапросе с полями с заданными типом:
spark.sql('''WITH test_dt AS(SELECT to_timestamp(dt1, 'yyyyMMdd HH:mm:ss') as date1, to_timestamp(dt2, 'yyyy-MM-dd') as date2 FROM test) SELECT unix_timestamp(date1), unix_timestamp(date2) FROM test_dt ''')
unix2date
from_unixtime осуществляет обратное преобразование - количества секунд в метки даты и времени:
spark.sql('''WITH unix_test AS (SELECT unix_timestamp(dt1, 'yyyyMMdd HH:mm:ss') as un1, unix_timestamp(dt2, 'yyyy-MM-dd') as un2 FROM test) SELECT from_unixtime(un1), from_unixtime(un2) FROM unix_test ''')
Дополнительно о работе функций можно почитать здесь.