scala - 如何在“Scala”中按键减少 [不在 Spark 中]
问题描述
我正在尝试在 Scala 中减少 ByKeys,是否有任何方法可以根据 Scala 中的键来减少值。[我知道我们可以通过 spark 中的 reduceByKey 方法来做,但是我们如何在 Scala 中做同样的事情?]
输入数据是:
val File = Source.fromFile("C:/Users/svk12/git/data/retail_db/order_items/part-00000")
.getLines()
.toList
val map = File.map(x => x.split(","))
.map(x => (x(1),x(4)))
map.take(10).foreach(println)
在上述步骤之后,我得到的结果为:
(2,250.0)
(2,129.99)
(4,49.98)
(4,299.95)
(4,150.0)
(4,199.92)
(5,299.98)
(5,299.95)
预期结果 :
(2,379.99)
(5,499.93)
.......
解决方案
开始Scala 2.13
,您可以使用groupMapReduce
(顾名思义)等效于 agroupBy
后跟mapValues
和reduce
步骤的方法:
io.Source.fromFile("file.txt")
.getLines.to(LazyList)
.map(_.split(','))
.groupMapReduce(_(1))(_(4).toDouble)(_ + _)
groupMapReduce
舞台:
group
s 由它们的第二个元素 ( ) 拆分的数组(组MapReduce_(1)
的组部分)map
s 每个组中的每个数组出现到其第 4 个元素并将其转换为Double
(_(4).toDouble
)(映射组Map Reduce 的一部分)reduce
通过对每个组 (_ + _
) 中的 s 值求和(减少 groupMap Reduce的一部分)。
这是可以通过以下方式翻译的一次性版本:
seq.groupBy(_(1)).mapValues(_.map(_(4).toDouble).reduce(_ + _))
还要注意从Iterator
toLazyList
的转换,以便使用提供的集合groupMapReduce
(我们不使用 a ,Stream
因为 start是推荐的 s 替换)。Scala 2.13
LazyList
Stream
推荐阅读
- swift - 在每个 TimeIntervalNotification 中不重复的随机元素
- devexpress - 如何在 WinAppDriver 中找到 DevExpress Grid Cell Active Editor 元素
- c++ - 蛇游戏:蛇的运动
- java - 如何使用 java css 处理 onkeypress 属性
- c++ - 错误:无法传递非平凡类型“std::string”的对象和更多错误
- android - 将自定义布局添加到生物识别提示
- java - 在另一个模块中获取资源的 URL
- php - 我们可以在谷歌云 ubuntu vm 实例中使用 xampp 作为在线服务器吗
- python - 如何在 python 中访问 numpy 结构化数组中的多个列值?
- java - 如何以 [%thread] 日志格式而不是 https-jsse-nio-9005-exec-2 添加其余调用]