Scala 如何使用同一流中存在的键对流的元素进行分组?

Scala 如何使用同一流中存在的键对流的元素进行分组?,scala,akka,akka-stream,Scala,Akka,Akka Stream,因此,我有以下类型: case class Episode( parentTconst: String, seasonNumber: Int, episodeNumber: Int ) 以及以下资料来源: val episodeSource: Source[Episode, _] = FileIO.fromPath(Paths.get(myDataFilePath)).via(myDataParserToEpisode) 事件列表示例如下: Seq( Episode("gam

因此,我有以下类型:

case class Episode(
  parentTconst: String,
  seasonNumber: Int,
  episodeNumber: Int
)
以及以下资料来源:

val episodeSource: Source[Episode, _] = FileIO.fromPath(Paths.get(myDataFilePath)).via(myDataParserToEpisode)
事件列表示例如下:

Seq(
  Episode("gameof", 5, 8),
  Episode("mentalist", 2, 4),
  Episode("gameof", 5, 8),
  Episode("mentalist", 1, 8),
  Episode("rikiandmanual", 1, 8)
)
我正在尝试进行以下流程(我不确定它是否是正确的签名,请给出建议,可能是一个水槽,因为我正在消耗整个流程来获取地图):

如果打印出来的话会是这样的:

Map(
  "gameof"        -> Seq(Episode("gameof", 5, 8), Episode("gameof", 5, 8)),
  "mentalist"     -> Seq(Episode("mentalist", 2, 4), Episode("mentalist", 1, 8)),
  "rikiandmanual" -> Seq(Episode("rikiandmanual", 1, 8))
)
我尝试了很多组合,但都不起作用。也许这种方法是不对的

我想我应该用groupBy。 另一件事是,我可能需要第一次使用流来获取组的键列表(或者可能找到一种方法使用它一次,但产生两个结果)

我躲开了,发现了关于广播的事,但我还没有完全意识到这一点

def getGroupedByParentConst:Flow[Spidence,Map[String,Seq[Spidence]],]=Flow[Spidence]。groupBy(2,u.parentConst)
但这是失败的(无论如何,我感觉这不是正确的道路)

另外,我想我应该提取parentConst以使用它们作为分组键:

def getparentconst:Flow[eption,Set[String],\uz]=Flow[eption]。fold(Set.empty[String]){
(右,左)=>{right++Set(left.parentconst)}
}
这是可行的,但我一直在琢磨如何使用它们对我的原始资料进行分组

另外,如果我使用键列表,这意味着,我必须使用两个流来获得分组

我想我有一个鸭子问题,这不是一个很难的问题,但是因为我有使用akka streams的限制,所以它不是很简单


任何帮助都将不胜感激。

您试图实现的目标无法以流式方式完成,因为创建所有分组剧集的地图需要读取内存中的所有数据。没有任何中间结果

如果你仍然想这样做,你可以使用折叠在一个类似的方式,你所建议的

Flow[Episode].fold(Map.empty[String, List[Episode]]) { (map, e) ⇒
  val key = e.parentTconst
  map + (key → v :: map.getOrElse(key, Nil))
}
但是,由于这将读取内存中的所有文件,您也可以省去使用akka流的麻烦,只需使用
scala.io.Source


如果有太多数据无法放入内存,则需要更改要求。

预期的类型错误。
Flow[eposion,Map[String,Seq[eposion]],\uquo;
意味着每个
eposion
都将转换为
Map[String,Seq[eposion]
,而不是批处理和聚合。
Flow[Episode].fold(Map.empty[String, List[Episode]]) { (map, e) ⇒
  val key = e.parentTconst
  map + (key → v :: map.getOrElse(key, Nil))
}