我是Spark的新手,需要使用PySpark或Spark Sql将以下输入数据帧转置为所需的输出df (从行到列)的帮助。
输入数据帧-
A B C D
1 2 3 4
10 11 12 13
......
........所需的输出(转置)数据
A 1
B 2
C 3
D 4
A 11
B 12
C 13
D 14
....
......如果我可以根据我们的要求旋转输入数据(列),那就更好了。
发布于 2020-11-27 21:55:07
df = spark.createDataFrame([[1,2,3,4],[10,11,12,13]]).toDF('A','B','C','D')
+---+---+---+---+
| A| B| C| D|
+---+---+---+---+
| 1| 2| 3| 4|
| 10| 11| 12| 13|
+---+---+---+---+
df.select(
F.explode(
F.create_map(
*reduce(lambda x, y: x+y,
[[F.lit(col), col] for col in df.columns]
)
)
)
)
+---+-----+
|key|value|
+---+-----+
| A| 1|
| B| 2|
| C| 3|
| D| 4|
| A| 10|
| B| 11|
| C| 12|
| D| 13|
+---+-----+发布于 2020-11-27 22:06:00
在spark中使用stack函数。
Example:
df.show()
#+---+---+---+---+
#| A| B| C| D|
#+---+---+---+---+
#| 1| 2| 3| 4|
#| 10| 11| 12| 13|
#+---+---+---+---+
from pyspark.sql.functions import *
df.selectExpr("stack(4,'A',A,'B',B,'C',C,'D',D) as (key,value)").show()
#+---+-----+
#|key|value|
#+---+-----+
#| A| 1|
#| B| 2|
#| C| 3|
#| D| 4|
#| A| 10|
#| B| 11|
#| C| 12|
#| D| 13|
#+---+-----+发布于 2020-11-28 15:44:05
你可以像下面这样做一个泛化函数(灵感来自于我之前的答案here):
def stack_multiple_col(df,cols=df.columns,output_columns=["col","values"]):
"""stacks multiple columns in a dataframe,
takes all columns by default unless passed a list of values"""
return (f"""stack({len(cols)},{','.join(map(','.join,
(zip([f'"{i}"' for i in cols],cols))))}) as ({','.join(output_columns)})""")示例运行:
df.selectExpr(stack_multiple_col(df)).show()
+---+------+
|col|values|
+---+------+
| A| 1|
| B| 2|
| C| 3|
| D| 4|
| A| 10|
| B| 11|
| C| 12|
| D| 13|
+---+------+
df.selectExpr(stack_multiple_col(df,cols=['A','B'],output_columns=["A","B"])).show()
+---+---+
| A| B|
+---+---+
| A| 1|
| B| 2|
| A| 10|
| B| 11|
+---+---+https://stackoverflow.com/questions/65038470
复制相似问题