Преобразовать строку даты в метку времени в pySpark - PullRequest
1 голос
/ 04 апреля 2019

У меня есть столбец date в фрейме данных pySpark с датами в следующем формате:

2018-02-01T13:13:12.023507

Я хочу преобразовать даты в этом столбце из строки в метку времени (или что-то, что я могу отсортироватьэто по дате).До сих пор я пробовал следующее:

new_df = df.withColumn(
    'date', 
    unix_timestamp("date", "YYYY-MM-DD'T'hh:mm:ss.s").cast("double").cast("timestamp")
)

и это

new_df = df.withColumn(
    'date',
    from_unixtime(
        unix_timestamp(col(('date')), "yyyy-MM-dd'T'hh:mm:ss.SSS"), 
        "yyyy-MM-dd'T'HH:mm:ss.SSS"
    )
)

и это

df_new = df.withColumn(
    'date1',
    F.to_timestamp("date", "yyyy-dd-MM'T'hh:mm:ss.s")
)

Я пробовал все, что нашел в других подобных вопросах, но такдалеко ничего не работает.Я также попробовал другой формат yyyy-MM-dd'T'HH:mm:ss.ssssss безуспешно.Чего мне не хватает?

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Предположим, у вас был следующий фрейм данных:

df = spark.createDataFrame(
    [('2018-02-01T13:13:12.023507', ), ('2018-02-01T13:13:12.323507', )], 
    ["date"]
)
df.show(truncate=False)
#+--------------------------+
#|date                      |
#+--------------------------+
#|2018-02-01T13:13:12.023507|
#|2018-02-01T13:13:12.323507|
#+--------------------------+

Java SimpleDateFormat поддерживает только вторую точность . Если вас интересует только сортировка по дате, вы можете сделать следующее:

from pyspark.sql.functions import col, unix_timestamp
df.withColumn(
    'new_date',
    unix_timestamp(col('date'), "yyyy-MM-dd'T'hh:mm:ss").cast("timestamp")
).sort('new_date').show(truncate=False)
#+--------------------------+---------------------+
#|date                      |new_date             |
#+--------------------------+---------------------+
#|2018-02-01T13:13:12.323507|2018-02-01 13:13:12.0|
#|2018-02-01T13:13:12.023507|2018-02-01 13:13:12.0|
#+--------------------------+---------------------+

Но поскольку эти две строки примера имеют одинаковую дату и время с точностью до секунды, сортировка здесь будет неопределенной.

Если для вас важна второстепенная часть, вы можете написать свою собственную функцию для ее обработки. Один из способов - разделить столбец date на . и разделить на 1000000.0, чтобы получить микросекунды. Затем добавьте это к unixtimestamp для сортировки:

from pyspark.sql.functions import split

df.withColumn(
    'order_column',
    unix_timestamp('date', "yyyy-MM-dd'T'hh:mm:ss") + split('date', "\.")[1]/1000000.0
).sort("order_column").show(truncate=False)
#+--------------------------+-------------------+
#|date                      |order_column       |
#+--------------------------+-------------------+
#|2018-02-01T13:13:12.023507|1.517508792023507E9|
#|2018-02-01T13:13:12.323507|1.517508792323507E9|
#+--------------------------+-------------------+
0 голосов
/ 04 апреля 2019

Вы можете попробовать udf, как показано ниже.

    format = '%Y-%m-%d %H:%M:%S:%s'
    func = udf (lambda x: datetime.strptime(x, format), TimestampType())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...