首页 > 解决方案 > 元组的可迭代值上的 ReduceByKey

问题描述

我正在尝试计算特定项目在特定日期的出现次数。

我输入的结构是Date\tItem1:AppearencesOfItem1,...,ItemN:AppearencesOfItemN

例子

20/10/2000\tItem1:1,Item2:5
20/10/2000\tItem1:2
21/10/2000\tItem1:5

为此,我创建了以下 PairRdd 结构:

[(20/10/2000, (Item1, 1))
(20/10/2000, (Item2, 5))
(20/10/2000, (Item1, 5))
(21/10/2000, (Item1, 5))]

然后groupByKey在导致:

[(20/10/2000, Iterable[(Item1, 1), (Item2, 5), (Item1, 5))
 (21/10/2000, Iterable[(Item1, 5)]

在这一步之后我想要做的是减少这些对的值,并对共享相同键的项目的外观求和,这样结果就会变成这样:

[(20/10/2000, Iterable[(Item1, 6), (Item2, 5))
 (21/10/2000, Iterable[(Item1, 5)]

但是,我还没有找到降低这些 pairRdds 价值的方法。我的方法首先是错误的吗?

标签: scalaapache-sparkrdd

解决方案


可以通过两步来实现:

  1. 按前两列求和
  2. 按第一列分组(或减少性能)

    val data = List( 
      ("20/10/2000", "Item1", 1),
      ("20/10/2000", "Item2", 5),
      ("20/10/2000", "Item1", 5),
      ("21/10/2000", "Item1", 5)
    )
    val originalRDD = sparkContext.parallelize(data)
    
    val sumRDD = originalRDD.map(v => ((v._1, v._2), v._3)).reduceByKey(_ + _)
    sumRDD.map(v => ((v._1._1), (v._1._2, v._2))).groupByKey().foreach(println)
    

输出:

(21/10/2000,CompactBuffer((Item1,5)))
(20/10/2000,CompactBuffer((Item1,6), (Item2,5)))

推荐阅读