2017-07-11 15 views
5

मुझे एक पिसपार्क डेटाफ्रेम में एक से अधिक स्तंभों को पिवॉट करने की आवश्यकता है। नमूना dataframe,पिवोट एकाधिक कॉलम - 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| 
+---+---+-----+-----+ 

अब, अगर मैं दिन के आधार पर प्रत्येक आईडी के लिए एक पंक्ति में मूल्य स्तंभ प्राप्त करने की आवश्यकता है, तो मैं धुरी विधि का उपयोग कर सकते हैं, के रूप में

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

इसलिए जब मैं इकाइयों स्तंभ की जरूरत है साथ ही कीमत के रूप में स्थानांतरित करने के लिए, या तो मैं इकाइयों के लिए ऊपर के रूप में एक और dataframe बनाने के लिए और फिर दोनों id.But, का उपयोग कर जब मैं इस तरह के रूप में अधिक कॉलम में शामिल होने के मिल गया, मैं यह करने के लिए एक समारोह, की कोशिश की

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

पर सुझावों की आवश्यकता है, अगर ऐसा करने का अच्छा अभ्यास है और यदि ऐसा करने का कोई और बेहतर तरीका है। अग्रिम में धन्यवाद!

+0

कृपया इस लिंक का संदर्भ लें, मुझे आशा है कि इससे मदद मिलेगी !! [Https://stackoverflow.com/questions/37486910/pivot-string-column-on-pyspark-dataframe][1] –

उत्तर

0

स्पार्क 1.6 संस्करण के रूप में मुझे लगता है कि यह एकमात्र तरीका है क्योंकि पिवोट केवल एक कॉलम लेता है और दूसरा विशेषता मान है जिस पर आप उस कॉलम के विशिष्ट मानों को पार कर सकते हैं जो आपके कोड को तेज़ी से चलाएंगे क्योंकि अन्यथा स्पार्क को यह आपके लिए चलाओ, तो हाँ यह करने का सही तरीका है।