PySpark中RDD内字典元素值相减并求和的实现问题
解决方法:计算RDD中指定字典的键值差值之和
Hey there! Let's fix this up for you. First, I noticed a tiny mistake in your initial code: you used x['name'] to filter, but your dictionary's key for the actor is actually 'actor'—that's one thing to correct right away.
Now, let's walk through two solid approaches to get the result you want:
方法1:适用于小数据量(将数据拉取到Driver端计算)
如果你的RDD里数据不多,把目标记录收集到本地计算是简单直接的:
# 过滤出brad和tom的记录 target_records = rdd.filter(lambda x: x['actor'] in ['brad', 'tom']).collect() # 从列表中提取对应字典 brad_dict = next(item for item in target_records if item['actor'] == 'brad') tom_dict = next(item for item in target_records if item['actor'] == 'tom') # 计算指定键的差值之和 total = sum(brad_dict[key] - tom_dict[key] for key in ['good', 'bad', 'average']) print(total) # 输出: -1
方法2:适用于大数据量(保持计算在集群上)
如果你的RDD数据量很大,避免把数据拉到Driver端更高效。我们可以通过键值对配对来实现:
# 将brad和tom的记录转换为以固定键(比如'compare')为key的键值对 brad_kv = rdd.filter(lambda x: x['actor'] == 'brad')\ .map(lambda x: ('compare', (x['good'], x['bad'], x['average']))) tom_kv = rdd.filter(lambda x: x['actor'] == 'tom')\ .map(lambda x: ('compare', (x['good'], x['bad'], x['average']))) # 合并两个RDD,计算差值之和 result = brad_kv.join(tom_kv)\ .map(lambda pair: (pair[1][0][0] - pair[1][1][0]) + (pair[1][0][1] - pair[1][1][1]) + (pair[1][0][2] - pair[1][1][2]))\ .first() print(result) # 输出: -1
关键说明
- 两种方法都需要先确保你能正确过滤出
brad和tom的记录(注意键是'actor'不是'name')。 - 方法1用
collect()把数据拉到本地,适合小数据集;方法2全程在集群上处理,更适合大规模数据。
内容的提问来源于stack exchange,提问作者Jerry George
相关产品推荐
相关产品推荐

