【问题标题】:How to combine values based on condition of two different keys in key-value map?如何根据键值映射中两个不同键的条件组合值?
【发布时间】:2016-11-06 19:15:10
【问题描述】:

我正在为 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. 使用 map 遍历数据: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))).

顺便说一句,我对 pyspark 完全陌生,所以我的方法可能很幼稚,但是有没有办法使这些工作中的任何一个工作,或者我应该使用不同的方法?

【问题讨论】:

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


    【解决方案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])))): failed因为列表没有 map 或 flatMap 属性

    对此有一个简短的说明。你想要 Python bultin map。语法是map(function, sequence)

    【讨论】:

    • 感谢您的回复!我已经尝试过你的方法,似乎 set 对象没有属性 collect: AttributeError: 'set' object has no attribute 'collect'。有没有其他方法可以打印出我们的价值观?另外,第二个也有我之前遇到过的类似问题: f(self, obj) # Call unbound method with explicit self "看来您正在尝试广播一个 RDD 或从一个 " 中引用一个 RDD
    • 如果我这样做:values2 = sc.broadcast (values) 和 data.mapValues(lambda x: [y for y in values if y not in x]).collect()。我收到广播对象不可迭代的错误。
    • 糟糕...您可以跳过collect 步骤——reduce 会处理它。检查文档,但我认为访问广播变量的实际值应该是values2.value(也许我不应该将其称为值......)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多