2015-08-17 127 views
-1

我對PySpark相對來說比較新。PySpark中的所有與所有比較

我有2M火車實例和4M測試實例。每個實例都由一個id和一個特徵向量表示。我有一個自定義函數來計算兩對實例之間的相似度。

作爲一個輸出,我希望每個測試實例都有一個排序的列車實例。這是一個很常見的問題,但實例的數量是挑戰。

由於,我必須做的所有-VS-所有比較,我在PySpark使用的cartesian產品功能如下:

train_testpairs = trainRDD.cartesian(testRDD) 
train_testpairs_simscores = train_testpairs.map(myscore) 

在,train_testpairs_simscores,我有以下類型的元組:

(train_id,test_id,score) 

但是,現在我想火車實例爲每個測試之類的實例的排序順序:

test_id1,[train_id432, train_id832,.....] 

我明白,對於每個test_id,這將有一個2M大小的列表。因此,這個列表的n%也是可以的。可能是最接近測試ID的前1000個列車實例。

我該如何做到這一點?

我試圖按testID分組,然後在每個列表中排序,但groupBy本身太耗時。 任何幫助,將不勝感激。

回答

0

面臨的一個非常類似的問題,我結束了「手動」計算相似性得分,而不是使用cartesian()

def f(train_instance): 
    return train_instance,sorted(myscore(train_instance,test_instance) for test_instance in TEST_INSTANCES) 

trainRDD.map(f) 

這樣你避免擴大2米*4米項目的笛卡爾積,然後重新組合它們

相關問題