【问题标题】:Spark: build recursive tree path for every node of an hierarchy DataFrameSpark:为层次结构DataFrame的每个节点构建递归树路径
【发布时间】:2019-04-11 08:33:50
【问题描述】:

考虑一棵树及其 DataFrame 表示(左表):

0             ┌───────┬───────┐           ┌───────┬───────┐
├──1          │   id  │ parent│           │   id  │ path  │
│  ├──2       ├───────┼───────┤           ├───────┼───────┤
│  └──3       │   5   │   0   │           │   5   │0/5    │
│     └──4    ├───────┼───────┤           ├───────┼───────┤
└──5          │   4   │   3   │           │   4   │0/1/3/4│
              ├───────┼───────┤     =>    ├───────┼───────┤
              │   3   │   1   │           │   3   │0/1/3  │
              ├───────┼───────┤           ├───────┼───────┤
              │   2   │   1   │           │   2   │0/1/2  │
              ├───────┼───────┤           ├───────┼───────┤
              │   1   │   0   │           │   1   │0/1    │
              ├───────┼───────┤           ├───────┼───────┤
              │   0   │ null  │           │   0   │0      │
              └───────┴───────┘           └───────┴───────┘

为树的每个节点(右表)获取树路径(从根开始)的最有效方法是什么?

允许所有可能的方法:SQL 查询、DataFrame 方法、GraphX 等。

注意:带有递归连接的经典 SQL 解决方案不适用于 Spark DataFrame。

【问题讨论】:

  • 我怀疑 GraphX 会是可行的方法,但我怀疑它会非常有效。
  • 是的,看来这个任务可以在不初始化 Graph 的情况下解决。
  • @OlegMikhailov,RDD 的mapPartitions 怎么样?
  • @Sai,所有的方法都是好的,有效的

标签: apache-spark dataframe graph tree hierarchy


【解决方案1】:

这看起来像一个 Spark Graph API 任务。您可以查看 Graphframes spark 包。它是一个在 GraphX 核心上提供高级 API 的包(与传统的基于 RDD 的 Spark Dataframes 中使用的相同)。有了这个,您可以使用您的数据框构建图表。

看这个链接:https://mapr.com/blog/analyzing-flight-delays-with-apache-spark-graphframes-and-mapr-db/

它显示了一个包含航班数据的用例。如果您查看Breadth First Search Graph Algorithm 部分,您将看到一个完全符合您要求的算法:查找两个顶点之间的路径(给定一个 maxPathLength 参数)。

使用 graphframes 依赖项运行 pyspark(根据您的 spark 版本):

pyspark --packages graphframes:graphframes:0.6.0-spark2.3-s_2.11

构建您的数据框:

df = sc.parallelize([{"id": 5, "parent": 0}, {"id": 4, "parent": 3}, {"id": 3, "parent": 1}, {"id": 2, "parent": 1}, {"id": 1, "parent": 0}, {"id": 0, "parent": None}]).toDF()

创建图表:

df_vertices = df.selectExpr("id")
df_edges = df.withColumnRenamed("id", "dst").withColumnRenamed("parent", "src")

from graphframes import GraphFrame
graph  = GraphFrame(df_vertices, df_edges)

可视化路径(例如从 0 到 4):

graph.bfs(fromExpr="id = 0",toExpr="id = 4", maxPathLength=10).show(2)

结果:

+----+------+---+------+---+------+---+
|from|    e0| v1|    e1| v2|    e2| to|
+----+------+---+------+---+------+---+
| [0]|[1, 0]|[1]|[3, 1]|[3]|[4, 3]|[4]|
+----+------+---+------+---+------+---+

【讨论】:

    猜你喜欢
    • 2018-04-04
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多