Я хочу транспонировать фрейм данных. Это всего лишь небольшая выдержка из моего исходного фрейма данных -
from pyspark.sql.functions import to_timestamp, date_format
valuesCol = [('22','ABC Ltd','U.K.','class 1',102),('22','ABC Ltd','U.K.','class 2',73),('22','ABC Ltd','U.K.','class 3',92),
('51','Eric AB','Sweden','class 1',52),('51','Eric AB','Sweden','class 2',34),('51','Eric AB','Sweden','class 3',11)]
df = sqlContext.createDataFrame(valuesCol,['ID','Firm','Country','Class','Revenue'])
df.show()
+---+-------+-------+-------+-------+
| ID| Firm|Country| Class|Revenue|
+---+-------+-------+-------+-------+
| 22|ABC Ltd| U.K.|class 1| 102|
| 22|ABC Ltd| U.K.|class 2| 73|
| 22|ABC Ltd| U.K.|class 3| 92|
| 51|Eric AB| Sweden|class 1| 52|
| 51|Eric AB| Sweden|class 2| 34|
| 51|Eric AB| Sweden|class 3| 11|
+---+-------+-------+-------+-------+
В PySpark
функции транспонирования как таковой нет. Один из способов добиться необходимого результата — создать 3 dataframes
на class1, class2 and class3
, а затем соединить их (left join
). Но это может потребовать перетасовки по сети, в зависимости от разделителя хэша, и это очень дорого. Я уверен, должен быть элегантный и простой способ.
Ожидаемый результат:
+---+-------+-------+-------+-------+-------+
| ID| Firm|Country| Class1| Class2| Class3|
+---+-------+-------+-------+-------+-------+
| 22|ABC Ltd| U.K.| 102| 73| 92|
| 51|Eric AB| Sweden| 52| 34| 11|
+---+-------+-------+-------+-------+-------+