我正在尝试根据广播变量过滤大型RDD。
我能够执行以下操作,以过滤作为广播变量中的键存在的元组。
nested_filter = {"india":'ind',"usa":'us'}
b_filter = sc.broadcast(nested_filter)
rdd_set = sc.parallelize([('india','ind'),('india', 'nope') , ('usa','us'),
('japan','jpn'),('uruguay','urg')])
过滤器:
rdd_set.filter(lambda fields: fields[0] in b_filter.value).collect()
这将返回:
[('india', 'ind'), ('india', 'nope'), ('usa', 'us')]
我的问题是我想过滤广播词典中的键以及与该键关联的值。
正确的结果应该是:
[('india', 'ind'), ('usa', 'us')]
实际的RDD将具有数十亿行的行,并包含一个包含数百万个键的广播字典。有人可以告诉我最有效的方法吗?
答案 0 :(得分:1)
您可以使用items()
从字典中获取键值元组的列表。然后检查该列表中是否有一行:
rdd_set.filter(lambda fields: fields in b_filter.value.items()).collect()
#[('india', 'ind'), ('usa', 'us')]