Spark根据某些条件合并行并保留值

时间:2018-10-24 14:12:26

标签: scala apache-spark apache-spark-sql

我有一些如下数据框:

+--------------------+-------------+----------+--------------------+------------------+
|       cond         | val         |  val1    |          val2      |         val3     |
+--------------------+-------------+----------+--------------------+------------------+
|cond1               | 1           | null     | null               |        null      |
|cond1               | null        | 2        | null               |        null      |
|cond1               | null        | null     | 3                  |        null      |
|cond1               | null        | null     | null               |        4         |
|cond2               | null        | null     | null               |        44        |
|cond2               | null        | 22       | null               |        null      |
|cond2               | null        | null     | 33                 |        null      |
|cond2               | 11          | null     | null               |        null      |
|cond3               | null        | null     | null               |        444       |
|cond3               | 111         | 222      | null               |        null      |
|cond3               | 1111        | null     | null               |        null      |
|cond3               | null        | null     | 333                |        null      | 

我想减少某些列的基于数字的值,我希望结果列如下所示:

+--------------------+-------------+----------+--------------------+------------------+
|       cond         | val         |  val1    |          val2      |         val3     |
+--------------------+-------------+----------+--------------------+------------------+
|cond1               | 1           | 2        | 3                  |        4         |
|cond2               | 11          | 22       | 33                 |        44        |
|cond3               | 111,1111    | 222      | 333                |        444       |

1 个答案:

答案 0 :(得分:0)

尝试使用.groupBy()和.agg()例如

val output = input.groupBy("cond")
  .agg(collect_list("val").name("val"))
  .agg(collect_list("val1").name("val1"))
  .agg(collect_list("val2").name("val2"))
  .agg(collect_list("val3").name("val3"))