【问题标题】:Disjoint sets on apache sparkapache spark上的不相交集
【发布时间】:2016-05-18 10:39:53
【问题描述】:

我试图使用 apache spark 查找在大量数据上搜索不相交集(连接组件/联合查找)的算法。 问题是数据量。甚至图形顶点的原始表示也不适合单机上的 ram。边缘也不适合 ram。

源数据是hdfs上图边的文本文件:“id1 \t id2”。

id 以字符串值的形式出现,而不是 int。

我发现的幼稚解决方案是:

  1. 获取边的rdd -> [id1:id2] [id3:id4] [id1:id3]
  2. 按键分组边缘。 -> [id1:[id2;id3]][id3:[id4]]
  3. 对于每个记录集每个组的最小 id -> (flatMap) [id1:id1][id2:id1][id3:id1][id3:id3][id4:id3]
  4. 从第 3 阶段反向 rdd [id2:id1] -> [id1:id2]
  5. leftOuterJoin 来自第 3 阶段和第 4 阶段的 rdds
  6. 从第 2 阶段开始重复,而第 3 步中 rdd 的大小不会改变

但这会导致节点之间传输大量数据 (洗牌)

有什么建议吗?

【问题讨论】:

标签: algorithm apache-spark mapreduce graph-theory disjoint-sets


【解决方案1】:

如果您正在使用图表,我建议您查看这些库中的任何一个

它们都提供了开箱即用的连通分量算法。

GraphX

val graph: Graph = ...
val cc = graph.connectedComponents().vertices

GraphFrames

val graph: GraphFrame = ...
val cc = graph.connectedComponents.run()
cc.select("id", "component").orderBy("component").show()

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2020-06-26
    • 2018-07-14
    • 2019-03-20
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多