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 udf
y 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)