Вы можете кратко выразить это с помощью библиотеки GraphFrames. Сначала вы должны включить требуемый пакет. Для с Спарк 2.0 и Scala 2.11 вы можете добавить
graphframes:graphframes:0.2.0-spark2.0-s_2.11
к spark.jars.packages
в conf/spark-defaults.conf
или передать его в качестве аргумента для --packages
spark-submit
.
Далее следует преобразовать Graph
в GraphFrame
. Вы можете использовать fromGraphX
метод:
import org.graphframes.GraphFrame
import org.apache.spark.graphx._
val nodes = sc.parallelize(Seq(
(1L, "a"), (2L, "b"), (3L, "c"), (4L, "d"), (5L, "e")))
val edges = sc.parallelize(Seq(
Edge(1L, 2L, 34), Edge(1L, 3L, 23), Edge(2L, 5L, 10),
Edge(3L, 4L, 12), Edge(3L, 3L, 12), Edge(3L, 5L, 11)))
val graph = Graph(nodes, edges)
val graphFrame = GraphFrame.fromGraphX(graph)
GraphFrame
обеспечивает найти метод, который принимает шаблон на языке, подобной Cypher. Две хмеля может быть выражен как:
val pattern = "(x1) - [a] -> (x2); (x2) - [b] -> (x3)"
, где (_)
представляет узлы и [_]
края. Вы пути согласования шаблона:
val paths = graphFrame.find(pattern)
и select
полей:
paths.select($"x1.attr", $"x3.attr", $"a.attr" + $"b.attr").show()