2015-12-08 78 views
0

我有2個矩陣輸入需要相互相乘,我試圖用map-reduce來做到這一點。所以,我把它們映射這樣在Apache Spark中迭代一個元組

def flatMapper(line): 
    tokens = line.split(' ') 
    matrixName = str(tokens[0]) 
    row = int(tokens[1]) 
    column = int(tokens[2]) 
    value = int(tokens[3]) 
    if (matrixName == "A"): 
     for i in range(0,5): 
      yield((row, i), ("A", column, value)) // (row, i) is key and ("A", column, value) is column 
    elif (matrixName == "B"): 
     for i in range(0,5): 
      yield((i, column), ("B", row, value)) 

因爲它可以在這裏看到,我生產的每一行多個鍵 - 值對。

之後,我將它們按鍵組合。然後對於每個鍵值對((i,j),(「matrixname」,x,value)),我需要將這些值相乘,使得它們的x是相同的,並且matrixname的不同,求和所有結果,即矩陣中第(i,j)個元素的值。所以我需要編寫一個reducer來迭代給定鍵的值列表,但是我被卡在了這裏。我如何迭代我的自定義reducer函數中的值列表? (我試過但它沒有工作)

result = result.reduceByKey(lambda k, v: reducer(k, v)) 

編輯︰我看到實際上flatMap成功地創建鍵值對。我已經使用了內建函數reduceByKey(add),它通過它們的鍵附加了這些列表分組。這裏的問題是,我無法編寫自定義的Reducer代碼,因爲我無法用自定義函數遍歷鍵。如何實現這一目標?

回答

0

我會告訴你我的兩個向量的方法,由兩個不同的RDD表示。我認爲這比你的嘗試更簡單。

a = sc.parallelize([-1, 4, -2, 3]) 
b = sc.parallelize([-1, 2, 3, -2]) 

c = a.zip(b).map(lambda (x, y): x * y).sum() 

輸出爲-3,那麼你只需要充分爲您的矩陣實現。