【问题标题】:Iterating over a tuple in Apache Spark在 Apache Spark 中迭代一个元组
【发布时间】:2015-12-09 05:15:52
【问题描述】:

我有 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)),我需要将值相乘,使得它们的 xma​​trixname 是不同的,将所有结果相加,即矩阵中第 (i, j) 个元素的值。所以我需要编写一个reducer 来迭代给定键的值列表,但是我被困在这里。如何在我的自定义 reducer 函数中迭代值列表? (我试过了,但是没用)

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

编辑:我看到实际上 flatMap 成功地创建了键值对。我使用了内置函数 reduceByKey(add),它通过键附加了这些列表分组。这里的问题是,我无法编写自定义减速器代码,因为我无法使用自定义函数迭代键。如何实现?

【问题讨论】:

    标签: python matrix apache-spark key-value


    【解决方案1】:

    我将向您展示我对两个向量的方法,由两个不同的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,然后你只需要为你的矩阵扩展实现。

    【讨论】:

      猜你喜欢
      • 2011-07-14
      • 2020-05-04
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多