首页 > 解决方案 > Spark 使用自定义函数聚合行

问题描述

为简单起见,假设我们有一个包含以下数据的数据框:

+----------+---------+----------+----------+
|firstName |lastName |Phone     |Address   |
+----------+---------+----------+----------+
|firstName1|lastName1|info1     |info2     |
|firstName1|lastName1|myInfo1   |dummyInfo2|
|firstName1|lastName1|dummyInfo1|myInfo2   |
+----------+---------+----------+----------+

如何合并按 (firstName,lastName) 分组的所有行,并保留以“my”开头的仅电话和地址列中的数据以获得以下信息:

+----------+---------+----------+----------+
|firstName |lastName |Phone     |Address   |
+----------+---------+----------+----------+
|firstName1|lastName1|myInfo1   |myInfo2   |
+----------+---------+----------+----------+

也许我应该将 agg 函数与自定义 UDAF 一起使用?但是我该如何实现呢?

注意:我使用 Spark 2.2 和 Scala 2.11。

标签: apache-spark

解决方案


您可以使用groupBycollect_set聚合函数并使用udf函数过滤以“my”开头的第一个字符串

import org.apache.spark.sql.functions._
def myudf = udf((array: Seq[String]) => array.filter(_.startsWith("my")).head)

df.groupBy("firstName ", "lastName")
  .agg(myudf(collect_set("Phone")).as("Phone"), myudf(collect_set("Address")).as("Address"))
  .show(false)

这应该给你

+----------+---------+-------+-------+
|firstName |lastName |Phone  |Address|
+----------+---------+-------+-------+
|firstName1|lastName1|myInfo1|myInfo2|
+----------+---------+-------+-------+

我希望答案有帮助


推荐阅读