python - 在 PySpark 中展平嵌套字典列表

标签 python dictionary apache-spark nested pyspark

我需要使用PySpark来展平以下包含嵌套字典的RDD,示例如下:

x = [{1: {345: 2}, 2: {33: 9}}, {5: {3: 2}, 2: {45, 9}}, {2: {33:5}}]

在我拥有的实际数据中,每个嵌套字典可能具有不同的长度和项目数量。 x只是结构的代表。

我需要输出为一个字典,其中键和值根据需要合并:

x_out = {1: {345:2}, 2: {33: 14, 45:9}, 5: {3, 2}}

我怎样才能实现这个目标?我尝试压平 RDD 但我不明白。我知道我必须以相同的方式使用combine 和reduceByKey。

这与处理元组和列表的链接问题不同。

最佳答案

val listOfMap = List(Map(1 -> Map(345 -> 2), 2 -> Map(33 -> 9)),
  Map(5 -> Map(3 -> 2), 2 -> Map(45 -> 9)),
  Map(2 -> Map(33 -> 5))
)

var listOfTuples = new ListBuffer[((Int, Int), Int)]()

for(map <- listOfMap) {
  for(k1 <- map.keys) {
    for(k2 <- map(k1).keys) {
      listOfTuples += Tuple2((k1, k2), map(k1)(k2))
    }
  }
}

listOfTuples.toList.foreach(println(_))    

// transform input to be list of tuple 
val listOfTuples = List((1, (345, 2)), (2, (33, 9)), (5, (3, 2)), (2, (45, 9)), (2, (33, 5)))

// make rdd from input
val rdd = spark.sparkContext.makeRDD(listOfTuples)

// make the key of rdd as (first level key, second level key)
// the rdd becomes ((k1, k2), val)
// reduce the key by summing the vals
val rdd2 = rdd.map(pair => ((pair._1, pair._2._1), pair._2._2)).reduceByKey(_ + _)

// the key is the first level key, re-construct the map entry as val
// aggregate them by grouping key
val rdd3 = rdd2.map(pair => (pair._1._1, Map(pair._1._1 -> Map(pair._1._2 -> pair._2)))).groupByKey()

// flat map the previous rdd
val rdd4 = rdd3.flatMap(pair => pair._2)

rdd4.take(10).foreach(print(_))

// result
Map(1 -> Map(345 -> 2))Map(5 -> Map(3 -> 2))Map(2 -> Map(45 -> 9))Map(2 -> Map(33 -> 14))

关于python - 在 PySpark 中展平嵌套字典列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46680757/

相关文章:

python - 为 Apache Hadoop 安装 Hue 浏览器时,Setuptools pip 失败,错误代码为 1

python - 代码适用于 Python 2,但不适用于 Python3 TypeError : a bytes-like object is required, 而不是 'str'

scala - Spark 斯卡拉 : mapPartitions in this use case

r - 是否可以将 Spark 中的 data.table 与 Spark Dataframes 一起使用?

python - Mac上某些按钮的IDLE崩溃

python - 我应该如何用 Python 编写朴素贝叶斯分类器?

IOS文字游戏。验证词性能

python - 字典 - 返回非零值和相应的索引位置

c# - 存储在嵌套字典C#中

java - 使用EMR/Spark将JSON转换为Parquet