[英]Extracting a dictionary from an RDD in Pyspark
这是一个功课问题:
我有一个RDD
,它是一个集合os元组。 我还有从每个输入元组返回字典的函数。 不知何故,与减少功能相反。
有了地图,我可以很容易地从一个去RDD
元组到RDD
字典。 但是,因为字典是的(键,值)对的集合,我想的转换RDD
字典到RDD
(键,值),每个字典内容的元组。
这样,如果我的RDD
包含10个元组,那么我得到一个RDD
其中包含10个带有5个元素的字典(例如),最后我获得了50个元组的RDD
。
我认为这必须是可能的但是,怎么样? (也许问题是我不知道这个操作是如何用英语调用的)
我的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}
文档在这里
希望能帮助到你! 问候!
我想你想要的只是一个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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.