基于scala spark中的一个键合并数据帧中的多个记录

基于scala spark中的一个键合并数据帧中的多个记录,scala,apache-spark,dataframe,Scala,Apache Spark,Dataframe,我有一个数据框,其中包含由键标识的记录。但可能会有这样一种情况:一个键可能会重复。我的目标是基于该键合并所有记录,如下所示 key | value1 | value2 | value3 ------------------------------- a | 1 | 2 | 3 假设我的输入数据框如下所示: key | value1 | value2 | value3 ------------------------------- a | 1 | null

我有一个数据框,其中包含由键标识的记录。但可能会有这样一种情况:一个键可能会重复。我的目标是基于该键合并所有记录,如下所示

key | value1 | value2 | value3
-------------------------------
a   | 1      | 2      | 3
假设我的输入数据框如下所示:

key | value1 | value2 | value3
-------------------------------
a   | 1      | null   | null
a   | null   | 2      | null
a   | null   | null   | 3
我希望基于“a”合并后的输出应该如下所示

key | value1 | value2 | value3
-------------------------------
a   | 1      | 2      | 3
现在我确信关于这一部分,三个值中的任何一个都将出现在键“a”的一个记录中


谢谢

如果您知道组中只有一条记录不是空的(或者您不关心会得到哪一条),您可以先使用

import org.apache.spark.sql.functions.{first, last}

val df = Seq(
  ("a", Some(1), None, None), ("a", None, Some(2), None),
  ("a", None, None, Some(3))
).toDF("key", "value1", "value2", "value3")

df.groupBy("key").agg(
  first("value1", true) as "value1", 
  first("value2", true) as "value2", 
  first("value3", true) as "value3"
).show  

// +---+------+------+------+
// |key|value1|value2|value3|
// +---+------+------+------+
// |  a|     1|     2|     3|
// +---+------+------+------+
df.groupBy("key").agg(
  last("value1", true) as "value1", 
  last("value2", true) as "value2", 
  last("value3", true) as "value3"
).show  


// +---+------+------+------+
// |key|value1|value2|value3|
// +---+------+------+------+
// |  a|     1|     2|     3|
// +---+------+------+------+    
最后一次

import org.apache.spark.sql.functions.{first, last}

val df = Seq(
  ("a", Some(1), None, None), ("a", None, Some(2), None),
  ("a", None, None, Some(3))
).toDF("key", "value1", "value2", "value3")

df.groupBy("key").agg(
  first("value1", true) as "value1", 
  first("value2", true) as "value2", 
  first("value3", true) as "value3"
).show  

// +---+------+------+------+
// |key|value1|value2|value3|
// +---+------+------+------+
// |  a|     1|     2|     3|
// +---+------+------+------+
df.groupBy("key").agg(
  last("value1", true) as "value1", 
  last("value2", true) as "value2", 
  last("value3", true) as "value3"
).show  


// +---+------+------+------+
// |key|value1|value2|value3|
// +---+------+------+------+
// |  a|     1|     2|     3|
// +---+------+------+------+