PySpark中对RDD内两个字典的同键值执行相加操作的咨询
解决Spark RDD中字典元素数值相加的问题
嘿,我来帮你完成这个字典数值相加的操作!你已经通过filter和first()拿到了目标字典d1和d2,接下来只需要对两个字典的相同数值键做求和处理就行,下面给你几种可行的实现方式:
1. 直接指定键求和(适合已知固定键的场景)
如果你的RDD中每个字典的键都是固定的(比如示例里的good、bad、average),直接逐个键相加最直观,代码也容易维护:
d1 = rdd.filter(lambda x: x['actor']=='brad').first() d2 = rdd.filter(lambda x: x['actor']=='tom').first() # 先检查是否找到目标数据,避免空值报错 if not d1 or not d2: raise ValueError("未在RDD中找到'brad'或'tom'对应的记录") # 构建结果字典 dc = { 'actor': 'brad_and_tom', # 自定义组合后的actor名称,可按需修改 'good': d1['good'] + d2['good'], 'bad': d1['bad'] + d2['bad'], 'average': d1['average'] + d2['average'] }
2. 字典推导式批量求和(适合键数量多的场景)
如果你的字典有30000个键,手动写每个键显然不现实,用字典推导式可以批量处理所有非actor的数值键:
d1 = rdd.filter(lambda x: x['actor']=='brad').first() d2 = rdd.filter(lambda x: x['actor']=='tom').first() if not d1 or not d2: raise ValueError("未在RDD中找到'brad'或'tom'对应的记录") # 批量求和除actor外的所有键 dc = { 'actor': 'brad_and_tom', **{key: d1[key] + d2[key] for key in d1 if key != 'actor'} }
这里的**是Python的字典解包语法,能把推导式生成的键值对快速合并到结果字典里。
3. 健壮性更高的通用写法(处理键不统一的情况)
如果担心两个字典的键可能存在差异,或者有些值不是数值类型,可以用更严谨的遍历方式,只对共同的数值键求和:
d1 = rdd.filter(lambda x: x['actor']=='brad').first() d2 = rdd.filter(lambda x: x['actor']=='tom').first() if not d1 or not d2: raise ValueError("未在RDD中找到'brad'或'tom'对应的记录") dc = {'actor': f"{d1['actor']}_and_{d2['actor']}"} # 遍历两个字典的共同键,只相加数值类型的值 for key in d1.keys() & d2.keys(): if isinstance(d1[key], (int, float)) and isinstance(d2[key], (int, float)): dc[key] = d1[key] + d2[key]
用你提供的示例数据执行后,dc的结果会是:
{'actor': 'brad_and_tom', 'good': 1, 'bad': 1, 'average': 1}
内容的提问来源于stack exchange,提问作者Jerry George
相关产品推荐
相关产品推荐

