¿Por qué obtengo resultados nulos de date_format () función de PySpark?

Supongamos que hay un cuadro de fecha con una columna compuesta de fechas como cadenas. Para esa suposición, creamos el siguiente DataFrame como ejemplo:

# Importing sql types from pyspark.sql.types import StringType, IntegerType, StructType, StructField, DoubleType, FloatType, DateType from pyspark.sql.functions import date_format import random import time def strTimeProp(start, end, format, prop): stime = time.mktime(time.strptime(start, format)) # Parse a string representing a time according to a format etime = time.mktime(time.strptime(end, format)) ptime = stime + prop * (etime - stime) return time.strftime(format, time.localtime(ptime)) def randomDate(start, end, prop): return strTimeProp(start, end, '%m-%d-%Y', prop) # Creación de un dataframe de prueba: schema = StructType( [ StructField("dates1", StringType(), True), StructField("dates2", StringType(), True) ] ) size = 32 numCol1 = [str(randomDate("1-1-1991", "1-1-1992", random.random())) for number in range(size)] numCol2 = [str(randomDate("1-1-1991", "1-1-1992", random.random())) for number in range(size)] # Building dataFrame: sqlContext = SQLContext(sc) df = sqlContext.createDataFrame(list(zip(numCol1, numCol2)),schema=schema) df.show(5) 

En el código anterior, se genera una columna de fecha aleatoria, aquí hay un ejemplo:

 +----------+----------+ | dates1| dates2| +----------+----------+ |12-21-1991|05-30-1991| |05-28-1991|01-23-1991| |03-01-1991|08-05-1991| |07-15-1991|05-13-1991| |07-21-1991|11-10-1991| +----------+----------+ 

Lo que estoy tratando de hacer es cambiar el formato de la fecha con el siguiente código (de la documentación de pySpark):

 # Changing date formats: df.select(date_format('dates1', 'MM-dd-yyy').alias('newFormat')).show(5) 

Pero me sale este mal resultado:

 +---------+ |newFormat| +---------+ | null| | null| | null| | null| | null| +---------+ 

Supongo que hay un problema relacionado con la cadena dataType pero al mismo tiempo, no entiendo por qué este código a continuación funciona y el código anterior no lo hace.

 fechas = ['1000-01-01', '1000-01-15'] df = sqlContext.createDataFrame(list(zip(fechas, fechas)), ['dates', 'd']) df.show() # Changing date formats: df.select(date_format('dates', 'MM-dd-yyy').alias('newFormat')).show() 

Salida:

 +----------+----------+ | dates| d| +----------+----------+ |1000-01-01|1000-01-01| |1000-01-15|1000-01-15| +----------+----------+ +----------+ | newFormat| +----------+ |01-01-1000| |01-15-1000| +----------+ 

Este último resultado es lo que quiero.

No funciona porque sus datos no son una representación válida de ISO 8601 y la conversión hasta la fecha devuelve NULL :

 sqlContext.sql("SELECT CAST('12-21-1991' AS DATE)").show() ## +----+ ## | _c0| ## +----+ ## |null| ## +----+ 

Primero deberá analizar los datos utilizando un formato personalizado:

 output_format = ... # Some SimpleDateFormat string df.select(date_format( unix_timestamp("dates1", "MM-dd-yyyy").cast("timestamp"), output_format ))