#python #apache-spark #pyspark
Вопрос:
Мой текущий фрейм данных pyspark выглядит следующим образом:
Region Location Month Services Type values_in_millions values_in_percent USA USA 1/1/2021 ABC DC 101537.553 34.775 Europe Italy 2/1/2021 ABC DC 434404.87 44.653 Europe Spain 2/1/2021 ABC DC 895057.332 21.925 Asia India 3/1/2021 ABC DC 211963.21 27.014
Мой желаемый фрейм данных должен быть в этой форме:
Region Location Month Services Type key_1 values_1 values_2 USA USA 1/1/2021 ABC DC values_in_millions 101537.553 Europe Italy 2/1/2021 ABC DC values_in_millions 434404.87 Europe Spain 2/1/2021 ABC DC values_in_millions 895057.332 Asia India 3/1/2021 ABC DC values_in_millions 211963.21 USA USA 1/1/2021 ABC DC values_in_percent 34.775% Europe Italy 2/1/2021 ABC DC values_in_percent 44.653% Europe Spain 2/1/2021 ABC DC values_in_percent 21.925% Asia India 3/1/2021 ABC DC values_in_percent 27.014%
Любые подходы помогут..
Ответ №1:
Вы можете создать 2 отдельных фрейма данных. df1 — это с помощью key_1 = ‘value_in_millions’, а df2-с помощью key_1 = ‘value_in_percent’. То, что я делаю ниже, — это сначала выбираю необходимые столбцы, жестко кодирую значения в столбце key_1, жестко кодирую столбцы «values_1» и «values_2» и, наконец, повторно выбираю столбцы, чтобы они были расположены в том же порядке.
from pyspark.sql.functions import lit df1 = df.select("Region","Location","Month","Services","Type","value_in_millions").withColumn("key_1",lit("value_in_millions")).withColumn("values_2",lit("")).withColumnRenamed("value_in_millions", "values_1").select("Region","Location","Month","Services","Type","key_1","values_1","values_2") df2 = df.select("Region","Location","Month","Services","Type","value_in_percent").withColumn("key_1",lit("value_in_percent")).withColumn("values_1",lit("")).withColumnRenamed("value_in_percent", "values_2").select("Region","Location","Month","Services","Type","key_1","values_1","values_2") df1.show() df2.show()
Выходные данные приведены ниже.
------ -------- ---------- -------- ---- ----------------- -------- -------- |Region|Location| Month|Services|Type| key_1|values_1|values_2| ------ -------- ---------- -------- ---- ----------------- -------- -------- | USA| USA|2001-01-01| ABC| DC|value_in_millions| 100000| | | IND| DLH|2001-01-01| ABC| DC|value_in_millions| 200000| | | NYC| NYC|2001-01-01| ABC| DC|value_in_millions| 300000| | | UK| WALES|2001-01-01| ABC| DC|value_in_millions| 400000| | ------ -------- ---------- -------- ---- ----------------- -------- -------- ------ -------- ---------- -------- ---- ---------------- -------- -------- |Region|Location| Month|Services|Type| key_1|values_1|values_2| ------ -------- ---------- -------- ---- ---------------- -------- -------- | USA| USA|2001-01-01| ABC| DC|value_in_percent| | 34| | IND| DLH|2001-01-01| ABC| DC|value_in_percent| | 35| | NYC| NYC|2001-01-01| ABC| DC|value_in_percent| | 36| | UK| WALES|2001-01-01| ABC| DC|value_in_percent| | 37| ------ -------- ---------- -------- ---- ---------------- -------- --------
Как только они будут переупорядочены в том же порядке, я смогу объединить 2 кадра данных.
from functools import reduce # For Python 3.x from pyspark.sql import DataFrame def unionAll(*dfs): return reduce(DataFrame.unionAll, dfs) df3 = unionAll(df1, df2) df3.show()
Вывод приведен ниже.
------ -------- ---------- -------- ---- ----------- -------- -------- |Region|Location| Month|Services|Type| key1|values_1|values_2| ------ -------- ---------- -------- ---- ----------- -------- -------- | USA| USA|2001-01-01| ABC| DC|valueinmill| 100000| | | IND| DLH|2001-01-01| ABC| DC|valueinmill| 200000| | | NYC| NYC|2001-01-01| ABC| DC|valueinmill| 300000| | | UK| WALES|2001-01-01| ABC| DC|valueinmill| 400000| | | USA| USA|2001-01-01| ABC| DC| valueinpct| | 34| | IND| DLH|2001-01-01| ABC| DC| valueinpct| | 35| | NYC| NYC|2001-01-01| ABC| DC| valueinpct| | 36| | UK| WALES|2001-01-01| ABC| DC| valueinpct| | 37| ------ -------- ---------- -------- ---- ----------- -------- --------