我有两个输入流。我想基于相同的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
,它基于Foo
和Bar
中的相同ID。
另外,对于id不匹配的Foo
和Bar
,我想保留在内存中,我想知道是否有一种干净的方式来执行它,因为它是有状态的。
更重要的是,源元素是有序的。如果找到ID重复项,则应首先匹配策略。这意味着如果Foo(1, "foo-1"), Foo(1, "foo-2")
和Bar(1, "Bar-1")
,则匹配应为MergeResult(1, "foo-1", "Bar-1")
。
我正在寻找akka流的一些解决方案。如果有像Spark,Flink等一些好的解决方案,那也会有所帮助。
提前致谢。
答案 0 :(得分:1)
您正在描述连接操作。
Akka流不支持联接操作。你可能会找到一种方法来使用每个流上的窗口和一些actor / stateful转换来进行它们之间的查找,但是上次我搜索这个时我找不到任何东西(不久前),所以你可能在未知的水域
你只会在更重量级的框架上找到关于流的连接:Flink,Spark Streaming,Kafka流。原因是连接从根本上说是一个流对另一个流的查找,这意味着它需要比Akka流设计者想要处理的更复杂的东西(状态管理)。