Проблема с Spark graphx - PullRequest
       88

Проблема с Spark graphx

1 голос
/ 17 июня 2020

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

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

из импорта functools уменьшить из pyspark. sql .functions import col, горит, когда из импорта графических фреймов *

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]|
+--------------+--------------+

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

Есть ли объяснение этого?

1 Ответ

0 голосов
/ 17 июня 2020

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

...