我有一个类似的问题。我如何在PySpark中获得一个独特的RDD的dicts?
然而,这其中有一些区别。我有一个键为字符串,值为列表的 dict,形状如下。
{"link0":["link1","link2",...]}
.
所以在我的每个RDD分区中都存储了dict。
收集函数给了我一个列表。
[{"link0":["link1","link2",...]}, {"link1":["link2","link3",...]}, ...]
比如说在我的RDD分区之一中我存储了:
[{"link0":["link1","link2"]}, {"link1":["link2","link3"]}]
和
在第二分区中。
[{"link0":["link1","link2"]}, {"link3":["link4","link5"]}]
我实际上想做的是把所有不同的dicts都放在RDD上,就像上面的问题一样。
[{"link0":["link1","link2"]}, {"link1":["link2","link3"]},
{"link3":["link4","link5"]}]
然而,当涉及到列表中的值时,我很苦恼如何应对。你有什么建议如何处理吗?
我试着应用提到的dict_to_string()方法,但不确定这是否真的是正确的处理方式。
另外,我也想过把数据结构改成一个更好的结构。
你有什么想法吗?
在我得到了所有不同的 key:[]
对 我想在所有的dict中过滤掉列表中所有的唯一链接,除了那些已经在dict中作为key的链接,然后将它们存储在一个新的列表中。
["link2", "link4", "link5"]
如果你有什么想法,我很乐意听到!
如果你有什么想法,我很乐意听到!感谢建设性的帮助。谢谢。
就像评论中所说的:dict总是包含一个键和一个列表作为值,你可以尝试以下方法。
rdd = sc.parallelize([
{"link0":["link1","link2"]}, {"link1":["link2","link3"]},
{"link0":["link1","link2"]}, {"link3":["link4","link5"]}])
使用flatMap将dict转换为元组,值部分从list转换为元组,这样RDD元素就可以哈希了,采取distinct(),然后将RDD元素映射回其原始数据结构。
rdd.flatMap(lambda x: [ (k,tuple(v)) for k,v in x.items() ]) \
.distinct() \
.map(lambda x: {x[0]:list(x[1])}) \
.collect()
#[{'link0': ['link1', 'link2']},
# {'link1': ['link2', 'link3']},
# {'link3': ['link4', 'link5']}]
将所有的唯一键检索到rdd1中,将唯一值检索到rdd2中,然后进行 rdd2.subtract(rdd1)
rdd1 = rdd.flatMap(lambda x: x.keys()).distinct()
# ['link0', 'link1', 'link3']
rdd2 = rdd.flatMap(lambda x: [ v for vs in x.values() for v in vs ]).distinct()
# ['link1', 'link2', 'link3', 'link4', 'link5']
rdd2.subtract(rdd1).collect()
# ['link2', 'link5', 'link4']