spark
May 15, 2023

Преобразование к типу даты и времени в 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
          ''')

Дополнительно о работе функций можно почитать здесь.