这是一个家庭作业问题:
我有一个RDD
,它是一个集合os元组。我还有从每个输入元组返回字典的函数。不知何故,与reduce函数相反。
使用地图,我可以轻松地从RDD
个元组转到RDD
个词典。但是,由于字典是(键,值)对的集合,我想将RDD
字典转换为每个字典内容的RDD
(键,值)元组。
这样,如果我的RDD
包含10个元组,那么我会得到一个RDD
包含10个包含5个元素的字典(例如),最后我得到50个元组的RDD
我认为这必须是可能的但是,怎么样? (也许问题是我不知道如何用英语调用这个操作)
答案 0 :(得分:13)
我的2美分:
有一个名为“collectAsMap”的PairRDD函数,它从RDD返回一个字典。
让我举个例子:
sample = someRDD.sample(0, 0.0001, 0)
sample_dict = sample.collectAsMap()
print sample.collect()
print sample_dict
[('hi', 4123.0)]
{'hi': 4123.0}
文档here
希望它有所帮助! 此致!
答案 1 :(得分:6)
我想你想要的只是一个flatMap
:
dicts = sc.parallelize([{"foo": 1, "bar": 2}, {"foo": 3, "baz": -1, "bar": 5}])
dicts.flatMap(lambda x: x.items())
flatMap
从RDD元素获取函数到iterable,然后连接结果。 Spark上下文之外的相同类型操作的另一个名称是mapcat
:
>>> from toolz.curried import map, mapcat, concat, pipe
>>> from itertools import repeat
>>> pipe(range(4), mapcat(lambda i: repeat(i, i + 1)), list)
[0, 1, 1, 2, 2, 2, 3, 3, 3, 3]
或一步一步走:
>>> pipe(range(4), map(lambda i: repeat(i, i + 1)), concat, list)
[0, 1, 1, 2, 2, 2, 3, 3, 3, 3]
使用itertools.chain
>>> from itertools import chain
>>> pipe((repeat(i, i + 1) for i in range(4)), chain.from_iterable, list)
>>> [0, 1, 1, 2, 2, 2, 3, 3, 3, 3]