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.