Saltar al contenido

PySpark: formato to_date de la columna

Hola usuario de nuestra página web, encontramos la respuesta a lo que necesitas, desplázate y la obtendrás más abajo.

Solución:

Puede utilizar un valor de columna como parámetro sin un udf usando la sintaxis de spark-sql:

Spark versión 2.2 y superior

from pyspark.sql.functions import expr
df.withColumn("test3",expr("to_date(value, format)")).show()
#+--------+----------+----------+----------+
#|col_name|     value|    format|     test3|
#+--------+----------+----------+----------+
#|       a|2018-01-01|yyyy-MM-dd|2018-01-01|
#|       b|2018-02-02|yyyy-MM-dd|2018-02-02|
#|       c|02-02-2018|dd-MM-yyyy|2018-02-02|
#+--------+----------+----------+----------+

O de manera equivalente usando pyspark-sql:

df.createOrReplaceTempView("df")
spark.sql("select *, to_date(value, format) as test3 from df").show() 

Spark versión 1.5 y superior

Las versiones anteriores de Spark no admiten tener un format argumento a la to_date función, por lo que tendrás que usar unix_timestamp y from_unixtime:

from pyspark.sql.functions import expr
df.withColumn(
    "test3",
    expr("from_unixtime(unix_timestamp(value,format))").cast("date")
).show()

O de manera equivalente usando pyspark-sql:

df.createOrReplaceTempView("df")
spark.sql(
    "select *, cast(from_unixtime(unix_timestamp(value,format)) as date) as test3 from df"
).show() 

Hasta donde yo sé, su problema requiere algunos udf(funciones definidas por el usuario) para aplicar el formato correcto. Pero luego dentro de un udf no puedes usar directamente funciones de chispa como to_date. Así que creé una pequeña solución en la solución. Primero el udf toma la conversión de fecha de python con el formato apropiado de la columna y la convierte a un formato iso. Luego otro withColumn convierte la fecha ISO al formato correcto en la columna test3. Sin embargo, debe adaptar el formato en la columna original para que coincida con las cadenas de formato de fecha de Python, por ejemplo, yyyy -> %Y, MM -> %m, …

test_df = spark.createDataFrame([
('a','2018-01-01','%Y-%m-%d'),
                  ('b','2018-02-02','%Y-%m-%d'),
                  ('c','02-02-2018','%d-%m-%Y')
], ("col_name","value","format"))

def map_to_date(s,format):
    return datetime.datetime.strptime(s,format).isoformat()

myudf = udf(map_to_date)

test_df.withColumn("test3",myudf(col("value"),col("format"))) 
   .withColumn("test3",to_date("test3")).show(truncate=False)

Resultado:

+--------+----------+--------+----------+
|col_name|value     |format  |test3     |
+--------+----------+--------+----------+
|a       |2018-01-01|%Y-%m-%d|2018-01-01|
|b       |2018-02-02|%Y-%m-%d|2018-02-02|
|c       |02-02-2018|%d-%m-%Y|2018-02-02|
+--------+----------+--------+----------+

Calificaciones y reseñas

Si haces scroll puedes encontrar las críticas de otros administradores, tú asimismo tienes la opción de insertar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *