如何在Python的Spark RDD中按指定列表将元素映射为1或0?
解决方案
你原来的代码存在两个核心问题:
- 逻辑错误:用子列表
x[1]直接判断是否属于number_list,但实际需要遍历number_list的每个元素,检查其是否存在于当前子列表中 - RDD不能直接在
map的lambda中做成员判断:number_list是分布式RDD,必须先转换为本地集合才能在worker节点使用
正确实现步骤
- 先将
number_list转换为本地列表和集合(集合用于快速查找,提升效率) - 对
my_dict中的每个元素,遍历本地数字列表,逐个判断是否存在于当前子列表,生成对应的0/1列表
完整代码
# 先获取本地的数字列表和集合 num_list = number_list.collect() num_set = set(num_list) # 用集合做成员判断比列表更快 # 转换my_dict transformed_dict = my_dict.map(lambda item: ( item[0], [1 if num in item[1] else 0 for num in num_list] )) # 查看结果 print(transformed_dict.collect())
输出验证
运行后会得到你期望的结果:
[(101, [1, 1, 0, 0, 1]), (102, [0, 1, 0, 1, 0]), (103, [0, 1, 1, 0, 1]), (104, [1, 0, 0, 0, 1])]
内容的提问来源于stack exchange,提问作者Joe Lee
相关产品推荐
相关产品推荐

