我发现了相对类似的问题,但仍然找不到我需要的解决方案。
长话短说,我在数据流中进行了一些转换,最后得到的对象看起来像这样(String,Seq [Strings]),它表示字符串分区名称和可用的国家代码列表对于此分区。第二种选择是让它像Seq [(String,String)]具有一个元组序列(分区名称,国家/地区代码),但是无论如何我都会遇到相同的问题。
最后,我将与此国家代码关联的分区名称写入名称为“ smth_COUNTRY_CODE.txt”的文件中
问题是-我无法理解如何针对字符串序列中的每个国家/地区代码分别进行编写。
到目前为止,我有类似的东西:
case class PartitionWithCodes(name: String, codes: Seq[String])
val partitions = Await.result(queryApi.getPartitions(inputCatalogVersion, layer, AdditionalFields.All), Duration.Inf)
val flowRdfPartition = Flow[Partition].mapAsync(parallelism)(partition => readEngine.get(partition, data => RoadAttributesPartition.parseFrom(data)))
val flowPartitionName = Flow[RoadAttributesPartition]
.filter(CountryCodeUtils.filterPartitionByTheCode(_, countryCodes))
CountryCodeUtils.matchCountryCodesToObject(partition))
.map(partition => CountryCodeUtils.getPartitionsWithCodes(partition))
// at this point I will have PartitionWithCodes object
现在,我将尝试执行以下操作:
val fileFlow = Flow[PartitionWithCodes]
.map(partition =>
partition.codes.map {
code => {
val outFile = constructFilename(fileName, code, format)
Source.single(ByteString(partition.name + separator)).runWith(FileIO.toPath(Paths.get(outFile))
.mapMaterializedValue { f =>
f.onComplete {
case Success(r) if r.wasSuccessful => println(s"Read ${r.count} bytes from ${partition.name}")
case Success(r) => println(s"Something went wrong when reading ${partition.name}: ${r.getError}")
case Failure(NonFatal(e)) => println(s"Something went wrong when reading ${partition.name}: $e")
}
Keep.right
}
)
}
})
// Of course code below wouldn't work.
val source = partitions.via(flowRdfPartition).via(flowPartitionName).via(fileFlow)
val fileSink = Sink.foreach[IOResult]{println}
val result = source.via(fileFlow).to(fileSink)
问题是-如何针对序列中的每个国家/地区代码进行编写?我发布了fileFlow代码部分作为示例,说明了我的想法往哪个方向发展,但我可能完全错了。 我对Akka还是很陌生,不知道该怎么做。
先谢谢了。描述很模糊,但是如果需要的话,我会详细解释。