具有多个连接的光滑反应流

时间:2015-11-21 13:56:32

标签: scala elasticsearch stream slick elastic4s

我有一个非常大的关系数据库数据集,我想在弹性搜索中编制索引。检索数据的查询包含多个连接和所有其他SQL好东西。对数据进行分组/处理(内存中)以创建有意义的json表示,并根据结果创建批量更新,并使用elastic4s scala客户端发送到弹性搜索。

我想在此过程中引入流媒体,因为slickelastic都支持它。

我遇到的问题是内存分组和转换为json只有在所有结果(对于给定关系)被加载到内存中时才会有意义(由于多个连接/左连接,我需要按id分组)将结果映射到内存中)。如何处理流媒体?

1 个答案:

答案 0 :(得分:1)

我已经解决了使用像下面的代码这样的平滑反应流来解决多个联接的流问题。这将使用发布者创建流,Elastic需要订阅该发布者才能开始检索流数据。

def listTransactions(): DatabasePublisher[Transaction] = {
  val join = for {
    (t, a) <- transactions joinLeft (account) on (_.accountid === _.id)
  } yield (t, a)
 db.stream(join.result.withStatementParameters(rsType = ResultSetType.ForwardOnly,rsConcurrency = ResultSetConcurrency.ReadOnly, fetchSize = 1000).transactionally).mapResult {
  result => result._1
  }
}

注意:-代码中的 _1 代表交易表。