我有一个针对一个键的多个值(列表)的rdd,我想从一个键中的每个值中过滤掉垃圾。
rdd有这个数据
((key1, [('',val1),('', val2),..]),(key2,[...)
我想将它映射到类似的东西
((key1,[val1, val2,...]), key2[...)
我知道这里需要一个地图功能,但是我还没有使用地图来对一个键使用多个值。
这是我努力做到的。
def mapper(x):
values = []
for a in x[1]:
values.append(a[1])
return(x[0], ap)
listRdd.map( mapper).collect()
但我收到了一些错误
答案 0 :(得分:2)
主要思想是将RDD
的每个条目视为单个集合,并将其视为一个过程。意思是,如果我们考虑以下条目
entry = ("key1", [('',"val1"),('',"val2")])
要将此集合处理为预期输出,我们需要了解集合的结构
entry[0]
# 'key1'
entry[1]
# [('', 'val1'), ('', 'val2')]
现在让我们继续讨论第二部分:
map(lambda x : x[1],entry[1])
# ['val1', 'val2']
我们现在可以定义一个函数,它将一个条目作为输入,结果输出将是一个(key,[values ...])元组。我们称之为mapper
。我们可以在rdd中的每个条目上应用映射器。
将代码放在一起:
def mapper(entry):
return (entry[0],map(lambda x : x[1],entry[1]))
data = [("key1", [('',"val1"),('',"val2")]),("key2",[('',"val3"),('',"val2"),('',"val4")])]
rdd = sc.parallelize(data)
rdd2 = rdd.map(lambda x : mapper(x))
rdd2.collect()
# [('key1', ['val1', 'val2']), ('key2', ['val3', 'val2', 'val4'])]