Flink中的数据类型
Flink中由于数据会在内部进行传输,那么必然需要进行序列化和反序列化.
那么对于内部支持的类型,Flink提供了特定的序列化,反序列化以及比较器
那么Flink支持了什么数据类型?
1. 原始类型
2. Java和Scala 元祖
3. Scala 样例类
4. POJO
5. 特殊类型
对于无法理解的类型,则会交给Kryo来进行序列化
那么我们看下不同类型的使用
Flink支持所有Java和Scala的原始类型,例如Int,String,Double
Java和Scala元祖
元祖是固定数量的字段组成的复杂数据结构
Scala本身提供了元组,使用起来也很简单,而Java则是在SDK中提供了一个元祖的实现,从Tuple1一直到Tuple25
在元祖中,各个字段可以通过公有的字段名称来进行访问
f0,f1,f2,或者通过 getField(int pos)来进行基于位置的访问,下标从0开始
与 Scala不同Java元祖是可变的,故可以重复利用.
Sacla的样例类和Java中的Class类似,可以直接访问,我们如下定义了一个Person,有两个字段 name,age
POJO,这是Flink尝试分析的结果,如果一个类复合一下的条件,就可以是POJO
其是一个公有类
是一个公有的无参构造函数
所有字段都是公布了对应的getter和setter方法,并且符合命名规范
所有字段类型,都需要是Flink支持的.
而且Flink还提供了诸如ArrayList,HashMap,Enum等数据结构和类型信息.
Flink类型系统的核心是TypeInfomation,提供了足够信息,
当应用提交了,一个类型提取器会分析所有函数的泛型类型及返回类型.获取对应的TypeInfomation对象当然也可以手动告诉Flink,对应的类型,Java中生成TypeInfomation的工具类
org.apache.flink.api.common.typeinfo.Types
那么在获取了Types之后,我们如何告诉Flink使用我们提供的TypeInformation对象呢?
有两种方法,一种是通过实现ResultTypeQueryable接口来扩展函数
比如下面的代码
第二种则是在定义Dataflow中使用returns()方法来指定返回类型.