gpt4 book ai didi

apache-spark - 如何按数组中的公共(public)元素分组?

转载 作者:行者123 更新时间:2023-12-04 03:36:13 27 4
gpt4 key购买 nike

我试图在 spark 中找到解决方案,用数组中的公共(public)元素对数据进行分组。

 key                            value
[k1,k2] v1
[k2] v2
[k3,k2] v3
[k4] v4

如果任何元素在 key 中匹配,我们必须为其分配相同的 groupid。(Groupby 公共(public)元素)

结果:
key                             value  GroupID
[k1,k2] v1 G1
[k2] v2 G1
[k3,k2] v3 G1
[k4] v4 G2

Spark Graphx 已经给出了一些建议,但目前学习曲线将更多地针对单个功能实现这一点。

最佳答案

包括 graphframes (支持的最新 Spark 版本是 2.1,但它也应该支持 2.2,如果您使用较新的版本,则必须使用 2.3 补丁构建自己的版本)替换 XXX使用 Spark 版本和 YYY使用 Scala 版本:

spark.jars.packages  graphframes:graphframes:0.5.0-sparkXXX-s_YYY

添加爆炸键:

import org.apache.spark.sql.functions._

val df = Seq(
(Seq("k1", "k2"), "v1"), (Seq("k2"), "v2"),
(Seq("k3", "k2"), "v3"), (Seq("k4"), "v4")
).toDF("key", "value")

val edges = df.select(
explode($"key") as "src", $"value" as "dst")

转换为 graphframe :

import org.graphframes._

val gf = GraphFrame.fromEdges(edges)

设置检查点目录(如果未设置):

import org.apache.spark.sql.SparkSession

val path: String = ???
val spark: SparkSession = ???
spark.sparkContext.setCheckpointDir(path)

查找连接的组件:

val components = GraphFrame.fromEdges(edges).connectedComponents.setAlgorithm("graphx").run

将结果与输入数据连接:

 val result = components.where($"id".startsWith("v")).toDF("value", "group").join(df, Seq("value"))

检查结果:

result.show

// +-----+------------+--------+
// |value| group| key|
// +-----+------------+--------+
// | v3|489626271744|[k3, k2]|
// | v2|489626271744| [k2]|
// | v4|532575944704| [k4]|
// | v1|489626271744|[k1, k2]|
// +-----+------------+--------+

关于apache-spark - 如何按数组中的公共(public)元素分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43915762/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com