【问题标题】:Pyspark Array Key,ValuePyspark 数组键、值
【发布时间】:2015-06-30 06:06:13
【问题描述】:

我目前有一个 RDD,其中包含一个存储键值对的数组,其中键是数组的 2D 索引,值是该点的数字。例如 [((0,0),1),((0,1),2),((1,0),3),((1,1),4)] 我想将每个键的值与周围的值相加。关于我之前的示例,我想将 1,2,3 相加并将其放在 (0,0) 键值位置。我该怎么做?

【问题讨论】:

  • 我不知道你想要什么。通常在 python 中,您应该为任何键值对使用映射,为什么要使用数组 - 很难弄清楚存储的元组的确切含义。
  • 你能说清楚一点吗?如果你从给定的数组中写出你想要的输出并解释它,我可能会提供帮助。

标签: multidimensional-array key-value pyspark


【解决方案1】:

我建议您执行以下操作:

  1. 定义一个函数,给定一对 (i,j),返回一个列表,其中包含对应于 (i,j) 周围位置的对,加上输入对 (i,j)。例如,假设函数名为surrounding_pairs(pair)。那么:

    surrounding_pairs((0,0)) = [ (0,0), (0,1), (1,0) ]
    surrounding_pairs((2,3)) = [ (2,3), (2,2), (2,4), (1,3), (3,3) ]
    

    当然,你需要小心,只返回有效位置。

  2. 在您的 RDD 上使用 flatMap,如下所示:

    MyRDD = MyRDD.flatMap(lambda (pos, v): [(p, v) for p in surrounding_pairs(pos)])
    

    这将映射您的 RDD [((0,0),1),((0,1),2),((1,0),3),((1,1),4)]

    [((0,0),1),((0,1),1),((1,0),1),
     ((0,1),2),((0,0),2),((1,1),2),
     ((1,0),3),((0,0),3),((1,1),3),
     ((1,1),4),((1,0),4),((0,1),4)]
    

    这样,每个位置的值将被“复制”到相邻位置。

  3. 最后,只需使用reduceByKey 在每个位置添加相应的值即可:

    from operator import add
    MyRDD = MyRDD.reduceByKey(add)
    

我希望这是有道理的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-27
    • 2021-03-27
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    相关资源
    最近更新 更多