es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La función date_format en Spark muestra resultados nulos.

Tengo una fuente de datos como la siguiente:

order_id,order_date,order_customer_id,order_status
1,2013-07-25 00:00:00.0,11599,CERRADO
2,2013-07-25 00:00:00.0,256,PENDIENTE_PAGO
3,2013-07-25 00:00:00.0,12111,COMPLETO
4,2013-07-25 00:00:00.0,8827,CERRADO

Estoy tratando de convertir a formato mm/dd/yyyy solo para las órdenes CERRADO utilizando las siguientes consultas, pero obtengo un resultado nulo. ¿Puede ayudarme a obtener el formato de fecha requerido usando DSL o el método spark sql?

closed_df=ord_df.select(date_format(to_date('order_date','yyyy-mm-dd hh:mm:SS.a'),'mm/dd/yyyy') .\
                 alias("fecha_formateada")).show()

#output:

|fecha_formateada|
+----------------+
|            null|
|            null|

ord_df.createOrReplaceTempView("ordenes")
cld_df = spark.sql( """select order_id, date_format(to_date("order_date","yyyy-mm-dd hh:mm:ss.a"),'mm/dd/yyyy') as order_date,\
                     order_customer_id, order_status \
                     from ordenes where order_status = 'CERRADO'""").show()

#output:

|order_id|order_date|order_customer_id|order_status|
+--------+----------+-----------------+------------+
|       1|      null|            11599|      CERRADO|
|       4|      null|             8827|      CERRADO|
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con las consultas proporcionadas es que la función to_date espera que el parámetro del formato de fecha coincida con el formato real de la cadena de fecha. En este caso, el formato debería ser yyyy-MM-dd HH:mm:ss.SSS en lugar de yyyy-mm-dd hh:mm:SS.a o yyyy-mm-dd hh:mm:ss.a.

    Para convertir order_date al formato mm/dd/yyyy solo para pedidos CLOSED, se puede utilizar la siguiente consulta DSL:

    from pyspark.sql.functions import date_format
    
    closed_df = ord_df.filter(ord_df.order_status == 'CLOSED') \
                      .select(date_format('order_date', 'MM/dd/yyyy').alias('format_date'))
    
    closed_df.show()
    

    En esta consulta, la función filter se utiliza para seleccionar solo los pedidos CLOSED. Luego, se aplica la función date_format a la columna order_date para convertirla al formato MM/dd/yyyy, y la columna resultante se llama format_date.

    Alternativamente, también se puede utilizar la siguiente consulta SQL de Spark:

    cld_df = spark.sql("""
        SELECT order_id, date_format(to_date(order_date,'yyyy-MM-dd HH:mm:ss.SSS'),'MM/dd/yyyy') as order_date,
               order_customer_id, order_status
        FROM orders
        WHERE order_status = 'CLOSED' """
    )
    
    cld_df.show()
    

    En esta consulta, se utiliza la función to_date con el formato de fecha correcto para convertir la cadena order_date en un objeto de fecha, y luego se aplica la función date_format para convertirlo al formato MM/dd/yyyy. La columna resultante se llama order_date. La cláusula WHERE se utiliza para seleccionar solo pedidos CLOSED.

Comments are closed.