首页 > 解决方案 > scala数据分析,使用纯scala通过重叠间隔进行分组

问题描述

我有一个用于存储数据的案例类: case class A (x: String, y: String, a: Int, b: Int)

现在数据是一个案例类列表, List(A(x1, y1, a1, a2), A(x1, y2, a2, b2), ..., A(xn, yn, an, bn))其中 A1、A2、A3 是案例类的不同实例。

现在,如果条目在 (a, b) 定义的重叠区间内,我需要对数据进行分组。

所以如果各种记录就像

List(
  A(x0, y1, 1, 5), 
  A(x0, y2, 3, 8), 
  A(x0, y3, 7, 10), 
  A(x0, y4, 12,15), 
  A(x1, y5, 1, 8), 
  A(x2, y6, 2, 7), ...)

最终分组将基于案例 B 类: case class B (x: String, y:List(String), a:Int, b: Int)

输出:List(B(x0, List(y1, y2, y3), 1, 10), B(x0, List(y4), 12, 15), B(x1, List(y5,y6), 1, 8), ...)

标签: scaladata-analysis

解决方案


这可能是一种可能的解决方案,使用可变映射。

case class A(x: String, y: String, a: Int, b: Int)
case class B(x: String, y: List[String], a: Int, b: Int)

val input = List(
  A("x0", "y1", 1, 5),
  A("x0", "y2", 3, 8),
  A("x0", "y3", 7, 10),
  A("x0", "y4", 12, 15),
  A("x1", "y5", 1, 8),
  A("x2", "y6", 2, 7))

val temp = scala.collection.mutable.Map[String, B]()

input.map(data => {
  if (temp.contains(data.x)) {
    val _B = temp(data.x)
    val updatedList = _B.y ++ List(data.y)
    //TODO:
    //Range for a & b
    val a = data.a
    val b = data.b
    temp += (data.x -> B(data.x, updatedList, a, b))
  } else {
    temp += (data.x -> B(data.x, List(data.y), data.a, data.b))
  }
})
val output = temp.values.toList
println(output)
//List(B(x2,List(y6),2,7), B(x1,List(y5),1,8), B(x0,List(y1, y2, y3, y4),12,15))

推荐阅读