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.

Pyspark – clasificación del dataframe de Hive por dos columnas rompe el dataframe.

Tengo un problema para ordenar un dataframe desde el contexto hive de HDFS. Estoy intentando ordenar un dataframe con una estructura similar a la siguiente:


+---+--------------+---------------+
| id|parameter_name|parameter_value|
+---+--------------+---------------+
|id1| name_en | value a |
|id1| name_il | value b |
|id1| address_en| value c |
|id1| address_il| value d |
|id2| name_il | value f |
|id2| name_en | value e |
|id2| address_il| value h |
|id1| address_en| value g |
+---+--------------+---------------+

Estoy tratando de ordenar este dataframe de tal manera que el id esté ordenado y la secuencia de nombres de parámetros en el dataframe para cada id sea la siguiente:


name_en
name_il
address_en
address_il

Tenga en cuenta que en el ejemplo esto no es así y los nombres y direcciones entre los id se invierten.

Intentar usar df.sort([‘id’, ‘parameter_name’]) produce resultados mezclados, mezclando aún más el dataframe y dividiendo el id a:


id1, name_en
id1, name_il
id2, name_il
id2, name_en
id1, address_en
id1, address_il
id2, address_il
id2, address_en

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el orden de clasificación deseado, puede crear un orden de clasificación personalizado y usarlo en la función sort. Así es como se puede hacer:

    from pyspark.sql.functions import col, when
    
    # definir el orden de clasificación personalizado para parameter_name
    order_dict = {'name_en': 1,
                  'name_il': 2,
                  'address_en': 3,
                  'address_il': 4}
    
    # agregar una nueva columna con el orden de clasificación en función de parameter_name
    df = df.withColumn('sort_order', when(col('parameter_name').isin(order_dict.keys()),
                                         order_dict[col('parameter_name')]).otherwise(5))
    
    # ordenar el dataframe por (id, sort_order)
    sorted_df = df.sort('id', 'sort_order')
    
    # eliminar la columna 'sort_order'
    sorted_df = sorted_df.drop('sort_order')
    

    Este código primero define un diccionario order_dict que mapea cada parameter_name a un orden de clasificación. Luego, agrega una nueva columna sort_order al dataframe usando una declaración condicional que verifica si parameter_name está en order_dict y le asigna el orden de clasificación correspondiente, de lo contrario le asigna el valor 5. Finalmente, ordena el dataframe por id y sort_order, y elimina la columna sort_order para obtener el resultado final deseado.

Comments are closed.