我有一个数据框,其中包含由密钥标识的记录。但是可能存在密钥可能重复的情况。我的目标是根据该键合并所有记录,如下所示
让我们假设我的输入数据框看起来像这样:
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'的记录。
由于
答案 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|
// +---+------+------+------+