一些转换(join,coGroup,keyBy,groupBy)要求在一组元素上定义一个键。其他转换(Reduce,GroupReduce,Aggregate,Windows)允许使用key 对数据进行分组。
DataSet被分组为:
DataSet<...> input = // [...]
DataSet<...> reduced = input
.groupBy(/*define key here*/)
.reduceGroup(/*do something*/);
同时可以给DataStream指定一个键,方法如下:
DataStream<...> input = // [...]
DataStream<...> windowed = input
.keyBy(/*define key here*/)
.window(/*window specification*/);
Flink的数据模型不是基于键值对。因此,您不需要将数据集类型物理打包到键和值中。Keys是“虚拟”:它们被定义为实际数据的函数,以指导分组运算符。
两种典型用法
dataStream.keyBy("someKey") // 指定对象中的 "someKey"字段作为分组key
dataStream.keyBy(0) //指定Tuple中的第一个元素作为分组key
注意:以下类型是无法作为key的
1:一个实体类对象,没有重写hashCode方法,并且依赖object的hashCode方法
2:一个任意形式的数组类型
3:基本数据类型,int,long
简单来说就是DataSet用groupBy分组,而DataStream用keyBy分组