scala - 元组的可迭代值上的 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 价值的方法。我的方法首先是错误的吗?
解决方案
可以通过两步来实现:
- 按前两列求和
按第一列分组(或减少性能)
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)))
推荐阅读
- python - 无法使用 Keras 的内置 VGG16 预测 iimage
- python - Numpy错误:ImportError:DLL加载失败:找不到指定的模块
- c++ - 为什么在 C++ 中的这一行 std::unordered_map<>.insert().second 中返回布尔值
- postgresql - 如何在 for 循环中处理 SELECT 的两个选项
- android - 如何更新 ViewPager 适配器/FragmentStateAdapter?
- pine-script - 有没有办法在 Pine 中金字塔 strategy.close()
- loops - 在 GAMS 中使用映射进行计算
- shell - Shell:按窗口标题关闭窗口但不终止/杀死它
- java - 使用 Spring @Query 注释在 MongoDB 文档中删除数组字段的对象
- json - 使用 Powershell 将 JSON 数据转换为属性格式