【问题标题】:How to flatten a pyspark dataframes that contains multiple rows per id?如何展平每个 id 包含多行的 pyspark 数据帧?
【发布时间】:2020-01-17 05:20:47
【问题描述】:

我有一个 pyspark 数据框,其中包含两个 id 列 idid2。每个id 都精确重复n 次。所有id 都具有相同的一组id2。我正在尝试根据id2 将每个唯一id 产生的矩阵“展平”为一行。

这是一个示例来解释我想要实现的目标,我的数据框如下所示:

+----+-----+--------+--------+
| id | id2 | value1 | value2 |
+----+-----+--------+--------+
| 1  | 1   | 54     | 2      |
+----+-----+--------+--------+
| 1  | 2   | 0      | 6      |
+----+-----+--------+--------+
| 1  | 3   | 578    | 14     |
+----+-----+--------+--------+
| 2  | 1   | 10     | 1      |
+----+-----+--------+--------+
| 2  | 2   | 6      | 32     |
+----+-----+--------+--------+
| 2  | 3   | 0      | 0      |
+----+-----+--------+--------+
| 3  | 1   | 12     | 2      |
+----+-----+--------+--------+
| 3  | 2   | 20     | 5      |
+----+-----+--------+--------+
| 3  | 3   | 63     | 22     |
+----+-----+--------+--------+

所需的输出如下表:

+----+----------+----------+----------+----------+----------+----------+
| id | value1_1 | value1_2 | value1_3 | value2_1 | value2_2 | value2_3 |
+----+----------+----------+----------+----------+----------+----------+
| 1  | 54       | 0        | 578      | 2        | 6        | 14       |
+----+----------+----------+----------+----------+----------+----------+
| 2  | 10       | 6        | 0        | 1        | 32       | 0        |
+----+----------+----------+----------+----------+----------+----------+
| 3  | 12       | 20       | 63       | 2        | 5        | 22       |
+----+----------+----------+----------+----------+----------+----------+

所以,基本上,对于每个唯一的 id 和每一列 col,我将有 n 新列 col_1,...对于每个 n id2 值。

任何帮助将不胜感激!

【问题讨论】:

标签: pyspark apache-spark-sql pyspark-dataframes


【解决方案1】:

在 Spark 2.4 中你可以这样做

var df3 =Seq((1,1,54 , 2 ),(1,2,0  , 6 ),(1,3,578, 14),(2,1,10 , 1 ),(2,2,6  , 32),(2,3,0  , 0 ),(3,1,12 , 2 ),(3,2,20 , 5 ),(3,3,63 , 22)).toDF("id","id2","value1","value2")


scala> df3.show()
+---+---+------+------+
| id|id2|value1|value2|
+---+---+------+------+
|  1|  1|    54|     2|
|  1|  2|     0|     6|
|  1|  3|   578|    14|
|  2|  1|    10|     1|
|  2|  2|     6|    32|
|  2|  3|     0|     0|
|  3|  1|    12|     2|
|  3|  2|    20|     5|
|  3|  3|    63|    22|
+---+---+------+------+

使用 coalesce 检索 id 的第一个值。

scala> var df4 = df3.groupBy("id").pivot("id2").agg(coalesce(first("value1")),coalesce(first("value2"))).orderBy(col("id"))

scala> val newNames = Seq("id","value1_1","value2_1","value1_2","value2_2","value1_3","value2_3")

重命名列

scala>  df4.toDF(newNames: _*).show()
+---+--------+--------+--------+--------+--------+--------+
| id|value1_1|value2_1|value1_2|value2_2|value1_3|value2_3|
+---+--------+--------+--------+--------+--------+--------+
|  1|      54|       2|       0|       6|     578|      14|
|  2|      10|       1|       6|      32|       0|       0|
|  3|      12|       2|      20|       5|      63|      22|
+---+--------+--------+--------+--------+--------+--------+

如果需要,重新排列列。如果您有任何与此相关的问题,请告诉我。快乐HAdoop

【讨论】:

  • @Achraf Oussidi 接受答案,如果它解决你的目的
猜你喜欢
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
相关资源
最近更新 更多