HI, @Bial Liu. 首先多谢你的解答,抱歉我后面一直忙,没有回复。我今天又看了一下,发现是我理解的不对。
首先你说的部分是对的,keyBy,只是通过 KeyGroupStreamPartitioner 对 key进行hash 分组,决定具体的发送对象,而对象的个数,就是下个节点的并行度。不会针对key的具体值做分组。 但另一方面,xxx.keyby(0).sum(0) 这样的代码也是可以正确的。理由也很简单。针对key具体值的操作,是keyedStream支持的,所以KeyedStream里面的方法基本都对key做了内部的分别计算,比如xx.sum(0),里面不同key,对应不同的 计算对象。常用的window操作也是这样。 而我的代码之所以错误,就是因为flatmap的方法来自于普通的DataStream,不支持对不同key分别计算。 On Mon, Apr 8, 2019 at 3:51 PM Biao Liu <mmyy1...@gmail.com> wrote: > Hi, 尝试理解fli一下你的疑问 > “其中,每个具体mapFunc处理的数据,应该是相同的key数据。不知理解是否正确” > -> keyby 只会保证相同 key 的数据会被分在相同 mapFunc 中,每个 mapFunc 可能会处理不同 key 的数据,详见官网文档: > > https://ci.apache.org/projects/flink/flink-docs-release-1.7/dev/stream/operators/ > > Yaoting Gong <fall.for.you....@gmail.com> 于2019年4月4日周四 下午2:00写道: > > > 大家好, > > > > 先说本人的理解,keyed(..).flatmap(mapFunc()) > > 其中,每个具体mapFunc处理的数据,应该是相同的key数据。不知理解是否正确。 > > > > 我的具体情况是 > > 我对数据对校验处理。首先根据设备id (uuid) 分组,然后针对不同分组进行数据校验。 > > 部分代码如下: > > > > rowData.filter(legalData _) > > .map(data => BehaviorComVO(getText(data, "id"), getText(data, "uuid"), > > getText(data, "session_id"), getText(data, "source"), getText(data, > > "product_version"))) > > * .keyBy(_.uuid)* > > * .flatMap(new RepeatIdCheckDispatch())* > > .addSink(....) > > > > *RepeatIdCheckDispatch* 细节: > > > > * override def flatMap(in: BehaviorComVO, out: Collector[String]): Unit > = > > {* > > > > * in match {* > > * case BehaviorComVO(_, _, _, "visit", _) =>* > > * if (!repeatIdChecker.isOK) out.collect(repeatIdChecker.result)* > > > > * repeatIdChecker = RepeatIdChecker(in)* > > > > * case _: BehaviorComVO => repeatIdChecker.doCheck(in)* > > * }* > > * }* > > > > "visit" 是一个周期数据的开始。。但是运行之后,我发现,有其他uuid的数据,进入到同一个 *RepeatIdChecker 中*, > > >