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