2017-07-11 29 views
5

Muszę obrócić więcej niż jedną kolumnę w ramce danych pyspark. dataframe próbka,Pivot wiele kolumn - pyspark

>>> d = [(100,1,23,10),(100,2,45,11),(100,3,67,12),(100,4,78,13),(101,1,23,10),(101,2,45,13),(101,3,67,14),(101,4,78,15),(102,1,23,10),(102,2,45,11),(102,3,67,16),(102,4,78,18)] 
>>> mydf = spark.createDataFrame(d,['id','day','price','units']) 
>>> mydf.show() 
+---+---+-----+-----+ 
| id|day|price|units| 
+---+---+-----+-----+ 
|100| 1| 23| 10| 
|100| 2| 45| 11| 
|100| 3| 67| 12| 
|100| 4| 78| 13| 
|101| 1| 23| 10| 
|101| 2| 45| 13| 
|101| 3| 67| 14| 
|101| 4| 78| 15| 
|102| 1| 23| 10| 
|102| 2| 45| 11| 
|102| 3| 67| 16| 
|102| 4| 78| 18| 
+---+---+-----+-----+ 

Teraz, gdy trzeba uzyskać kolumnę cen w wierszu dla każdego identyfikatora opartej na dzień, to można użyć metody pivot jak

>>> pvtdf = mydf.withColumn('combcol',F.concat(F.lit('price_'),mydf['day'])).groupby('id').pivot('combcol').agg(F.first('price')) 
>>> pvtdf.show() 
+---+-------+-------+-------+-------+ 
| id|price_1|price_2|price_3|price_4| 
+---+-------+-------+-------+-------+ 
|100|  23|  45|  67|  78| 
|101|  23|  45|  67|  78| 
|102|  23|  45|  67|  78| 
+---+-------+-------+-------+-------+ 

więc kiedy muszę kolumnę jednostek a także do transponowania jako ceny, albo muszę utworzyć jeszcze jedną ramkę danych jak wyżej dla jednostek, a następnie połączyć oba przy użyciu id.Ale, gdy mam więcej kolumn jako takich, próbowałem funkcji, aby to zrobić,

>>> def pivot_udf(df,*cols): 
...  mydf = df.select('id').drop_duplicates() 
...  for c in cols: 
...  mydf = mydf.join(df.withColumn('combcol',F.concat(F.lit('{}_'.format(c)),df['day'])).groupby('id').pivot('combcol').agg(F.first(c)),'id') 
...  return mydf 
... 
>>> pivot_udf(mydf,'price','units').show() 
+---+-------+-------+-------+-------+-------+-------+-------+-------+ 
| id|price_1|price_2|price_3|price_4|units_1|units_2|units_3|units_4| 
+---+-------+-------+-------+-------+-------+-------+-------+-------+ 
|100|  23|  45|  67|  78|  10|  11|  12|  13| 
|101|  23|  45|  67|  78|  10|  13|  14|  15| 
|102|  23|  45|  67|  78|  10|  11|  16|  18| 
+---+-------+-------+-------+-------+-------+-------+-------+-------+ 

Potrzebujesz sugestii na temat jeśli jest to dobra praktyka i jeśli jest jakikolwiek inny lepszy sposób robienia tego. Z góry dziękuję!

+0

Proszę odnieść się do tego linku, mam nadzieję, że to pomoże !! [https://stackoverflow.com/questions/37486910/pivot-string-column-on-pyspark-dataframe][1] –

Odpowiedz

0

Tak jak w wersji iskry 1.6 Myślę, że to jedyny sposób, ponieważ pivot przyjmuje tylko jedną kolumnę i istnieją drugie wartości atrybutów, na których można przekazać różne wartości tej kolumny, które spowodują, że kod będzie działał szybciej, ponieważ inaczej iskra musi uruchom to dla ciebie, więc tak, to jest właściwy sposób, aby to zrobić.