00:00
那既然有基本数据类型,当然就有更复杂一些的数据类型,在基本数据类型之上,相同的类型组合在一起就可以构成一个数组啊。那弗林当然也是支持数组类型的,数组类型里面就包括了所谓的基本类型的数组窝,还有就是对象数组。啊,我们可以把那个基本类型的数据元素放在一起构成一个数组,也可以把object对象构成一个数组。那对应在源码的定义里,我们可以看到太平ER这个包下边下边啊,除了这些我们刚才看到的啊,Time啊呃,这个。Nothing,还有这个之类的这些时间相关的定义,还有basic type和numeric type他们之类的定义之外,还有就是数组相关的定义。这里有。Primitive type,这就是基本数组类型对应的类型信息。
01:02
那我们就想到了,那对象数组又在哪里呢?这里好像没有看到object array啊,这个是在。下边我们看到有一个Java这个包,下边又有一个type you,在这个里边我们又会看到各种各样的复杂类型的类型信息的具体实实现。我们可以看到,这里就有object in。这就是我们所说的对象数组类型。那除了这个数组类型之外,在这个type下边我们就可以看到其他各种各样的集合类型,或者其他的一些符合数据类型。这里边最需要注意的是一个比较特殊的所谓的元组类型,就是type。也就是说之前我们在代码里边曾经使用过的二元的那个数据类型,其实就是一种type,就是一种组类型,它的类型信息就是元组类型信息,那么对于这个元组,我们可以看到它其实有这个泛型,这个泛型当然就是temple类型了,这个类型是抓flink里边单独定义声明出来的一种数据类型。
02:16
我们知道在s scla里边,它原生原里边就有元组类型,而Java里面是没有的,所以flink要单独把它做一个定义,而这个原组类型跟SKY里边会有所不同,它的具体实现啊,这里本身temple本身是抽象类,那么它的具体实现呢?是TEMPLE0到TALE25,也就是零元组到25元组有26个具体的实现啊,那这里边的元组的字段是不支持空字段。除了Java元组类型之外,还支持类型。我们可以看到,在之前的。Temple type infer对应的这个下边还有一些其他的数据类型,比如说type infer。
03:07
这里所谓的其实就是简单Java对象啊,那么po类型在flink里边,它是需要有一些特定的定义的,类似于JA病的模式定义,之前我们已经强调过,这里再来重复一下,那就是首先类必须要是公共的public,而且是独立的,也就是说它并没有非静态的内部类。然后另外类里边必须要有一个公共的无参构造方法,嗯,而且类里边所有的字段必须是public,而且是并不是final的啊,也就是说必须是能够直接访问到的。或者它里边可以提提供公共的get或者方法啊,这就相当于是符合了抓的命名规范。在flink里边,它必须符合这些要求,才能够直接把它解析成自己能够识别,直接能够提取出里边字段的po。
04:08
这是关于类型的定义。那除了Java里边的元组类型和po类型之外,当然在flink里边也是支持scala里边的元组类型和它的,那CA里的po类型当然就是样例类了,就最简单的skyla里面的类啊,那就是样例类。除了这些之外,那另外还有一个比较特殊的类型,这里也需要说一下,就是所谓的行类型肉type in。啊,那所谓的肉呢?其实在关系数据库里边,我们都非常的熟悉,一张表里边的每一条数据其实就是一行,那么这一行里边可能会包含了多个字段,所以从本质上讲,所谓的行类型肉,其实可以认为它就是有。很多个字段的元组,它的原这个元组的字段个数可以是任意一个,而且它还支持空字段,所以整体来讲,它其实比元组类型更加的灵活。
05:09
在后面我们会讲到。Flink里边的table API和flink CQ在这些API里边使用的时候,肉类型非常的常见。这就是所谓的符合数据类型,那除了这些符合数据类型之外,比较复杂的类型之外,那还有一些所谓的辅助类型,这其实就是我们比较常见的一些结合类型,还有option啊,Either啊,这些Java里边提供出来的一些基本类型了啊,我们可以看到这里边有对应的一些typefer的实现,Either type infer,还有这个枚举类型啊,In type infer,还有这个list map,对应的type iner都是有的。所以整体总结一一下的话,那就是flink,它是支持所有的Java类型和类型的。那我们自然会想到,如果说没有有一些类Java或者SKY类啊,没有按照之前我们说的这个po类的格式来定义的话,那能不能flink能不能直接把它识别出来,或者说fli能不能正常运行呢?啊,当然正常运行是没有问题的,但是里边的信息可能flink就会提取不出来,因为在这种场景下。
06:24
Flink会把它当成一个普通的泛型类型来处理,那什么叫泛型类型呢?简单来讲就是说flink只看最外层的那个类型,然后这个外层类型里边可能有一个泛型,那泛泛型到底是什么,Flink就不关心了,所以对于flink来讲,泛型类型就是一个黑盒。我只关心最外边这个盒子外层到底是什么类型,那内层的那些内部属性。具体就无法获取了啊,那所以所有的这些内部信息,如果获取不到的话,我们再去做一些提取转换或者序列化的时候,就会遇到一些问题啊,因为它本身并不是由flink来做这个序列化的。
07:11
我们来总结一下,在所有上面提到的这些类型里边,最灵活最方便的其实就是元组类型和类型,因为他们可以支持非常复杂的数据结构啊,那我们可以外层定义层元组,或者定义一个一个简单对象的这个po类,然后内层呢,再去定义每一个字段,每一个属性。那相比之下,Po跟元组相比啊,它还可以给每一个字段有一个可读性非常的名称在后面,我们会知道,我们在定义键定义这个K的时候,可以直接使用它的字段名称来定义,这样的话我们的代码的可读性就会大大的增强。所以一般情况在项目实战当中,比较推荐我们把想要处理的数据。
08:01
转换成联系。这是关于flink里边类型系统的一个综述。那后面我们还要单独的提出一个比较重要的概念,就是类型提示types,其实这一部分内容前面也已经提到过了啊,这主要就是因为flink里边是有一整套类型提取系统的,这跟前面我们讲到的这个类型系统type information是密不可分的。就是。为什么非要把那些简单的或者符合的类型再完全做一个包装,包成type information呢?就是因为它可以通过自己的这一套类型提取系统,直接可以分析每一个算子。设定的函数里边的输入和返回的类型自动的去获取判断类型的信息,那这样的话就可以直接去调用对应的去硫化器和反反去硫化器去对数据进行处理了。
09:01
但是我们知道,假如说这个时候我们提取出来之后的是一个泛型类型的话,呃,就是里边具体的类型不知道,只知道外面那层壳的类型。那么我们在做序列化和反序列化的过程当中就会出现一些问题了。因为Java里边有泛型擦除里边的信息,到时候指所有的东西都不知道了啊,这就是我们说的。里边这条河流上啊,漂浮着一些大船,但这个船我只知道它是船,但是这个船里边每一个位置,每一个细节,到底它的结构是什么样的,呃,这个完全是不知道的,但是如果我们要真正精细的处理数据的话。Flink是需要知道这些信息的,那怎么办呢?那就是用类型提示来指明,告诉flink我这里面的数据内部结构到底是什么样。我们可以回忆一下之前写过的程序啊,在work程序里边,其实我们就做了这一件事情。
10:06
当时我们其实就用了在flat map这个操作之后,我们把数据转换成了二元组,但是我们知道Java里边有泛擦除,所以它能够提取出来的只知道当前的数据变成了二元组,那至于二元组每个字段里边的类型到底是什么,那其实弗林可是不知道。那怎么样能让它更加精细的处理这些数据呢?这里我们就要加一个返回一个当前的类型提示类型信息,那这一部分我们就把它叫做类型提示,这里调用的方法就是。调用一个点returns。然后里边传入一个对应的类型信息,我们这里边传入的是types,然后我们看到这个types其实是一个工具类了啊,里边有各种各样类型的对应的定义,把它们都定义成了里边的一个常量,所以我们在这里边,呃,直接去。
11:07
调用types下边对应的那个类型就可以了,而且比方说如果是一个元组类型的话,我们还可以加上括号里边再给它传进对应的内部属性的信息传进去啊,所以这样的话,我们就可以让flink真正的解析出细节,每一个细节里边的所有数据类型。那当然了,这是一个比较简单的场景啊,二元组两个元素,那里边都是基本数据类型,我们可能会想到,那假如说我们这个每一个元素里边又是一个符合的数据类型,也就是说相当于我们这个泛型是层层相嵌套。泛型套泛型,那又怎么办呢?哎,这里边弗link还提供了另外一种方式,那就是使用type PI这样的一个类,它能直接捕获泛型的类型信息,而这个类非常的强大,而且一直记录下来,在我们处理的过程当中就可以提供足够多的信息。
12:09
所以使用的过程呢,跟前面的这种方式非常的接近,也是直接调用点returns方法,后边直接传入new一个type。然后定义它的时候,我们就直接把里边的所有泛型信息添加在里边就可以了,我们看这里就直接用这种层层嵌套的方式。甜甜到。Type的型里边,然后直接就可以把它保存下来了。所以这种方式在实际使用的过程当中可能会更加的直观,更加的简单一些。对于比较复杂的嵌套的数据类型,我们可以使用的方式。告诉当前的类型信息。就是关于flink当中所支持的数据类型和link内置的类型系统。
我来说两句