2016-03-11 39 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 SO 3也是對組1
  • 行3:2在組1上,3也在組1上,所以他們在組1中
  • 行4:4不是組1的值,所以我創建了一個新組2,我將它與5
  • 第5行:5有一個組2並且與6關聯,因此它具有組2.

你有想法在SQL中解決這個問題。 知基於A.R.Ferguson回答我能找出使用pyspark和graphframe的解決方案,我使用蜂巢或pyspark

+1

此問題與查找圖形的連通組件相同。每行代表兩個頂點之間的邊。 Hive/MapReduce不適合解決這個問題,但有一個名爲GraphX的Spark庫,幸運的是,它們實際上只是通過新的GraphFrames庫添加了一個Python API(https://databricks.com/blog/2016/03/ 03/introduction-graphframes.html),希望你能讓你的集羣管理員更新Spark。 –

+0

謝謝我用你的答案解決了這個問題。我使用了graphframe和connectedComponents()函數。 – patpat

回答

1

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() 

再次感謝弗格森。