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()方法来指定返回类型.

图片

发表评论

邮箱地址不会被公开。 必填项已用*标注