Как создать связи между вершинами в RDD[(Long, Vertex)] на основе свойства?

У меня есть пользователи: RDD[(Long, Vertex)] коллекция пользователей. Я хочу создать ссылки между моими объектами Vertex. Правило таково: если две вершины имеют одинаковое значение в выбранном свойстве - назовите его prop1, тогда ссылка существует.

Моя проблема в том, как проверить каждую пару в одной коллекции. Если я сделаю:

val rels = users.map(
  x => users.map(y => if(x._2.prop1 == y._2.prop1){(x._1, y._1)}))

Я вернулся RDD[RDD[Any]] и не RDD[(Long, Long)] как и ожидалось, чтобы график работал

1 ответ

Решение

Прежде всего, вы не можете запустить действие преобразования из другого действия или преобразования, не говоря уже о создании вложенного RDDs, Так что просто невозможно получить RDD[RDD[Any]],

Здесь вам, скорее всего, нужно простое соединение, примерно эквивалентное чему-то вроде этого, где T это тип property1:

val pairs: RDD[(T, Long)] = users.map{ case (id, v) => (v.prop1, id) }
val links: RDD[(Long, Long)] = pairs
  .join(pairs)  // join by a common property, equivalent to INNER JOIN in SQL
  .values  // drop properties
  .filter{ case (v1, v2) => v1 != v2 }  // filter self-links
Другие вопросы по тегам