【问题标题】:Pivot Dataframe with multiple columns - Spark/Scala [duplicate]具有多列的 Pivot Dataframe - Spark/Scala [重复]
【发布时间】:2021-08-30 23:01:34
【问题描述】:

我有一个如下所示的数据框

+----------+----+----+----+
|      date|col1|col2|col3|
+----------+----+----+----+
|2021-05-01|  20|  30|  40|
|2021-05-02| 200| 300|  10|
+----------+----+----+----+

我希望将此数据帧旋转/转置为

+-----+----------+----------+
|col  |2021-05-01|2021-05-02|
+-----+----------+----------+
|Col1 |        20|       200|
|Col1 |        30|       300|
|Col1 |        40|        10|
+-----+----------+----------+

thisthis 等其他 stackoverflow 文章在一定程度上帮助了我,但我已经找到了解决方案。

我的方法是(所有失败的尝试)

scala> dUnion.groupBy("date").pivot("date").agg(first("col1")).show()
+----------+----------+----------+
|      date|2021-05-01|2021-05-02|
+----------+----------+----------+
|2021-05-02|      null|       200|
|2021-05-01|        20|      null|
+----------+----------+----------+

scala> dUnion.groupBy("date", "col1", "col2", "col3").pivot("date").agg(first("col1")).show()
+----------+----+----+----+----------+----------+
|      date|col1|col2|col3|2021-05-01|2021-05-02|
+----------+----+----+----+----------+----------+
|2021-05-02| 200| 300|  10|      null|       200|
|2021-05-01|  20|  30|  40|        20|      null|
+----------+----+----+----+----------+----------+

但我能想到的壁橱是

scala> dUnion.groupBy().pivot("date").agg(first("col1")).show()
+----------+----------+
|2021-05-01|2021-05-02|
+----------+----------+
|        20|       200|
+----------+----------+

【问题讨论】:

标签: scala apache-spark pivot


【解决方案1】:

这是可能的,但我认为这有点慢。

val schema = df.schema
val longForm = df.flatMap(row => {
    val col = row.getString(0)
    (1 until row.size).map(i => {
        (col, schema(i).name, row.getString(i))
    })
})

longForm.groupBy('_2).pivot('_1).agg(first('_3))
.withColumnRenamed("_2", "col").show(10, false)


+----+----------+----------+
|col |2021-05-01|2021-05-02|
+----+----------+----------+
|col3|40        |10        |
|col1|20        |200       |
|col2|30        |300       |
+----+----------+----------+

【讨论】:

  • 谢谢@Lamanus。这个解决方案对我有用。 stack 是看待这个问题的另一种方式,它对我有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 2016-02-22
相关资源
最近更新 更多