【问题标题】:How to get distinct dicts with nested list of RDD in Pyspark?如何在 Pyspark 中使用 RDD 的嵌套列表获取不同的字典?
【发布时间】:2020-05-23 04:58:06
【问题描述】:

我有一个类似的问题: How can I get a distinct RDD of dicts in PySpark?

但是,有一些区别。 我有一个字典,其中键为字符串,列表为值,形状如下:

{"link0":["link1","link2",...]}

所以在我的每个 RDD 分区中都存储了字典。

collect 函数会返回一个列表:

[{"link0":["link1","link2",...]}, {"link1":["link2","link3",...]}, ...]

假设例如在我存储的 RDD 的第一个分区中:

[{"link0":["link1","link2"]}, {"link1":["link2","link3"]}]

在分区二:

[{"link0":["link1","link2"]}, {"link3":["link4","link5"]}]

我真正想做的是在 RDD 上获取所有不同的字典,与上面的问题相同:

[{"link0":["link1","link2"]}, {"link1":["link2","link3"]}, 
{"link3":["link4","link5"]}] 

然而,当谈到价值观列表时,我很难应对。 你有什么建议如何处理吗?

我尝试应用提到的 dict_to_string() 方法,但不确定这是否真的是处理此问题的正确方法。

我还考虑过将数据结构更改为更好的结构。

您有什么想法更适合我的目的吗?

在我得到所有不同的key:[] 对之后,我想获取/过滤掉所有字典中列表中的所有唯一链接,除了那些已经在字典中作为键的链接,然后将它们存储在一个新列表中:

["link2", "link4", "link5"]

如果您有任何想法,我很乐意听到!

感谢您提供建设性帮助。 谢谢。

【问题讨论】:

  • 字典是否总是包含一个键和一个列表作为值?
  • 是的,确实如此。

标签: python pyspark rdd


【解决方案1】:

正如评论:字典总是包含一个键和一个列表作为值。您可以尝试以下方法:

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

Task-1:找到唯一的 RDD 元素:

使用 flatMap 将 dict 转换为元组,其值部分从列表到元组,以便 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']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    相关资源
    最近更新 更多