2017-12-28 17 views
0

Ich habe eine Anforderung, Pivot auf unter Tabelle zu verwenden.Pivot in PYSPARKSQL

id,week,score 
102,1,96 
101,1,138 
102,1,37 
101,1,59 
101,2,282 
102,2,212 
102,2,78 
101,2,97 
102,3,60 
102,3,123 
101,3,220 
101,3,87 

Ausgang

 1   2   3 

101 138,59 282,97  220,87 
102 96,37 212,78  123,60 

hier i sortieren müssen

Punkte Ich habe unten Code versucht, aber es funktioniert nur, wenn es einen einzelnen Datensatz auf einer bestimmten ID ist

df.groupBy("id").pivot("week").agg(first("score")) 
+1

Mögliche Duplikat von [Wie Datenrahmen schwenken?] (Https://stackoverflow.com/questions/30244910/how-to-pivot-dataframe) –

+0

Nein shankar, hier erwarte ich alle Datensätze als Array. Überprüfen Sie bitte die erwartete Ausgabe. – LUZO

Antwort

3

Anstelle von first sollten Sie alle Werte miterfassen, dies wird Ihnen das Ergebnis in der Liste geben

import org.apache.spark.sql.functions._ 

df.groupBy("id").pivot("week").agg(collect_list("score")).show() 

Ausgang:

+---+---------+---------+---------+ 
|id |1  |2  |3  | 
+---+---------+---------+---------+ 
|101|[138, 59]|[282, 97]|[220, 87]| 
|102|[96, 37] |[212, 78]|[60, 123]| 
+---+---------+---------+---------+ 
+0

Kann ich die obige Ausgabe mithilfe von SQL-Abfrage in Pyspark mit verführerisch verwenden. – LUZO

1

Equivalent Python Code für pyspark für die scala Antwort gepostet von Prasad Khode ist als unten

from pyspark.sql import functions as F 
df.groupBy("id").pivot("week").agg(F.collect_list("score")).show() 

Wenn Sie das api-Dokument überprüfen, können Sie

sehen

collect_list (Spalte e)
Aggregatfunktion: gibt eine Liste von Objekten mit Duplikaten zurück.

Sie können auch collect_set verwenden, die Ihnen die gleiche Ausgabe mit entfernten Duplikaten geben wird.

df.groupBy("id").pivot("week").agg(F.collect_set("score")).show() 

api Dokument sagt der folgende

collect_set (Spalte e)
Aggregat Funktion: eine Reihe von Objekten mit doppelten Elementen zurückgibt eliminiert.

+0

Vielen Dank für Ihre Eingabe Ramesh, Mai ich habe eine Chance, die gleiche Ausgabe mit SQL-Abfrage in Pyspark erhalten. Ich habe diese Abfrage verwendet, die Fehler zeigt "ID auswählen, Liste ((Fall, wenn Woche = 1 dann punkten sonst Null Ende) als" 1 ",", "), Liste ((Fall, wenn Woche = 2 dann punkten sonst null Ende) als '2', ','), list ((fall wenn woche = 3 dann punkte sonst null ende) als' 3', ',') von d gruppe nach id " – LUZO

+0

@LUZO, ich fürchte ich kann ' t s eine gute Hilfe zu sein, da SQL-Abfragen Alpträume für mich sind. :) Sie können eine weitere Frage mit sehr detaillierten Angaben zu Ihren Anforderungen stellen. Sie werden sicherlich eine Antwort bekommen. –

+0

hahaha kein Problem :) – LUZO