Проблема с Spark graphx

Я пытаюсь следовать примеру в https://docs.databricks.com/spark/latest/graph-analysis/graphframes/user-guide-python.html

Однако при изменении некоторых критериев результат не соответствует ожиданиям. Пожалуйста, смотрите шаги ниже -

from functools import reduce from pyspark.sql.functions import col, горит, когда from graphframes import *

vertices = sqlContext.createDataFrame([
  ("a", "Alice", 34),
  ("b", "Bob", 36),
  ("c", "Charlie", 30),
  ("d", "David", 29),
  ("e", "Esther", 32),
  ("f", "Fanny", 36),
  ("g", "Gabby", 60)], ["id", "name", "age"])

edges = sqlContext.createDataFrame([
  ("a", "b", "follow"),
  ("b", "c", "follow"),
  ("c", "b", "follow"),
  ("f", "c", "follow"),
  ("e", "f", "follow"),
  ("e", "d", "follow"),
  ("d", "a", "follow"),
  ("a", "e", "follow")
], ["src", "dst", "relationship"])

g = GraphFrame(vertices, edges)

Теперь одно изменение, которое я сделал в столбце «отношения», все значения - «следовать», а не друг.

Теперь запрос ниже работает нормально -

g.bfs(fromExpr ="name = 'Alice'",toExpr = "age < 32", edgeFilter ="relationship != 'friend'" , maxPathLength = 10).show()

+--------------+--------------+---------------+--------------+----------------+
|          from|            e0|             v1|            e1|              to|
+--------------+--------------+---------------+--------------+----------------+
|[a, Alice, 34]|[a, e, follow]|[e, Esther, 32]|[e, d, follow]|  [d, David, 29]|
|[a, Alice, 34]|[a, b, follow]|   [b, Bob, 36]|[b, c, follow]|[c, Charlie, 30]|
+--------------+--------------+---------------+--------------+----------------+

но если я изменю критерий фильтра с 32 на 40, будет получен неправильный результат -

>>> g.bfs(fromExpr ="name = 'Alice'",toExpr = "age < 35", edgeFilter ="relationship != 'friend'" , maxPathLength = 10).show()
+--------------+--------------+
|          from|            to|
+--------------+--------------+
|[a, Alice, 34]|[a, Alice, 34]|
+--------------+--------------+

В идеале он должен получить аналогичный результат из первого запроса, потому что условие фильтра по-прежнему выполняется для всех строк.

Любое объяснение этому?


person Pratik Rudra    schedule 17.06.2020    source источник


Ответы (1)


bfs () ищет первый результат, соответствующий вашему предикату. Возраст Алисы 34, он соответствует предикату toExpr = "age < 35", поэтому у вас есть путь нулевой длины, начинающийся с Алисы. Пожалуйста, измените наExpr на что-нибудь более конкретное. например toExpr ="name = 'David' or name = 'Charlie'" Должен дать вам точно такой же результат, как и в первом запросе.

person Artem Aliev    schedule 17.06.2020
comment
Спасибо @Artem за объяснение - person Pratik Rudra; 17.06.2020