Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 将多个映射函数应用于流式数据库将导致播放2.6_Scala_Akka Stream_Anorm - Fatal编程技术网

Scala 将多个映射函数应用于流式数据库将导致播放2.6

Scala 将多个映射函数应用于流式数据库将导致播放2.6,scala,akka-stream,anorm,Scala,Akka Stream,Anorm,我有一个大问题,似乎是一个主要的候选人 我想调用一个函数,它返回一个对象,我可以对该对象应用额外的映射转换,然后最终将整个结果转换为一个列表。这是因为转换将产生一组比数据库中的结果小得多的对象,并且有许多不同的转换必须按顺序进行。一次处理每个结果将节省大量内存 例如,如果来自数据库的结果是一个流(尽管正确的结果可能是AkkaStream或Iteratee),那么我可以执行以下操作: def outer(converter1[String, Int}, converter2[Int,Double]

我有一个大问题,似乎是一个主要的候选人

我想调用一个函数,它返回一个对象,我可以对该对象应用额外的映射转换,然后最终将整个结果转换为一个列表。这是因为转换将产生一组比数据库中的结果小得多的对象,并且有许多不同的转换必须按顺序进行。一次处理每个结果将节省大量内存

例如,如果来自数据库的结果是一个流(尽管正确的结果可能是AkkaStream或Iteratee),那么我可以执行以下操作:

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),因为我需要结果才能取得更大的进展。