如何在 Scala 中像计数一样进行聚合
How to make aggregation like count in scala
你好,
我一直坚持使用 scala 中的集合。我有一个这样的列表:
val a2 = List(("C",2.0,288,1978),
("C",2.5,307,1978),
("C",3.0,312,1978),
("C",2.5,377,1978),
("C",1.0,571,1978),
("H"," ",288,1978),
("H",2.5,307, 1978),
("A",4.0,187,2003),
("A",3.0,260, 2003))
我的目标是使用具有第 1 和第 4 个值(流派和年份)的分组依据并计算第 2 和第 3 个值。然后,应添加一个新列以构成 count_2nd/count_3rd。最后的样子应该是这样的:
C, 1978 -> 5, 5 , 1.0
H, 1978 -> 1, 2, 0.5
A, 2003 -> 2, 2, 1.0
我试过了:
a2.flatMap(row => row._2.map( nm => (row._1,nm.rating,nm.userId,row._3)))
但 IDE 不允许添加类似 .count(i => i._2) 的内容。我想我做这件事的方式很糟糕。
数据中也应该有空值,在第6行数据中有一个空值。通过考虑空值,我希望在 count_2nd/count_3rd.
中有一些不同的值
在 scala 中是否可行,如果可行,我将不胜感激:)
如果您需要分组依据 - 使用分组依据:
val a2: List[(String, Double, Int, Option[Int])] = List(("Comedy", 2.0, 288, Some(1978)),
("Comedy", 2.5, 307, Some(1978)),
("Comedy", 3.0, 312, Some(1978)),
("Comedy", 2.5, 377, Some(1978)),
("Comedy", 1.0, 571, Some(1978)),
("Horror", Double.NaN, 288, Some(1978)),
("Horror", 2.5, 307, Some(1978)),
("Adventure", 4.0, 187, Some(2003)),
("Adventure", 3.0, 260, Some(2003)))
val result = a2.groupBy(t => (t._1, t._4))
.view
.mapValues(lst => (lst.filter(!_._2.isNaN).length, lst.filter(!_._3.isNaN).length)) // transform grouping into tuple with needed counts
.mapValues(t => (t._1, t._2, t._1.toFloat / t._2)) // "add" 3rd column
.toMap
println(result) // prints Map((Horror,Some(1978)) -> (1,2,0.5), (Comedy,Some(1978)) -> (5,5,1.0), (Adventure,Some(2003)) -> (2,2,1.0))
你好,
我一直坚持使用 scala 中的集合。我有一个这样的列表:
val a2 = List(("C",2.0,288,1978),
("C",2.5,307,1978),
("C",3.0,312,1978),
("C",2.5,377,1978),
("C",1.0,571,1978),
("H"," ",288,1978),
("H",2.5,307, 1978),
("A",4.0,187,2003),
("A",3.0,260, 2003))
我的目标是使用具有第 1 和第 4 个值(流派和年份)的分组依据并计算第 2 和第 3 个值。然后,应添加一个新列以构成 count_2nd/count_3rd。最后的样子应该是这样的:
C, 1978 -> 5, 5 , 1.0
H, 1978 -> 1, 2, 0.5
A, 2003 -> 2, 2, 1.0
我试过了:
a2.flatMap(row => row._2.map( nm => (row._1,nm.rating,nm.userId,row._3)))
但 IDE 不允许添加类似 .count(i => i._2) 的内容。我想我做这件事的方式很糟糕。
数据中也应该有空值,在第6行数据中有一个空值。通过考虑空值,我希望在 count_2nd/count_3rd.
中有一些不同的值在 scala 中是否可行,如果可行,我将不胜感激:)
如果您需要分组依据 - 使用分组依据:
val a2: List[(String, Double, Int, Option[Int])] = List(("Comedy", 2.0, 288, Some(1978)),
("Comedy", 2.5, 307, Some(1978)),
("Comedy", 3.0, 312, Some(1978)),
("Comedy", 2.5, 377, Some(1978)),
("Comedy", 1.0, 571, Some(1978)),
("Horror", Double.NaN, 288, Some(1978)),
("Horror", 2.5, 307, Some(1978)),
("Adventure", 4.0, 187, Some(2003)),
("Adventure", 3.0, 260, Some(2003)))
val result = a2.groupBy(t => (t._1, t._4))
.view
.mapValues(lst => (lst.filter(!_._2.isNaN).length, lst.filter(!_._3.isNaN).length)) // transform grouping into tuple with needed counts
.mapValues(t => (t._1, t._2, t._1.toFloat / t._2)) // "add" 3rd column
.toMap
println(result) // prints Map((Horror,Some(1978)) -> (1,2,0.5), (Comedy,Some(1978)) -> (5,5,1.0), (Adventure,Some(2003)) -> (2,2,1.0))