Skip to main content
 首页 » 编程设计

python之在 PySpark 上的 RDD 中的字典之间减去值

2025年01月19日23lyj

我创建了 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 本身中的字典而不是将其分解为基本字典?

谢谢

请您参考如下方法:

您的一些错误是由于使用了错误的键(“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 的分布式归约操作中执行减法。这仅仅是因为减法是不可交换的,这会导致不可预测的结果。