如何使用 python 在 Spark 中转置 DataFrame 而不进行聚合
Posted
技术标签:
【中文标题】如何使用 python 在 Spark 中转置 DataFrame 而不进行聚合【英文标题】:How to Transpose DataFrame Without Aggregation in Spark using python 【发布时间】:2021-09-08 14:14:56 【问题描述】:这是输入数据框
+-----------+--------+--------+--------+--------+
|COLUMN_NAME| VALUE1 | VALUE2 | VALUE3 | VALUEN |
+-----------+--------+--------+--------+--------+
|col1 | val11 | val21 | val31 | valN1 |
|col2 | val12 | val22 | val32 | valN2 |
|col3 | val13 | val23 | val33 | valN3 |
|col4 | val14 | val24 | val34 | valN4 |
|col5 | val15 | val25 | val35 | valN5 |
+-----------+--------+--------+--------+--------+
我想转置如下:
+------+-------+------+-------+------+
|col1 | col2 |col3 | col4 |col5 |
+------+-------+------+-------+------+
|val11 | val12 |val13 | val14 |val15 |
|val21 | val22 |val23 | val24 |val25 |
|val31 | val32 |val33 | val34 |val35 |
|valN1 | valN2 |valN3 | valN4 |valN5 |
+------+-------+------+-------+------+
【问题讨论】:
请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。 【参考方案1】:你的问题不是很清楚,但是如果你的数据框不是太大,你可以使用Pandas Melt function
df_pandas = df.toPandas()
df_pandas = df_pandas.melt(id_vars=['COLUMN_NAME'],value_vars=['VALUE_VARS'])
df_spark = spark.createDataFrame(df_pandas)
如果你的 df 很大,我会使用koalas melt function
Spark 也有 stack
功能,不太直观。
【讨论】:
感谢您的建议。这里的挑战是将 n 个 value_vars 传递给 melt 命令。我能够使用来自***.com/a/49403834/10736536 的 scala 代码,它工作正常,我想将其转换为 pyspark 代码, value_vars 的数量不同。我的一个输入数据帧有 5 个 value_vars,另一个数据帧有 7 个 value_vars。这就是为什么我尝试使用应该处理任意数量的 value_vars 的通用函数。希望这可以帮助。感谢您的帮助。 @Abhy 为什么我们不像这样获取 var cols ->cols = df.columns
然后删除 id_vars,将值 cols 列表传递给 melt 函数? cols.remove('id_vars')
只会留下值 vars。以上是关于如何使用 python 在 Spark 中转置 DataFrame 而不进行聚合的主要内容,如果未能解决你的问题,请参考以下文章
使用scala在Spark中转置DataFrame而不进行聚合
在 Spark Scala 中转置 DataFrame 列 [重复]