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 中*,
> >
>

回复