如何在键值映射中根据两个不同键的条件组合值?

时间:2016-11-06 19:15:11

标签: python apache-spark pyspark key-value rdd

我正在为pyspark中的键值映射进行基本操作。以下是问题描述:

data = {(1, [2, 3, 4]), (2, [a, b, 3]), (3, [x, y]) }

我想获取当前值列表中未包含的键的所有值。结果应该是这样的:

data = {(1, [a, b, x, y]), (2, [x, y]), (3, []) }

在对结果进行过滤之前,我只是尝试将值与几种方法结合起来:

  1. 将数据发送到函数并创建嵌套循环以转换数据:失败,因为我无法让我的RDD正确迭代
  2. 使用地图迭代数据:data.map(lambda x: (x[0], x[1].map(lambda a,b: (x[a] + x[b])))):失败,因为列表没有mapflatMap属性
  3. 使用valuemap方法:data.flatMapValues(lambda a, b: (data.lookup(a) + data.lookup(b))).
  4. 顺便说一句,我对pyspark完全不熟悉,所以我的方法可能很幼稚,但是有没有办法让这些方法发挥作用,或者我应该使用不同的方法?

1 个答案:

答案 0 :(得分:1)

我认为您想要做以下事情:

1)收集所有值(假设它们适合记忆。如果没有,我不得不多想):

values = (data.mapValues(lambda x: set(x))
              .values()
              .reduce(lambda x, y: x.union(y))
              .collect())

2)(可能在广播数值后)映射数值以最终列表结束

data.mapValues(lambda x: [y for y in values if y not in x])
  

使用map迭代数据:data.map(lambda x:(x [0],x [1] .map(lambda a,b:(x [a] + x [b])))):失败因为列表没有map或flatMap属性

关于此的快速说明。你想要Python bultin map。语法为map(function, sequence)