2015-04-21 66 views
2

我想在Spark中實現K最近鄰算法。我想知道是否可以使用嵌套的RDD。這會讓我的生活變得更輕鬆。考慮下面的代碼片段。是否可以在Apache Spark中創建嵌套的RDD?

public static void main (String[] args){ 
//blah blah code 
JavaRDD<Double> temp1 = testData.map(
    new Function<Vector,Double>(){ 
     public Double call(final Vector z) throws Exception{ 
      JavaRDD<Double> temp2 = trainData.map(
        new Function<Vector, Double>() { 
         public Double call(Vector vector) throws Exception { 
          return (double) vector.length(); 
         } 
        } 
      ); 
      return (double)z.length(); 
     }  
    } 
); 
} 

目前我遇到這個嵌套設置錯誤(我可以在這裏發佈完整的日誌)。是否允許在第一個地方?謝謝

回答

3

不,這是不可能的,因爲RDD的項目必須是可序列化的,而且RDD不可序列化。這是有道理的,否則你可能會通過網絡傳輸一個完整的RDD,如果它包含大量的數據,這是一個問題。如果它不包含大量的數據,你可能應該使用一個數組或類似的東西。但是,我不知道你是如何實現K-最近的鄰居......但要小心:如果你做了類似計算每對點之間的距離的東西,這實際上在數據集大小中是不可縮放的,因爲它是O(n2)。

+0

感謝馬克。你的意見對我有意義。 但是,我想通過這種方法來減少每個測試實例的最近鄰居。因爲我也認爲嵌套的RDD可能不可行,所以我開始以不同的老式方式實施。 –

+0

也許有更聰明的方法。例如,在Spark機器學習庫中找到的DBSCAN實現中,整個數據集空間被劃分爲多個框,以便計算鄰居的複雜性降低。如果你對它感興趣,你可以在github上找到代碼,這可能是提高性能的一個好方法(實際上它做的比我告訴你的要複雜得多,但這是潛在的想法)。 – mgaido

+0

只是爲了記錄 - RDD是可序列化的。這實際上不是一個序列化問題。 – zero323

1

我在嘗試這種類型的事情時遇到了空指針異常。我們無法對RDD中的RDD執行操作。

Spark不支持嵌套RDD原因是 - 執行操作或創建新的RDD Spark運行時需要訪問僅在驅動程序機器中可用的sparkcontext對象。

因此,如果您想操作嵌套的RDD,您可以收集驅動程序節點上的父RDD,然後使用數組或其他東西迭代它的項目。

注意: - RDD類是可序列化的。請看下面。

enter image description here

+0

很好的解釋! thx阿米特 – Abhisekh

相關問題