Saltar al contenido

¿Cómo pivotar en varias columnas en Spark SQL?

Estate atento porque en esta sección vas a hallar el arreglo que buscas.

Solución:

Aquí hay una forma que no es UDF que involucra un solo pivote (por lo tanto, solo un escaneo de una sola columna para identificar todas las fechas únicas).

dff = mydf.groupBy('id').pivot('day').agg(F.first('price').alias('price'),F.first('units').alias('unit'))

Aquí está el resultado (disculpas por el orden y los nombres que no coinciden):

+---+-------+------+-------+------+-------+------+-------+------+               
| id|1_price|1_unit|2_price|2_unit|3_price|3_unit|4_price|4_unit|
+---+-------+------+-------+------+-------+------+-------+------+
|100|     23|    10|     45|    11|     67|    12|     78|    13|
|101|     23|    10|     45|    13|     67|    14|     78|    15|
|102|     23|    10|     45|    11|     67|    16|     78|    18|
+---+-------+------+-------+------+-------+------+-------+------+

Simplemente agregamos ambos en el price y el unit columna después de pivotar en el día.

Si se requiere nombrar como en cuestión,

dff.select([F.col(c).name('_'.join(x for x in c.split('_')[::-1])) for c in dff.columns]).show()

+---+-------+------+-------+------+-------+------+-------+------+
| id|price_1|unit_1|price_2|unit_2|price_3|unit_3|price_4|unit_4|
+---+-------+------+-------+------+-------+------+-------+------+
|100|     23|    10|     45|    11|     67|    12|     78|    13|
|101|     23|    10|     45|    13|     67|    14|     78|    15|
|102|     23|    10|     45|    11|     67|    16|     78|    18|
+---+-------+------+-------+------+-------+------+-------+------+

La solución en la pregunta es la mejor que pude obtener. La única mejora sería cache el conjunto de datos de entrada para evitar el doble escaneo, es decir

mydf.cache
pivot_udf(mydf,'price','units').show()

Como en la versión Spark 1.6, creo que esa es la única forma porque pivot toma solo una columna y hay una segunda attribute valores en los que puede pasar los distintos valores de esa columna que harán que su código se ejecute más rápido porque, de lo contrario, Spark tiene que ejecutarlo por usted, así que sí, esa es la forma correcta de hacerlo.

Calificaciones y reseñas

Te invitamos a reafirmar nuestro análisis mostrando un comentario o valorándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *