首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将一些记录从TableA复制到TableB中,使用流畅的流和akka流

如何将一些记录从TableA复制到TableB中,使用流畅的流和akka流
EN

Stack Overflow用户
提问于 2017-06-08 07:50:36
回答 1查看 150关注 0票数 0

有两个表TableATableB

我需要将一些记录从TableA复制到TableB。我使用slick-3.0并使用以下方式:

代码语言:javascript
复制
import akka.stream._
import akka.stream.scaladsl._
...

//{{ READ DATA FROM TABLE A
val q = TableA.filter(somePredicate).result
val source = Source.fromPublisher {
      db.stream(q.result).mapResult { r => 
        val record: RecordA = someTransformation(r) 
        record
      }
    }.grouped(50) // grouping because I want to write records in batch mode
//}}

//{{ WRITE DATA TO TABLE B
val f:Future[Done] = source.runWith(Sink.foreach { batch: Seq[RecordA] =>
      //TODO how to write batch to TableB asynchronously?
      val insertAction = TableB ++= batch  // insert batch to table
      val fInsert: Future[_] = db.run(insertAction)
      Await.result(fInsert, ...)           // #1 this works only with blocking
})
//}}

但是我遇到了一个问题--如何异步地将批处理写入TableB (参见TODO)。现在,上面的代码只用于阻塞内部未来(参见#1注释)。是否有一种异步实现该任务的正确方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-08 09:52:02

使用mapAsync,它期望返回一个未来,并在下一个阶段公开“未包装”结果。

代码语言:javascript
复制
source.mapAsync(4){batch: Seq[RecordA] =>
      val insertAction = TableB ++= batch  // insert batch to table
      db.run(insertAction)
}).to(Sink.ignore).run
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44429762

复制
相关文章

相似问题

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