PySpark dataframe конвертировать необычный формат строки в метку времени

Я использую PySpark через Spark 1.5.0. У меня необычный строковый формат в строках столбца для значений datetime. Выглядит это так:

Row[(daytetime='2016_08_21 11_31_08')]

есть ли способ преобразовать этот неортодоксальный yyyy_mm_dd hh_mm_dd формат в метку времени? Что-то, что в конечном итоге может прийти по линии

df = df.withColumn("date_time",df.daytetime.astype('Timestamp'))

Я думал, что Spark SQL функционирует как regexp_replace может работать, но, конечно, мне нужно заменить _ С - в половине даты и _ С : во временной части. Я думал, что могу разделить столбец на 2, используя substring и отсчет назад от конца времени. Затем выполните "regexp_replace" отдельно, затем объедините. Но это кажется многим операциям? Есть ли более простой способ?

2 ответов


Искра >= 2.2

from pyspark.sql.functions import to_timestamp

(sc
    .parallelize([Row(dt='2016_08_21 11_31_08')])
    .toDF()
    .withColumn("parsed", to_timestamp("dt", "yyyy_MM_dd hh_mm_ss"))
    .show(1, False))

## +-------------------+-------------------+
## |dt                 |parsed             |
## +-------------------+-------------------+
## |2016_08_21 11_31_08|2016-08-21 11:31:08|
## +-------------------+-------------------+

Искра

Это ничего unix_timestamp не может обрабатывать:

from pyspark.sql import Row
from pyspark.sql.functions import unix_timestamp

(sc
    .parallelize([Row(dt='2016_08_21 11_31_08')])
    .toDF()
    .withColumn("parsed", unix_timestamp("dt", "yyyy_MM_dd hh_mm_ss")
    .cast("double")
    .cast("timestamp"))
    .show(1, False))

## +-------------------+---------------------+
## |dt                 |parsed               |
## +-------------------+---------------------+
## |2016_08_21 11_31_08|2016-08-21 11:31:08.0|
## +-------------------+---------------------+

ответ zero323 отвечает на вопрос, но я хотел добавить, что если ваша строка datetime имеет стандартный формат, вы должны иметь возможность привести ее непосредственно в тип метки времени:

df.withColumn('datetime', col('datetime_str').cast('timestamp'))

Он имеет преимущество обращения МС, а unix_timestamp только имеет только вторую точность (to_timestamp работает и с миллисекундами, но требует Spark >= 2.2, как указано в zero323). Я протестировал его на Spark 2.3.0, используя следующий формат: '2016-07-13 14: 33: 53.979' (с миллисекундами, но также работает и без них).