根据scala spark中的键合并Dataframe中的多个记录

时间:2018-05-07 20:33:12

标签: scala apache-spark dataframe

我有一个数据框,其中包含由密钥标识的记录。但是可能存在密钥可能重复的情况。我的目标是根据该键合并所有记录,如下所示

让我们假设我的输入数据框看起来像这样:

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'的记录。

由于

1 个答案:

答案 0 :(得分:1)

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

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|
// +---+------+------+------+

last

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|
// +---+------+------+------+