pyspark: невозможно изменить формат отметки времени с детализацией до микросекунд с помощью pyspark.sql.functions - PullRequest
0 голосов
/ 18 февраля 2019

Скажем, у меня есть датафрейм, как показано ниже (реальный фрейм данных имеет столбец даты в качестве одного из 20 столбцов и имеет хороший объем данных. Чтобы не указывать на проблему, я здесь рассматриваю только фрейм данных с столбцом даты и продуктомстолбец с одной строкой даты в нем)

    df = spark.createDataFrame([('12/21/2015 23:21:20.689523',"product1")], ['dt',"product_name"])

Теперь моя цель - изменить формат отметки времени на «гггг / мм / дд ЧЧ: мм: сс.СССССС» и сохранить в качестве столбца отметки времени втот же самый фрейм данных (не строковый столбец) Так что в этом случае я сталкиваюсь со следующими проблемами:

  1. Функция date_format не напрямую распознает формат и возвращает ноль

    df.withColumn("new_datetime",date_format("dt","yyyy/MM/dd HH:mm:ss.SSSSSS" ))
    
  2. Теперь, чтобы преодолеть это, я попытался с to_timestamp и использовать date_format для этого, но гранулярность вплоть до секунд здесь может быть достигнута с помощью to_timestamp. Микросекунды в столбце 'dt' не могут быть включены, так как он не может распознать.(если я добавлю также «.SSSSSS», он вернет ноль)

    df.withColumn("new_datetime",to_timestamp("dt","MM/dd/yyyy HH:mm:ss"))
    
  3. Теперь в качестве другого варианта я попытался привести столбец к метке времени, ноэто также заканчивается напрасно

  4. Наконец-то я достиг этого через модуль datetime Python

    df = df.withColumn('row_index', monotonically_increasing_id())
    
    def convert_fmt(date_time):
        return datetime.strptime(datetime.strptime(date_time,"%m/%d/%Y %H:%M:%S.%f").strftime("%Y/%m/%d %H:%M:%S.%f"),"%Y/%m/%d %H:%M:%S.%f")
    
    df_new=df.rdd.map(lambda x : (x.asDict()["row_index"],convert_fmt(x.asDict()["dt"]))).toDF(["index","dt_new"])
    df=df_new.join(df,df_new.index==df.row_index).drop("row_index","index","dt")
    

Но это косвенный подход.Я хотел бы знать, как мы можем изменить формат метки времени столбца даты с детализацией до микросекунд и сохранить его обратно в информационный фрейм как столбец метки времени, используя API и функции core-spark.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...