通过 id 合并数据框中的行,试图避免列中的空值(Spark scala)

merge rows in a dataframe by id trying to avoid null values in columns (Spark scala)

我在 Spark scala 中开发,我想合并数据框中的一些行...

我的数据框是下一个:

+-------------------------+-------------------+---------------+------------------------------+
|name                     |col1               |col2           |col3                          |
+-------------------------+-------------------+---------------+------------------------------+
|                    a    |               null|           null|                      0.000000|
|                    a    |           0.000000|           null|                          null|
|                    b    |               null|           null|                      0.000000|
|                    b    |         300.000000|           null|                          null|
+-------------------------+-------------------+---------------+------------------------------+

我想打开下一个数据帧:

+-------------------------+-------------------+---------------+------------------------------+
|name                     |col1               |col2           |col3                          |
+-------------------------+-------------------+---------------+------------------------------+
|                    a    |           0.000000|           null|                      0.000000|
|                    b    |         300.000000|           null|                      0.000000|
+-------------------------+-------------------+---------------+------------------------------+

考虑到:

-某些列的所有值都可以为空。

-数据框中可以有很多列。


据我所知,我必须将 groupBy 与 agg() 一起使用,但我无法获得正确的表达式:

df.groupBy("name").agg()
df = df.groupby('name').ffill().bfill().drop_duplicates(keep='first')
df.update(df.groupby('name').ffill().bfill())
df.drop_duplicates(keep='first', inplace=True)

结果 df:

name col1 col2 col3
a 0 0
b 300 0

如果“merge”表示求和,则可以从数据框模式接收列列表并将其包含到“agg”中:

val df = Seq(
  ("a", Option.empty[Double], Option.empty[Double], Some(0.000000)),
  ("a", Some(0.000000), Option.empty[Double], Option.empty[Double]),
  ("b", Option.empty[Double], Option.empty[Double], Some(0.000000)),
  ("b", Some(300.000000), Option.empty[Double], Option.empty[Double])
).toDF(
  "name", "col1", "col2", "col3"
)
val columnsToMerge = df
  .columns
  .filterNot(_ == "name")
  .map(c => sum(c).alias(c))

df.groupBy("name")
  .agg(columnsToMerge.head, columnsToMerge.tail: _*)

结果:

+----+-----+----+----+
|name|col1 |col2|col3|
+----+-----+----+----+
|a   |0.0  |null|0.0 |
|b   |300.0|null|0.0 |
+----+-----+----+----+