python - Pyspark - 将字典列表(piplelinedRDD)扁平化为单个字典并按键按值分组

标签 python dictionary group-by pyspark rdd

我有一个存储在 piplelinedRDD 中的字典列表,看起来像这样:

[{ZDX: ID_42, XCZ: ID_32, ZXD: ID_434}, {ZDX: ID_69, XXF: ID_30, HGL: ID_239, XCZ: ID_01}]

我想产生如下所示的输出

{ZDX: [ID_42, ID_69], XCZ: [ID_32, ID_01], ZXD: [ID_434], XXF: [ID_30], HGL :[ID_239]}

由于它存储在 pipelinedRDD 中,因此字典也不可迭代。

最佳答案

我使用整数作为字典的值,如果你有字符串,过程是相同的。

启动RDD

>>> rdd = sc.parallelize([{'ZDX': 42, 'XCZ': 32, 'XD': 434}, {'ZDX': 69, 'XXF': 30, 'HGL': 239, 'XCZ': 1}])

使用代表您的对(键,值)的元组创建 RDD:

>>> items = rdd.flatMap(lambda line: (line.items()))
>>> items.take(items.count())
[('XCZ', 32),('ZDX', 42), ('XD', 434), ('XCZ', 1),('HGL', 239),('ZDX', 69),('XXF', 30)]

按键分组:

>>> groupedItems = items.groupByKey().mapValues(list)
>>> groupedItems.take(groupedItems.count())
>>> [('XCZ', [32, 1]),('ZDX', [42, 69]), ('XXF', [30]),('HGL', [239]), ('XD', [434])]

使用collectAsMap为了从 RDD 中获取字典

>>> d = groupedItems.collectAsMap()
>>> {'HGL': [239], 'XCZ': [32, 1], 'XD': [434], 'XXF': [30], 'ZDX': [42, 69]}

关于python - Pyspark - 将字典列表(piplelinedRDD)扁平化为单个字典并按键按值分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44457658/

相关文章:

python - pygame : Why does calling a function inside the game loop inside Game loop make my game lag?

python - 按行中的值平均 python pandas

java - 使用 ValueComparator 按值对 Map<Integer, Float> 进行排序会在 Java 8 中出错

sql - SQL-GROUP BY和COALESCE的丑陋组合

python - Pandas - Groupby 数据框存储为数据框而不聚合

c++ - 将多个元素添加到 map<pair> c++

python程序从输入写入json

sql - 按 float 日期范围分组

mysql - 使用联接、分组依据和全文的 where 子句中的未知列 xxx

python - Odoo 9 模块至 V10