Scala 将多个映射函数应用于流式数据库将导致播放2.6
我有一个大问题,似乎是一个主要的候选人 我想调用一个函数,它返回一个对象,我可以对该对象应用额外的映射转换,然后最终将整个结果转换为一个列表。这是因为转换将产生一组比数据库中的结果小得多的对象,并且有许多不同的转换必须按顺序进行。一次处理每个结果将节省大量内存 例如,如果来自数据库的结果是一个流(尽管正确的结果可能是AkkaStream或Iteratee),那么我可以执行以下操作:Scala 将多个映射函数应用于流式数据库将导致播放2.6,scala,akka-stream,anorm,Scala,Akka Stream,Anorm,我有一个大问题,似乎是一个主要的候选人 我想调用一个函数,它返回一个对象,我可以对该对象应用额外的映射转换,然后最终将整个结果转换为一个列表。这是因为转换将产生一组比数据库中的结果小得多的对象,并且有许多不同的转换必须按顺序进行。一次处理每个结果将节省大量内存 例如,如果来自数据库的结果是一个流(尽管正确的结果可能是AkkaStream或Iteratee),那么我可以执行以下操作: def outer(converter1[String, Int}, converter2[Int,Double]
def outer(converter1[String, Int}, converter2[Int,Double]) {
val sqlIterator = getSqlIterator()
val mappedIterator1 = sqlIterator.map(x => converter1(x.bigColumn))
val mappedIterator2 = sqlIterator.map(x => converter2(x))
val retVal = mappedIterator.toList
retVal
}
def getSqlIterator() {
val selectedObjects = SQL( """SELECT * FROM table""").map { x =>
val id = x[Long]("id")
val tinyColumn = x[String]("tiny_column")
val bigColumn = x[String]("big_column")
NewObject(id, tinyColumn, bigColumn)
}
val transformed = UNKNOWN_FUNCTION(selectedObjects)
transformed
}
大多数文档似乎提供了将“reduce”函数应用于结果的机制,而不是“map”函数,但是生成的映射函数将更小,从而节省大量内存。对于未知函数,我应该怎么做?下面是一个简单的示例,使用Anorm的Akka Streams支持从类型为
String
的单个列读取值,对每个元素应用两个转换,并将结果放在序列中。如果您需要的话,我将把它作为一个练习,让您一次从多个列中检索值
import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.Sink
import anorm._
import scala.collection.immutable.Seq
import scala.concurrent.Future
implicit val system = ActorSystem("MySystem")
implicit val materializer = ActorMaterializer()
implicit val ec = system.dispatcher
val convertStringToInt: String => Int = ???
val convertIntToDouble: Int => Double = ???
val result: Future[Seq[Double]] =
AkkaStream.source(SQL"SELECT big_column FROM table", SqlParser.scalar[String])
.map(convertStringToInt)
.map(convertIntToDouble)
.runWith(Sink.seq[Double])
你看了这些文件了吗?问题不是我需要删除列,而是我需要处理列。更具体地说,一个大列包含大量JSON,我解析JSON,然后使用许多不同的函数对其进行操作。存储内存中所有行的所有JSON是不可行的。您看过[streaming documentation]()了吗?要使用foldX
(或Akka流)机制吗?这非常有效!将结果转化为实际值的最佳方法是什么?我做了类似的事情,但最后做了:.runForeach(f=>{myList.append(f)}而不是.runWith(),我还使用了wait.ready(result,Duration.Inf),因为我需要结果才能取得更大的进展。