2017-07-11 29 views
5

Bir pyspark veri karesinde birden fazla sütunu döndürmem gerekiyor. Gün bağlı olarak her kimliği için bir satıra fiyat sütunu almak gerekirseBirden çok sütun döndürme - pyspark

>>> 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| 
+---+-------+-------+-------+-------+ 

yüzden birimleri sütunu gerektiğinde gibi Numune dataframe, Şimdi

>>> 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| 
+---+---+-----+-----+ 

, o zaman Pivot yöntemi kullanabilirsiniz yanı fiyat olarak aktarılmış, ya ben birimleri için yukarıdaki gibi bir daha dataframe oluşturmak ve sonra gibi daha fazla sütun olduğunda hem id.But kullanarak katılmak lazım edilecek, bunu yapmak için bir işlev, denedik

>>> 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| 
+---+-------+-------+-------+-------+-------+-------+-------+-------+ 

Önerilere onayla, eğer bunu yapmak için iyi bir uygulama ve bunu yapmak için daha iyi bir yol varsa. Şimdiden teşekkürler!

+0

Lütfen bu bağlantıya bakın, umarım bu yardımcı olur !! [Https://stackoverflow.com/questions/37486910/pivot-string-column-on-pyspark-dataframe][1] –

cevap

0

Kıvılcım 1.6 sürümünde olduğu gibi tek yol budur çünkü pivot sadece bir sütun alır ve kodun daha hızlı çalışmasını sağlayacak sütunun farklı değerlerini iletebileceğiniz ikinci özellik değerleri vardır, aksi halde kıvılcım var Bunu senin için çalıştır, bu yüzden bunu yapmanın doğru yolu.

İlgili konular