迭代Apache Spark中的元组

时间:2015-12-08 19:06:30

标签: python matrix apache-spark key-value

我有2个矩阵输入需要相互相乘,我试图用map-reduce来做。所以,我像这样映射它们

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代码,因为我无法使用自定义函数迭代键。如何实现?

1 个答案:

答案 0 :(得分: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,那么您只需要充分实现矩阵的实现。