首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scala中最快的数据编码和解码方法

scala中最快的数据编码和解码方法
EN

Stack Overflow用户
提问于 2017-04-21 16:41:01
回答 1查看 308关注 0票数 0

我有以下csv文件:

代码语言:javascript
复制
Name    Age City    Start   Stop    Point
Mike    29  Fuji    10      30      5
Mike    29  Fuji    0       10      7
Susan   26  Fuji    77      1000    9

我正试着进入点,给出名字,年龄,城市和范围

举例:

代码语言:javascript
复制
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存储的情况下有效地编码和解码这些数据?任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-21 17:00:17

下面是一个简单的版本,使用键(Person)和范围(RangeAndPoint)的案例类--文章中缺少一些细节(例如,范围包含/排他吗?)他们不相交吗?没有找到匹配范围,结果应该是什么?

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43547955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档