Pyspark 将宽数据帧转换为长数据帧
我有一个数据框,看起来像:Pyspark 将宽数据帧转换为长数据帧,pyspark,apache-spark-sql,pyspark-dataframes,Pyspark,Apache Spark Sql,Pyspark Dataframes,我有一个数据框,看起来像: Region, 2000Q1, 2000Q2, 2000Q3, ... A, 1,2,3,... 我想按“区域”将这个宽表转换成一个长表。因此,最终产品将如下所示: Region, Time, Value A, 2000Q1,1 A, 2000Q2, 2 A, 2000Q3, 3 A, 2000Q4, 4 .... 原始表具有非常广泛的列数组,但聚合级别始终为region,其余列设置为Transposition 您知道一种简单的方法或函数吗?尝试使用数组函数,然后
Region, 2000Q1, 2000Q2, 2000Q3, ...
A, 1,2,3,...
我想按“区域”将这个宽表转换成一个长表。因此,最终产品将如下所示:
Region, Time, Value
A, 2000Q1,1
A, 2000Q2, 2
A, 2000Q3, 3
A, 2000Q4, 4
....
原始表具有非常广泛的列数组,但聚合级别始终为region,其余列设置为Transposition
您知道一种简单的方法或函数吗?尝试使用
数组
函数,然后分解数组
df=spark.createDataFrame([('A',1,2,3)],['Region','2000q1','2000q2','2000q3'])
from pyspark.sql.functions import *
from pyspark.sql.types import *
df.withColumn("cc",explode(arrays_zip(array(cols),split(lit(col_name),"\\|")))).\
select("Region","cc.*").\
toDF(*['Region','Value','Time']).\
show()
#+------+-----+------+
#|Region|Value| Time|
#+------+-----+------+
#| A| 1|2000q1|
#| A| 2|2000q2|
#| A| 3|2000q3|
#+------+-----+------+
示例:
df=spark.createDataFrame([('A',1,2,3)],['Region','2000q1','2000q2','2000q3'])
from pyspark.sql.functions import *
from pyspark.sql.types import *
df.withColumn("cc",explode(arrays_zip(array(cols),split(lit(col_name),"\\|")))).\
select("Region","cc.*").\
toDF(*['Region','Value','Time']).\
show()
#+------+-----+------+
#|Region|Value| Time|
#+------+-----+------+
#| A| 1|2000q1|
#| A| 2|2000q2|
#| A| 3|2000q3|
#+------+-----+------+
类似,但柱计算有所改进
cols = df.columns
cols.remove('Region')
import pyspark.sql.functions as f
df.withColumn('array', f.explode(f.arrays_zip(f.array(*map(lambda x: f.lit(x), cols)), f.array(*cols), ))) \
.select('Region', 'array.*') \
.toDF('Region', 'Time', 'Value') \
.show(30, False)
+------+------+-----+
|Region|Time |Value|
+------+------+-----+
|A |2000Q1|1 |
|A |2000Q2|2 |
|A |2000Q3|3 |
|A |2000Q4|4 |
|A |2000Q5|5 |
+------+------+-----+
p、 不要把这当作一个答案:)你想做的就是融化。你应该试试类似的东西。