繁体   English   中英

从Pyspark中的RDD中提取字典

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM