2016-11-09 23 views
0

在處理大數據的組件連接時,我發現將它們合併成火花很困難。數據太大時如何在Spark中連接組件

我研究中的數據結構可以簡化爲RDD[Array[Int]]。例如:

RDD[Array(1,2,3), Array(1,4), Array(5,6), Array(5,6,7,8), Array(9), Array(1)]

目的是合併兩個數組,如果他們有交集結束了陣列而沒有任何交叉點。因此合併後,它應該是:

RDD[Array(1,2,3,4), Array(5,6,7,8), Array(9)]

的問題是一種成分在圖形算法中預凝膠骨架連接的。一種解決方案是首先使用笛卡爾積找到兩個Array之間的邊連接,然後合併它們。但是,在我的情況下,有300KArray總大小爲1G。因此,時間和內存的複雜度將大致爲300K * 300K。當我在Mac Pro中運行程序時,它完全卡住了。

Baiscally,它是這樣的:

enter image description here

感謝

+1

抱歉,1G並不大數據......這是怎麼過大?現在大多數Mac都有大約8G的RAM,對吧? –

+0

@ cricket_007是的,1G不是大數據,但最終我會將我的算法擴展爲大數據。我的Mac確實擁有8G內存。因此,如果我無法在我的Mac中運行此數據集,則意味着算法不夠理想。 –

+0

我沒有任何特別的代碼,但我不太確定Spark是否真的適合這個特定的算法/任務。我已經做了類似的數據框和SparkSQL,並使用窗口功能,但我保證連續數字。它不會出現你有這個 –

回答

0

這裏是我的解決方案。可能不夠體面,但適用於小數據。它是否適用於大數據需要進一步證明。

def mergeCanopy(canopies:RDD[Array[Int]]):Array[Array[Int]] = { /* try to merge two canopies */ val s = Set[Array[Int]]() val c = canopies.aggregate(s)(mergeOrAppend, _++_) return c.toArray

def mergeOrAppend(disjoint: Set[Array[Int]], cluster: Array[Int]):Set[Array[Int]] = { var disjoints = disjoint for (clus <- disjoint) { if (clus.toSet.&(cluster.toSet) != Set()) { disjoints += (clus.toSet++cluster.toSet).toArray disjoints -= clus return disjoints } } disjoints += cluster return disjoints }

相關問題