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.

Py (Spark) orden más grande y orden total

Tengo datos en los que tengo el ID del cliente, el ID del producto y el monto total ordenado. En algunos casos, un cliente puede ordenar varios productos o viceversa.

Ahora quiero sumar según el ID del cliente y el producto que ordenaron.

Esta parte va bien para mí.

Pero al mismo tiempo, quiero tener información sobre el mayor pedido realizado.

cust_id prod_id order_amount
4726050 805300 6000
4726050 805300 12000
4733572 413800 25000
4733968 415400 4000
4733981 798400 8000
4735096 412200 14000
4735096 410600 32000
4735096 414200 15000
4735096 410600 7000
4735200 470600 5000

Intenté el siguiente código en pyspark.

order_df.createOrReplaceTempView(‘order_df’)
order_agg_df = spark.sql(“””
SELECT cust_id, prod_id,
MAX(order_amount) as largest_order,
SUM(order_amount) as `total_order
FROM
order_df
GROUP BY 1, 2
“””)
display(order_agg_df)

El problema que tengo es que obtengo el monto total de la orden para “largest_order”.

Cualquier ayuda o sugerencia sería apreciada.

Gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como se mencionó, está tratando de obtener el pedido más grande realizado por cada cliente para cada producto que pidieron junto con el monto total del pedido realizado. Puede lograr esto agregando una subconsulta y uniendo los resultados con los resultados agregados usando cust_id, prod_id y order_amount. La subconsulta obtendrá el monto del pedido más grande para cada grupo (cust_id, prod_id).

    Código actualizado en pyspark:

    order_df.createOrReplaceTempView('order_df')
    
    order_agg_df = spark.sql("""
        SELECT 
            o.cust_id, 
            o.prod_id,
            m.max_order_amount as largest_order,
            SUM(o.order_amount) as total_order
        FROM 
            order_df o
        JOIN (
            SELECT cust_id, prod_id, MAX(order_amount) as max_order_amount
            FROM order_df
            GROUP BY 1, 2
        ) m ON o.cust_id = m.cust_id AND o.prod_id = m.prod_id AND o.order_amount = m.max_order_amount
        GROUP BY 1, 2, m.max_order_amount
    """)
    display(order_agg_df)
    

    Esto debería darle el resultado deseado.

Comments are closed.