如何在Pyspark中用嵌套的RDD列表获得不同的字典?

问题描述 投票:0回答:1

我有一个类似的问题。我如何在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"]

如果你有什么想法,我很乐意听到!

如果你有什么想法,我很乐意听到!感谢建设性的帮助。谢谢。

python pyspark rdd
1个回答
1
投票

就像评论中所说的:dict总是包含一个键和一个列表作为值,你可以尝试以下方法。

rdd = sc.parallelize([
    {"link0":["link1","link2"]}, {"link1":["link2","link3"]},
    {"link0":["link1","link2"]}, {"link3":["link4","link5"]}])

任务一: 找到唯一的RDD元素

使用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']}]

任务-2:在值中找到唯一的链接,但不包括在字典的键中。

将所有的唯一键检索到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']
© www.soinside.com 2019 - 2024. All rights reserved.