00:01
那前面我们已经介绍了,在flink当中,系统给我们内置的所有的分区方法,其实都是基于data stream,调用一个对应的方法就可以实现这个分区操作了,那我们想到了,如果说我们想要的这种分区是一个非常精细非常特殊的分区策略,弗link给我们直接提供的这些方法都没有办法满足,那这个时候怎么办呢?啊,其实也有招,弗link还给我们提供了通用化的用户自定义分区的接口,那这个接口叫做cast啊,直接让我们可以自定义想要的分区操作,指定数据到底分配到哪个分区啊,接下来我们可以把这一部分也做一个简单的测试,那我们直接在代码里边新建一个object。那当前是。这个是用户自定义custom test。同样,我们还是把之前的。整个处理流程先copy过来,然后接下来我们把这个下划线引入,后面有影视转换。
01:04
我们同样还是直接读取当前自定义的数据源,定性度是一,接下来呢,诶,那当前要做的这个重分区的策略,我们就可以做一个更改了,这个叫做我们看叫做petition cast,然后这里边传餐的方式,我们看有两种已经被弃用了,接下来只有一种标准的传餐方式,我们点进去看一眼。我们可以看到哦,这个是被弃用的方式啊,我们看到只有下边这种是还在使用的方式,这种方式要传两个参数,第一个参数是一个。Petitioner。也就是所谓的分区器,诶那什么叫做分区器呢?点进去我们看到,诶,这又是一个interface,一个接口,里边有唯一的抽象方法,这个抽象方法就叫做petition,这就是我们的分区策略,然后它有两个参数,一个是K。K的话,当然就是我们当前指定分区的那个键,按照哪一个键,哪个关键字啊,哪个字段来进行分区,然后另外呢,还有一个int值,这个int值又是什么呢。
02:09
这是指定当前分区的总个数啊,然后最后呢,它要返回一个in的值,这个返回的数字就是我们当前这个数据最后要分配到的对应的下游子任务的编号啊,也就是分区的编号,所以整个的话啊,这个逻辑其实就是我们要把一个petitioner,一个分区器要先实现出来,然后我们看到后边还有一个参数。还有一个方式,这一个拉姆达表达式,这又是什么东西呢?啊,其实后边这里我们看到啊,它应该是一个提取当前的K的,也就是当前分区字段的一个方法啊,我们看到它是输入当前的数据流里边的数据类型,然后最后返回的数据类型是K的类型,也就是说它其实类似于我们之前KBY的时候传入的那个k select,那个K的选择器,我们当前利用这一个函数把当前的K指定,然后呢。
03:10
传给分区器,这里在分区器里边根据当前K的值去计算一下应该分配到哪个分区去,所以这就是自定义分区的一个逻辑,所以接下来我们可以做一个实线啊,当然现在的话就不是这个重分区了,比方说我们现在就是自定义。重分区策略。这个我们也可以简单一点啊,比方说我们这个数据源,哎,那就干脆我们还是直接用这个数字吧,就不要用click了,我们直接可以from elements,最简单的12345678。我们把这八个数直接就写死在这儿,然后接下来呢,自己去定义,还是像我们之前的策略,我们把奇数分配到一个分区,偶数分配到另外一个分区啊,这个非常简单的一个策略啊,那我们在这里如果要直接写的话,就应该是去你有一个。
04:09
Peter。然后里边我们看到有当前K啊,当前这个键值的类型,我们当前其实就是int了,因为本身这个数据是int类型,它的键也只有它自己嘛,哎,那所以键的类型和数据的类型都是int里边需要去实现。一个protect方法,这个protect方法的话啊,那其实我们知道就是针对当前的数值,当前的这个K的数值,然后对二做一个取模不就完了吗?哎,所以我们当前其实就是直接用K。百分号二的如果是奇数,那么百分号二之后得到是一,我们就输出到对应的一那个并行子任务。如果是偶数的话,对二取模是零,哎,那我们就用编号为零的那个并行子任务去输出当前的偶数,这就是我们基本的一个逻辑,然后当然了,这个还在报错啊,因为我们的参数没写完,后边还得一个当前的键的选择器啊,一个k select,那这里非常简单,其实就是自己嘛,所以我们写这个拉姆达表达式,其实就是自己把自己提取出来传进去就可以了。
05:16
所以前边这是一步自定义分区,后边是一个print,我们还是把后边这个print并行度设置为四,然后现在运行一下,我们看看输出之后,它们分别是输出到了哪一个对应的分区上面。我们看到现在尽管并行度为四,但是呢,三和四就都没有。当前我们定义的奇偶数就会按照它的奇偶性分别输出到一和二对应编号的并行子任务上。啊,当然了,现在我们看起来好像反了,就是如果是奇数的话,都输出到这个编号是二的这里了,如果是偶数的话,输出到一,这是因为我们底层的那个sub task ID,那个ID是从零开始的。
06:00
而我们最后显示这个编号的时候呢,是从一开始,所以本身我们这里啊,分配的偶数都是分配到了编号为零的这个分区,但是呢,输出显示的时候,显示这是第一个分区啊,这个对应关系其实还是对的啊啊,所以这就是关于我们自定义分区策略的一个测试啊,那关于物理分区这一部分我们就讲到这里。
我来说两句