Spark复杂分组

时间:2017-07-16 14:07:59

标签: scala apache-spark

我在Spark中有这个数据结构:

val df = Seq(
("Package 1", Seq("address1", "address2", "address3")),
("Package 2", Seq("address3", "address4", "address5", "address6")),
("Package 3", Seq("address7", "address8")),
("Package 4", Seq("address9")),
("Package 5", Seq("address9", "address1")),
("Package 6", Seq("address10")),
("Package 7", Seq("address8"))).toDF("Package", "Destinations")
df.show(20, false)

我需要找到在不同包中一起看到的所有地址。看起来我找不到有效地做到这一点的方法。我试图分组,映射等。理想情况下,给定df的结果将是

+----+------------------------------------------------------------------------+
| Id |                               Addresses                                |
+----+------------------------------------------------------------------------+
|  1 | [address1, address2, address3, address4, address5, address6, address9] |
|  2 | [address7, address8]                                                   |
|  3 | [address10]                                                            |
+----+------------------------------------------------------------------------+

1 个答案:

答案 0 :(得分:2)

使用TreeReduce https://spark.apache.org/docs/2.1.0/api/java/org/apache/spark/rdd/RDD.html#treeReduce(scala.Function2,%20int)

进行研究
  • 对于sequential操作,您可以创建一组集:

    • 对于每个新的元素数组,例如[address 7address 8] - 迭代现有集合以检查交集是否为非空:如果是,则将这些元素添加到该集合

      • 否则创建一个包含这些元素的新集合
    • 对于combine操作:

      • 对于Combine操作左侧的每个集合: - 遍历右侧的所有集合以找到任何非空交叉点    - 如果找到任何非空的inteserction,则将两个集合组合。

注意 TreeReduce是较新的命名。 TreeAggregate用于旧版本的Spark