Saltar al contenido

Columna de conversión que contiene múltiples formatos de fecha de cadena a DateTime en Spark

Solución:

Personalmente, recomendaría usar funciones SQL directamente sin un reformateo costoso e ineficiente:

from pyspark.sql.functions import coalesce, to_date

def to_date_(col, formats=("MM/dd/yyyy", "yyyy-MM-dd")):
    # Spark 2.2 or later syntax, for < 2.2 use unix_timestamp and cast
    return coalesce(*[to_date(col, f) for f in formats])

Esto elegirá el primer formato, que puede analizar correctamente la cadena de entrada.

Uso:

df = spark.createDataFrame([(1, "01/22/2010"), (2, "2018-12-01")], ("id", "dt"))
df.withColumn("pdt", to_date_("dt")).show()
+---+----------+----------+
| id|        dt|       pdt|
+---+----------+----------+
|  1|01/22/2010|2010-01-22|
|  2|2018-12-01|2018-12-01|
+---+----------+----------+

Será más rápido que udfy agregar nuevos formatos es solo cuestión de ajustar formats parámetro.

Sin embargo, no le ayudará con las ambigüedades de formato. En el caso general, es posible que no sea posible hacerlo sin la intervención manual y la referencia cruzada con datos externos.

Por supuesto, se puede hacer lo mismo en Scala:

import org.apache.spark.sql.Column
import org.apache.spark.sql.functions.{coalesce, to_date}

def to_date_(col: Column, 
             formats: Seq[String] = Seq("MM/dd/yyyy", "yyyy-MM-dd")) = {
  coalesce(formats.map(f => to_date(col, f)): _*)
}
¡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 *