to_date spark apache-spark pyspark spark-dataframe

apache spark - to_date - El dataframe PySpark convierte un formato de cadena inusual a Timestamp



spark sql to date (1)

Spark> = 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| ## +-------------------+-------------------+

Spark <2.2

No es nada que unix_timestamp no pueda manejar:

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| ## +-------------------+---------------------+

Estoy usando PySpark a través de Spark 1.5.0. Tengo un formato de cadena inusual en filas de una columna para valores de fecha y hora. Se parece a esto:

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

¿Hay alguna forma de convertir este formato no ortodoxo yyyy_mm_dd hh_mm_dd en una marca de tiempo? Algo que eventualmente puede venir a lo largo de las líneas de

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

Pensé que las funciones de Spark SQL como regexp_replace podrían funcionar, pero por supuesto tengo que reemplazar _ con - en la mitad de la fecha y _ con : en la parte del tiempo. Pensaba que podría dividir la columna en 2 usando substring y contar hacia atrás desde el final del tiempo. Luego haga el ''regexp_replace'' por separado, luego concatenar. Pero esto parece a muchas operaciones? hay una manera mas facil?