00:00
我们现在已经了解了在flink当中怎么样去读取无界数据、有界数据,还知道了怎么样去自定义一个数据源去进行数据的读取。有了这些了解,那接下来我们其实就可以考虑对数据进行处理转换了,但是在这之前呢,我们还应该考虑一个问题。就是当前我们读取数据源之后,得到的都是一个data stream,都是一个数据流啊,那接下来当然我们调用的就是基于data stream的方法嘛,我们叫做data stream API,那这个数据流里边的每一个元素呢,它其实也是有自己的数据类型的。比如这里我们举的例子啊,就都是包装成了每一个用户点击网页的一个事件,叫做event,我们把它包装的是一个GALA的case class样例类。那前面我们在介绍的过程当中也会发现啊,也可以是什么呢?读取文本文件得到的就是一个。
01:01
String类型,一个字符串类型的。那另外呢啊,我们也可以直接读取一串数进来,那得到的就是一个int类型的整数类型的data stream,具体里边元素的类型是什么?这是通过data stream的泛型来表示出来的。那当然我们就会想到了,对于flink来讲,它到底支持什么样的类型,作为我们当前data STEM的泛型呢?作为我们当前这个数据流里边元素的数据类型呢?简单来讲的话,那就是Java和SKY里边常见的数据类型都是支持的。诶,那我们会想到它为什么会有不支持的类型呢?哎,这个主要就是要考虑到我们当前这个flink是一个分布式的处理框架。所以呢,呃,我们在不同的这个节点之间,它是有可能要做这个数据传输的。我们前一个任务,诶,在当前的第一个节点上完成了,完成之后呢,下一步操作它有可能是到第二个节点上去做的,哎,所以这就涉及到节点之间的数据传输,那对于一个数据而言,我们当然在传输的过程当中就要做序列化和反序列化。
02:13
所以这里面我们就会发现啊,对于flink来说,它必须得能把我们对应的这个数据类型,能够首先能够把它序列化,生成字节数据啊,然后呢,传输之后还能够进行反序列化,做一个解析,恢复出原来的样子。那在这个过程当中,假如说哎,我我们知道这个弗林格处理的数据,它是流嘛,就像一条河一样,那数据在上面流动,就像是在这个河流上面漂浮着的物体,假如这个数据比较简单的话,Flink当然可以直接把它恢复出来啊,或者有一些数据,这个我们有可能就完全不需要恢复啊,直接改一下它的数据类型就可以了,就像这里的这个int,那有些时候呢,可能我们这个数据就会很复杂。
03:00
有可能它是就像一艘大船一样,我们做序列化的时候,相当于把这个大船里边的零件都拆下来了。然后呃,排成了一排传递过去,接下来得到之后呢,我们就得有这艘大船的结构图,然后按照图纸能够把它再拼接出来。这就涉及到flink到底能不能解析我们对应的这套数据结构了,那对于弗link来讲呢,它是自己实现了一整套完整的类型系统来对我们当前的数据类型进行处理的啊,在弗link里边它的这个类型系统啊。最关键的底层的就是一个叫做type information的这样的一个类啊,这个类呢,它其实就是flink当中所有类型描述符的一个积累,它里边就涵盖了一些基本属性,为每个数据类型都可以去生成特定的序列化器、反序列化器和比较器。
04:00
啊,那么我们也可以到源码里边直接去看一眼啊,这个type information这样一个类,我们可以看到这个类啊,它本身是一个抽象类啊,然后它是实现了able这个接口,然后在这个里边啊,这里边就有各种各样的这个方法,对应的这些方法。在这里它可以创建当前类型的啊,Size序列化器,另外呢,可以定义这个to string,还有equals比较方法,另外还有哈希code啊,求哈希值的一些方法啊啊,那所以这个type information就是所有类型的一个积类,另外呢,我们可能会想到那弗link里边到底支持哪些具体的类型呢?诶,我们可以直接找到对应的这个位置啊。就在type information同样的这个包里边,我们可以看到它就是在当前这个link Co下边的这个common type iner里边,另外呢,还有一个types。Types这个类里边,在这儿就定义了flink当中所支持的所有的类型啊,我们可以看到啊,这里边首先啊,这有voidid void,我们知道是空类型啊,啊它这比较特殊的一个类型,另外还有就是像stream bulling shot in the float,我们可以看到啊基本数据类型。
05:15
以及他们的包装类型在这里边都有,另外还有就是像啊,Big decim对应的这个啊,Big in对应的啊,还有这个date time,所有的这些类型在这里边都属于基本数据类型,都有对应的支持啊,那除了基本数据类型之外呢,Flink还支持数组类型,数组类型就包含了基本数组和对象数组,哎,这两个在当前的types里边也可以看得非常明显啊,在最下边。我们可以看到当前就有primitive array基本类型数组啊,另外还有object array对象类型数组。那除了基本类型和数组类型之外呢,我们看到还有就是一些复合的数据类型,比如说Java里边的元组类型。
06:07
Poal类型,还有这个skyla里边的样例类和skyla的元组类型啊,其实我们知道这个skyla的样例类就可以看成一种特殊的po啊啊,那它给我们直接实现了一些啊,像to string啊,ES啊,Copy啊哈,Code啊,On apply啊,这些方法啊,都都已经给我们实现了,所以这个SKY里面样梨类是非常好用的,另外还有一个比较特殊的复合类型,就是肉类型,行类型啊,可以认为就是。有任意一个字段的一个元组类型,而且它支持空字段啊,所以我们知道在这个表结构里边啊,肉类型是非常好用的,所以后边我们讲到高层级的API,讲到flink CQ的时候,诶里边的数据类型,肉类型使用的就会比较频繁,比较多。那对应的我们在源码里边也是可以看到,在前面我们可以看到啊,这里是po类型,这里是temp类型啊,元组类型,另外我们还可以看到。
07:06
上面还有肉类型,还当前的这个行类型,所有的这些在里边都可以找到对应的定义啊,那后边呢,我们看到还有一些就是所谓的。辅助类型啊啊,就是我们所说的啊,在Java或者scalela里边的,像这个map啊,List,还有枚举类型啊,对应的这些常见的集合类型啊,这些都是支持的,另外还有一个比较特殊的类型,我们看到叫做generic啊,就是所谓的泛型类型,但是这个比较特殊,我们这里可以做一个简单的解释,因为前面我们想到啊,那你这里边既然有肉,有这个元组类型,还有这个po类型,这些不就已经支持了几乎所有的类了吗?哎,但是注意啊,这里边所支持的Java po类型,这是flink专门有要求的,它自定义的一种特殊的类型,类似于Java病那种模式,但是呢,又有一些特殊的要求,特殊的需要,诶,那所以呢,不是所有的类抓va类都可以当做弗link支持的po类来进行处理的。
08:11
好,哎,那所以如果出现了没有按照弗link要求的po类型定义的那些类的时候,这个时候怎么办呢?哎,那弗link就直接把它当做泛型类来处理,也就是这里所谓的generic。泛型类呢,简单来讲就是一个黑盒里边的属性完全不知道,也不做解解析啊,那他也不是由这个link本身做序列化的啊,而是由Co这个工具去进行序列化,诶,所以这种类型的我们一般是要避免的啊,这种在做这个序列化反序列化的过程当中,有可能就会得不到正确的属性和数据。所以我们总结起来的话就会发现啊,Flink。可以说支持所有的Java和SKY里面的基本类型,以及他们的复合类型,复杂类型,只不过呢,对于一般化的Java类,这种类型它是有特别的要求的。
09:07
所有的类型里边,最为灵活最为方便的类型,那就是元组类型和po类型了啊,这里边元组类型呢,它的好处就在于就是我们不管里边的数据啊,它到底每一个数据的具体类型是什么,我们都可以把它放在一起,直接组合起来处理就可以了啊,那po类型的好处呢,那是在于我们还可以为每一个属性定义专门的名称来,这样的话可读性就会更强一些。他们都支持复杂的类型。啊,那对于Java开发而言,这个po类型可能还有很多具体的要求啊,这个我们并不关心,因为我们现在用的是skyla,那skyla里边怎么样实现对应的po类型呢?这个就更简单,我们直接用样例类,它不就相当于是类似的一种Java病吗?那所以SC拉的样例类link是直接支持的,哎,所以我们一般情况啊,在后面的代码当中,我们都是使用样例类来作为我们当前数据流处理过程当中每一个元素的基本类型。
10:12
这就是关于flink所支持的类型系统。
我来说两句