Скажем, у меня есть датафрейм, как показано ниже (реальный фрейм данных имеет столбец даты в качестве одного из 20 столбцов и имеет хороший объем данных. Чтобы не указывать на проблему, я здесь рассматриваю только фрейм данных с столбцом даты и продуктомстолбец с одной строкой даты в нем)
df = spark.createDataFrame([('12/21/2015 23:21:20.689523',"product1")], ['dt',"product_name"])
Теперь моя цель - изменить формат отметки времени на «гггг / мм / дд ЧЧ: мм: сс.СССССС» и сохранить в качестве столбца отметки времени втот же самый фрейм данных (не строковый столбец) Так что в этом случае я сталкиваюсь со следующими проблемами:
Функция date_format не напрямую распознает формат и возвращает ноль
df.withColumn("new_datetime",date_format("dt","yyyy/MM/dd HH:mm:ss.SSSSSS" ))
Теперь, чтобы преодолеть это, я попытался с to_timestamp и использовать date_format для этого, но гранулярность вплоть до секунд здесь может быть достигнута с помощью to_timestamp. Микросекунды в столбце 'dt' не могут быть включены, так как он не может распознать.(если я добавлю также «.SSSSSS», он вернет ноль)
df.withColumn("new_datetime",to_timestamp("dt","MM/dd/yyyy HH:mm:ss"))
Теперь в качестве другого варианта я попытался привести столбец к метке времени, ноэто также заканчивается напрасно
Наконец-то я достиг этого через модуль 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.