【问题标题】:Subtract values in between Dictionaries in a RDD on PySpark在 PySpark 上的 RDD 中的字典之间减去值
【发布时间】:2018-09-17 20:52:54
【问题描述】:

我创建了每个元素都是字典的 RDD。

rdd.take(2)

[{'actor': 'brad',
  'good': 1,
  'bad': 0,
  'average': 0,}
 {'actor': 'tom',
  'good': 0,
  'bad': 1,
  'average': 1,}]

我正在尝试对数据执行算术运算,即 'actor': 'brad' 和 'actor': 'tom',我想减去具有相同键的其他值,然后找到最终总和

即:

(1-0)+(0-1)+(0-1)= -1

由于这是 RDD 形式,我尝试做的是:

d1=rdd.filter(lambda x: x['name']=='brad').first()

 {'actor': 'brad',
  'good': 1,
  'bad': 0,
  'average': 0,}

 d2=rdd.filter(lambda x: x['name']=='tom').first()

 {'actor': 'tom',
  'good': 0,
  'bad': 1,
  'average': 1,}

这给了我带有值'brad'和'tom'的字典。如何进行算术运算?

我尝试这样做:

d3 = {key: d1] - d2.get(key, 0) for key in d1.keys()}

但这给了我错误。

有没有更好的方法来做到这一点,我在 RDD 本身中操作字典而不是将其分解为基本字典?

谢谢

【问题讨论】:

  • sum((d1[k] - d2[k]) for k in d1.keys() if k in ['good','bad','average'])

标签: python dictionary apache-spark pyspark rdd


【解决方案1】:

您的一些错误是由于使用了错误的键("name" 不在字典中)。但除此之外,收集普通字典可能是最合适的方法(见底部注释)。

d1=rdd.filter(lambda x: x['actor']=='brad').first()
d2=rdd.filter(lambda x: x['actor']=='tom').first()

带有预定义键的列表:

keys = ['good', 'bad', 'average']

您可以使用理解来制作结果字典:

{key: d1[key] - d2[key] for key in keys}
# outputs:
{'average': -1, 'bad': -1, 'good': 1}

然后可以简单地计算所有字典值的总和:

print(sum([v for v in dc.values()])) #-1

如果将多个字典收集在并行列表中,您甚至可以对它们执行此操作(假设您确切知道 2 个 RDD 是按允许按索引操作的顺序收集的)

[{key: d1[key] - d2[key] for key in keys}\
  for d1,d2 in zip(dicRdd1.collect(), dicRdd2.collect())]

您可以使用(您的示例字典)测试此逻辑:

[{key: d1[key] - d2[key] for key in keys}\
  for d1,d2 in zip([d1], [d2])]

注意:您应该避免在 Spark 的分布式 reduce 操作中执行减法。这仅仅是因为减法不可交换,会导致不可预测的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    相关资源
    最近更新 更多