我有以下csv文件:
Name Age City Start Stop Point
Mike 29 Fuji 10 30 5
Mike 29 Fuji 0 10 7
Susan 26 Fuji 77 1000 9我正试着进入点,给出名字,年龄,城市和范围
举例:
Mike, 29, Fuji, 15 will yield 5
Mike, 29, Fuji, 5 will yield 7
Susan, 26, Fuji, 990 will yield 9
Susan, 26, Fuji, 1500 will yield 0 since there's no match我阅读了csv并尝试构建一个Scala [String,Map[Int,Map[String,MapInt,Int]],但是考虑到我有几千条记录,这并不是非常可伸缩的。开始范围和停止范围是不相交的,必须与其他行相关联。
如何在不使用SQL数据库或KeyValue存储的情况下有效地编码和解码这些数据?任何帮助都将不胜感激。
发布于 2017-04-21 17:00:17
下面是一个简单的版本,使用键(Person)和范围(RangeAndPoint)的案例类--文章中缺少一些细节(例如,范围包含/排他吗?)他们不相交吗?没有找到匹配范围,结果应该是什么?
case class Person(name: String, age: Int, city: String)
case class RangeAndPoint(start: Int, end: Int, point: Int) {
def inRange(value: Int): Boolean = value < end && value >= start
}
// Let's assume CSV was read into such a format - I'll hard-code it here for the example:
val persons: Map[Person, List[RangeAndPoint]] = Map(
Person("Mike", 29, "Fuji") -> List(RangeAndPoint(10, 30, 5), RangeAndPoint(0, 10, 7)),
Person("Susan", 26, "Fuji") -> List(RangeAndPoint(77, 1000, 9))
)
// returns the expected result or None if no match found:
def getPoint(name: String, age: Int, city: String, value: Int): Option[Int] = {
persons
.get(Person(name, age, city))
.flatMap(_.find(_.inRange(value)))
.map(_.point)
}
println(getPoint("Mike", 29, "Fuji", 15)) // Some(5)
println(getPoint("Mike", 29, "Fuji", 5)) // Some(7)
println(getPoint("Susan", 26, "Fuji", 990)) // Some(9)https://stackoverflow.com/questions/43547955
复制相似问题