在Akka Stream中合并基于相同ID的两个流

时间:2018-01-06 03:05:53

标签: scala akka-stream stream-processing

我有两个输入流。我想基于相同的ID合并两个流元素。这是代码详细信息

  implicit val system = ActorSystem("sourceDemo")
  implicit val materializer = ActorMaterializer()

  case class Foo(id: Int, value: String)
  case class Bar(id: Int, value: String)
  case class MergeResult(id: Int, fooValue: String, barValue: String)

  val sourceOne = Source(List.fill(100)(Foo(Random.nextInt(100), value = "foo")))
  val sourceTwo = Source(List.fill(100)(Bar(Random.nextInt(100), value = "bar")))

我希望得到的结果是MergeResult,它基于FooBar中的相同ID。

另外,对于id不匹配的FooBar,我想保留在内存中,我想知道是否有一种干净的方式来执行它,因为它是有状态的。

更重要的是,源元素是有序的。如果找到ID重复项,则应首先匹配策略。这意味着如果Foo(1, "foo-1"), Foo(1, "foo-2")Bar(1, "Bar-1"),则匹配应为MergeResult(1, "foo-1", "Bar-1")

我正在寻找akka流的一些解决方案。如果有像Spark,Flink等一些好的解决方案,那也会有所帮助。

提前致谢。

1 个答案:

答案 0 :(得分:1)

您正在描述连接操作。

Akka流不支持联接操作。你可能会找到一种方法来使用每个流上的窗口和一些actor / stateful转换来进行它们之间的查找,但是上次我搜索这个时我找不到任何东西(不久前),所以你可能在未知的水域

你只会在更重量级的框架上找到关于流的连接:Flink,Spark Streaming,Kafka流。原因是连接从根本上说是一个流对另一个流的查找,这意味着它需要比Akka流设计者想要处理的更复杂的东西(状态管理)。