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.

¿Python dataframe o actualización de HiveSql basado en el valor del predecesor?

Tengo un millón de filas que necesito actualizar, buscando el recuento más alto del predecesor de los mismos datos fuente y reemplazando el mismo valor en una fila diferente.

Por ejemplo:

DF original.

sno Object Name shape rating 1 Fruit apple round 1.0 2 Fruit apple round 2.0 3 Fruit apple square 2.5 4 Fruit orange round 1.5

DF objetivo.

sno Object Name shape rating 1 Fruit apple round 1.0 2 Fruit apple round 2.0 3 Fruit apple round 2.5 <– detecta automáticamente la diferencia en la columna de forma y actualiza de cuadrada a redonda 4 Fruit orange round 1.5

Por favor, aconseje como lograrlo en Databricks utilizando PySpark, HiveSQL o Scala.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr esto en PySpark, se puede usar el siguiente enfoque:

    1. Agrupar los datos por las columnas “Nombre del objeto” y “forma”.
    2. Calcular la calificación máxima para cada grupo.
    3. Unir los datos originales con las calificaciones máximas calculadas basadas en el “Nombre del objeto”, “forma” y “calificación”.
    4. Usar la función “coalesce” para actualizar el valor de “forma” en las filas que tienen una forma diferente a la que tiene la calificación máxima.

    Aquí está el código de PySpark para implementar el enfoque anterior:

    from pyspark.sql.functions import col, max, coalesce
    
    # Leer los datos originales como un DataFrame
    df = spark.read.format("csv").option("header", "true").load("ruta/a/datos/originales.csv")
    
    # Agrupar los datos por "Nombre del objeto" y "forma", y calcular la calificación máxima para cada grupo
    max_ratings = df.groupBy("Nombre del objeto", "forma").agg(max("calificación").alias("calificación máxima"))
    
    # Unir los datos originales con las calificaciones máximas calculadas basadas en "Nombre del objeto", "forma" y "calificación"
    df = df.join(max_ratings, ["Nombre del objeto", "forma", "calificación"])
    
    # Actualizar la columna "forma" en las filas que tienen una forma diferente a la que tiene la calificación máxima
    df = df.select(
        "número de serie",
        "Nombre del objeto",
        coalesce(col("forma"), col("forma máxima")).alias("forma"),
        "calificación máxima"
    )
    

    Para lograr esto en Hive SQL, se puede usar el siguiente enfoque:

    1. Crear una tabla temporal para calcular la calificación máxima para cada combinación de “Nombre del objeto” y “forma”.
    2. Usar una auto-unión para encontrar las filas con la calificación máxima para cada combinación de “Nombre del objeto” y “forma”.
    3. Usar una declaración “CASE” para actualizar la columna “forma” en las filas que tienen una forma diferente a la que tiene la calificación máxima.

    Aquí está el código de Hive SQL para implementar el enfoque anterior:

    -- Crear una tabla temporal para calcular la calificación máxima para cada combinación de Nombre del objeto y forma
    CREATE TEMPORARY TABLE calificaciones_máximas AS
    SELECT `Nombre del objeto`, forma, MAX(calificación) AS calificación_máxima
    FROM datos_originales
    GROUP BY `Nombre del objeto`, forma;
    
    -- Usar una auto-unión para encontrar las filas con la calificación máxima para cada combinación de "Nombre del objeto" y "forma"
    -- Usar una declaración "CASE" para actualizar la columna "forma" en las filas que tienen una forma diferente a la que tiene la calificación máxima
    SELECT número de serie, `Nombre del objeto`,
      CASE
        WHEN forma <> forma_máxima THEN forma_máxima
        ELSE forma
      END AS forma,
      calificación_máxima
    FROM datos_originales o
    JOIN (
      SELECT `Nombre del objeto`, forma, MAX(calificación) AS calificación_máxima, forma AS forma_máxima
      FROM datos_originales
      JOIN calificaciones_máximas USING (`Nombre del objeto`, forma, calificación)
      GROUP BY `Nombre del objeto`, forma, forma_máxima
    ) r ON o.`Nombre del objeto` = r.`Nombre del objeto` AND o.forma = r.forma AND o.calificación = r.calificación_máxima;
    

    Para lograr esto en Scala, se puede usar el mismo enfoque que en PySpark:

    1. Agrupar los datos por las columnas “Nombre del objeto” y “forma”.
    2. Calcular la calificación máxima para cada grupo.
    3. Unir los datos originales con las calificaciones máximas calculadas basadas en el “Nombre del objeto”, “forma” y “calificación”.
    4. Usar la función “coalesce” para actualizar el valor de “forma” en las filas que tienen una forma diferente a la que tiene la calificación máxima.

    Aquí está el código en Scala para implementar el enfoque anterior:

    import org.apache.spark.sql.functions.{col, max, coalesce}
    
    // Leer los datos originales como un DataFrame
    val df = spark.read.format("csv").option("header", "true").load("ruta/a/datos/originales.csv")
    
    // Agrupar los datos por "Nombre del objeto" y "forma", y calcular la calificación máxima para cada grupo
    val calificaciones_máximas = df.groupBy("Nombre del objeto", "forma").agg(max("calificación").alias("calificación máxima"))
    
    // Unir los datos originales con las calificaciones máximas calculadas basadas en "Nombre del objeto", "forma", y "calificación"
    val df_unido = df.join(calificaciones_máximas, Seq("Nombre del objeto", "forma", "calificación"))
    
    // Actualizar la columna "forma" en las filas que tienen una forma diferente a la que tiene la calificación máxima
    val df_actualizado = df_unido.select(
      col("número de serie"),
      col("Nombre del objeto"),
      coalesce(col("forma"), col("forma máxima")).alias("forma"),
      col("calificación máxima")
    )
    

Comments are closed.