2015-12-08 46 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,那么你只需要充分为您的矩阵实现。