2016-03-11 3 views
0

Для возобновления я хочу поставить в те же групповые ценности, которые связаны:создать столбец, групповые ценности,

Вот что у меня есть:

col1 col2 
1  2 
1  3 
2  3 
4  5 
5  6 

и я хочу это:

col1 col2 group 
1  2  1 
1  3  1 
2  3  1 
4  5  2 
5  6  2 

Чтобы создать эти две группы, выполните шаги, если я сделаю это вручную.

  • строка 1: 1 связан с 2 так, что они находятся на одной и той же группы, назовем ее группа 1
  • строка 2: 1 находится на 1-й группе, и теперь 1 связан с 3 так, 3 также на группе 1
  • строка 3: 2 относится к группе 1 и 3 также относится к группе 1, поэтому они находятся в группе 1
  • строка 4: 4 не является значением группы 1, поэтому я создаю новую группу, называемую 2 и i связывают его с 5
  • строка 5: 5 имеет группу 2 и связана с 6, поэтому она имеет группу 2.

У вас есть идея разрешить это в SQL. Зная, что я использую улей или pyspark

+1

Эта проблема аналогична обнаружению связанных компонентов графа. Каждая строка представляет собой границу между двумя вершинами. Hive/MapReduce плохо подходит для решения этой проблемы, но есть библиотека Spark, называемая GraphX, и к счастью для вас они буквально добавили API Python через новую библиотеку GraphFrames (https://databricks.com/blog/2016/03/ 03/introduction-graphframes.html), так что, надеюсь, вы можете заставить администратора кластера обновить Spark. –

+0

Спасибо, я решил проблему с вашим ответом. Я использовал графическую рамку и функцию connectedComponents(). – patpat

ответ

1

на основе A.R.Ferguson ответа я смог выяснить решение, используя pyspark и graphframe:

from graphframes import * 
vertices = sqlContext.createDataFrame([ 
    ("A", 1), 
    ("B", 2), 
    ("C", 3), 
    ("D", 4), 
    ("E", 5), 
    ("F", 6)], ["name", "id"]) 
edges = sqlContext.createDataFrame([ 
    (1, 2), 
    (1, 3), 
    (2, 3), 
    (4, 5), 
    (5, 6)], ["src", "dst"]) 
g = GraphFrame(vertices, edges) 
result = g.connectedComponents() 
result.show() 

Еще раз спасибо Фергюсон.

 Смежные вопросы

  • Нет связанных вопросов^_^