我创建了 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 的分布式归约操作中执行减法。这仅仅是因为减法是不可交换的,这会导致不可预测的结果。
