svk*_*994 5 scala higher-order-functions
我正在尝试在 Scala 中 reduceByKeys,是否有任何方法可以根据 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)
Run Code Online (Sandbox Code Playgroud)
在上述步骤之后,我得到的结果为:
(2,250.0)
(2,129.99)
(4,49.98)
(4,299.95)
(4,150.0)
(4,199.92)
(5,299.98)
(5,299.95)
Run Code Online (Sandbox Code Playgroud)
预期结果 :
(2,379.99)
(5,499.93)
.......
Run Code Online (Sandbox Code Playgroud)
开始Scala 2.13,您可以使用该groupMapReduce方法(顾名思义)相当于 agroupBy后跟mapValues和一个reduce步骤:
io.Source.fromFile("file.txt")
.getLines.to(LazyList)
.map(_.split(','))
.groupMapReduce(_(1))(_(4).toDouble)(_ + _)
Run Code Online (Sandbox Code Playgroud)
舞台groupMapReduce:
groups 按第二个元素 ( _(1)) 分割数组( MapReduce组的组部分)
map将每个组中的每个数组出现到其第 4 个元素,并将其转换为Double( ) (映射组Map_(4).toDouble Reduce的一部分)
reduce通过对每个组 ( _ + _) 中的 s 值求和(减少 groupMap Reduce的一部分)。
这是可以通过以下方式翻译的一次性版本:
seq.groupBy(_(1)).mapValues(_.map(_(4).toDouble).reduce(_ + _))
Run Code Online (Sandbox Code Playgroud)
Iterator另请注意从to进行强制转换LazyList,以便使用提供的集合groupMapReduce(我们不使用 a ,Stream因为我们建议替换s)。Scala 2.13LazyListStream
| 归档时间: |
|
| 查看次数: |
1052 次 |
| 最近记录: |