00:00
已经创建好了表,那下一步呢,当然就是针对这个表去进行查询、转换、计算,做数据的处理了,所以接下来第三步我们应该要做的就是表的查询转换。这一步操作呢,当然就对应着我们在link data stream API当中所做的transform中间的那些查询转换了,啊,那所以接下来我们有两种方式可以去进行调用,第一种我们非常熟悉的,那就是。直接写CQ的方式了啊,其实之前我们在这个快速上手的案例里边也是看到了啊,直接写CQ,然后调用一个table env的CQ query方法,把这个CQ啊作为一个字符串直接传进去就可以了啊,这个过程其实是非常非常简单的,我们就会看到啊,就像我们在MYCQ啊,或者have啊,对应的这些关系数据库里边直接去进行操作的,这个语法是完全一样的。这应该说是我们最为熟悉的查询转换方式了啊,弗link的底层呢,它其实是基于阿帕奇k set这个工具来提供CQ的支持的啊,那K呢,它是一个为不同的计算平台提供标准CQ查询的底层工具啊,那很多大数据的框架啊,比如说这个have麒麟里边啊,所使用的这个CQ的支持都是通过集成阿帕奇t set来进行实现的。
01:26
啊,那所以弗林也不例外啊,有现成的东西当然要拿来用了。当然我们也没有必要去了解太多底层的东西啊,直接在这里使用的时候,我们只要知道怎么调就行了嘛,那就是基于table,因为。去调一个CQ query里边穿一个字符串,把我们要去写的CQ塞进去就可以了,比如说哎,这里边我们非常简单的啊,去做一个select操作,哎,那还是跟之前的这个过程差不多啊,我们筛选当前的u I Du URL。我们还可以再加上哎,后边的TS,所有的字段都筛出来,这个完全是没有问题的啊,那后面当然是要from哪张表了,这张表的话很显然我们已经在。
02:12
创建连接系表的时候,在环境里边就已经注册过even table,现在当然就可以在CQ里面直接用了from table啊,那当然我们可以有对应的这个筛选条件where啊,比方说UID。等于某一个字段啊,像之前我们定义的,比方说等于Alice,这是完全可以去实现的这个过程,其实我们之前在这个简单实现已经做过啊,这里就是相当于再复习一下,得到这个结果呢,哎,我们知道c query执行的结果。得到的就是一个table的对象实例啊,那所以呢,哎,我们当前的这个table可以叫做result table。这个是完全没问题的。这个例子当然是非常简单了,我们也可以再来举一个稍微复杂一点的例子,哎,比如说啊,我们之前不是做过按照用户的名称UID来做一个分组,统计当前每一个用户他所访问的URL的个数啊,相当于做一个count统计啊,类似于work count这样的一个技术啊,那相当于可以反映每一个用户的活跃度,那这样一个统计怎么做操作呢?之前啊,我们在data three API的调用过程当中,那是需要哎做先做一个外部转换,又是一个user一个一,一个user一个一,然后呢,按照user去做一个分组K,然后接下来去做一个sum,或者做一个聚合。
03:34
这是我们之前所实现的过程,现在如果要用CQ的话,那就简单多了,我们知道在CQ当中有很多内置的聚合函数嘛,我们可以直接做计算的,当前我们基于k set做了这个CQ集成的话,当然经典的那些函数都是可以直接拿来用的。所以比方说啊,现在我们。直接做一个统计。每个用户访问频次的这样一个啊数据的统计计算,那怎么样去做操作呢?我们还是啊,直接基于QV去调一个q query方法里边传一个string类型的CQ,我们现在要做的操作,那当然了还是select。
04:15
比方说我们现在想要得到的字段就是诶,一个用户,然后对应的一个count数量就完了嘛,所以这里边一个UID这里要选择的,然后接下来呢,哎,那我们知道啊,C课里边直接就有一个count函数,哎,我们直接调一个这个count函数不就完了吗?哎,当然了,Count里边可以指定当前的字段,哎,我们当前可以去指定啊,当然也可以去比方说传一个一啊,直接统计个数,这个都是可以的,我们现在统计的就是ul对应的个数,所以把它传进去count URL。然后哎,那还是。From。Even table。另外我们现在还得做一个按照用户的分组,既然要做聚合嘛,肯定是要先做分组的啊,那现在不是P了,CQ里边就是group u ID,哎,那这样的话,一句CQ直接把我们这个需求就搞定了,哎,这个就非常的熟悉啊,按照用户分组,然后去统计每个用户的访问频次。
05:15
那得到的这个结果呢?当然又是一个table的对象实例,我们可以把它叫做每个用户的,呃,他访问的URL的count个数啊。我们可以叫做URL。所以我们可以看到啊,直接使用CQ去进行表的查询转换,其实是非常非常方便的啊,那当然了。Table API和Li CQ里边还有另外一种与它对应的转换方式,那就是我们所说的调用table API了,啊,那这个调用过程呢,跟直接去写一条CQ去执行这就不太一样了,它是要基于一个table的对象实例去做方法调用,哎,那我们现在有没有基于的一个table对象呢?现在没有,之前我们创建连接器表的时候,直接是在表环境里边注册了一个1TABLE,我们并没有获取到它的对象实例。
06:09
那接下来怎么调退步API呢?那就是先要做一个转换,先从当前的表环境里边捕捉到对应这张表的table对象实例啊,那这个方法调用的也是。要基于表环境tablev去调,哎,那这个方法呢,就是直接我们看直接from,这就之前我们所提到的啊,直接from from哪里呢?当然就是当前表环境里边已经注册好的那个表啊,那就是even table了,我们直接把它拿出来,那得到的结果我们看就是一个table对象了。啊,在早些时候的table API版本里边呢,还有一个方法叫做scan扫描啊,最后我们看到啊,呃,就是有些老的代码里边,可能它调用的是这种方式去从当前的表环境里边去创建出一个table的对象来,但是这种方式现在已经被弃用了,直接from就可以了。
07:09
所以我们可以看到啊,现在我们要做的这个操作啊,得到的就是一个比方说我们就叫做event table。得到这样一个table的对象实例,然后接下来当然就可以基于even table去做各种各样的方法调用了啊,比如说像前面我们提到的啊,呃,Select什么样的字段,然后from这张表,然后where这样一个条件,那其实就是调用select和where方法嘛啊,那这里的select和where先调哪个,后调哪个,其实是没有影响,比如说之前我们在这里是先调用了select,然后调用了where,那我们现在在这儿呢,想换一下先做一个VR调用啊,甚至我们看到这里还有这个。U这样的方法啊啊,里边传的都是一个expression,这两个其实是完全等价的,里边传入的呢,哎,当然就是Dollar啊。
08:03
我们可以把这个做一个引入。Import,注意引入的是table API expressions下边的Dollar,然后我们指定的啊,比方说现在我们要的,哎。我们不再去指定这个user了啊,比方说我们要筛选的是URL啊,那同样也可以去让他做一个is e判断。假如说我们当前。访问的是后页面的话,那就把对应的这个数据啊筛选出来。啊,那后边我们同样可以做一个。投影字段的提取啊,那就是select了,当前还是用Dollar符做一个expression表达式的书写。比方说我们提取的是。URL。以及。UID啊,那后边如果说我们还想把这个时间出来输出一样的啊,给多少个都一样TS啊,这样提取出来就可以了。啊,所以我们会看到啊,在具体使用的过程当中,很显然直接写CQ会更加容易理解,而且也更加方便一点啊,使用这个table API的话,有可能中间我们还要进行转换啊,那另外还有一个就是这种语法呢,就有点不伦不类啊,有点尴尬,所以一般在实际使用的过程当中,都是直接写CQ就可以了。
09:22
那这还是只是做了一个非常简单的一个事例,那如果说我们想要实现类似于这个count的功能的一个分组聚合的话,诶,那直接去调用这个API就会更麻烦了啊,这个我们就不再去展开去介绍了,后边我们的介绍呢,就都是直接写CQ就可以了。那这里还要多提一句,就是我们当前做了这个调用之后,得到结果是什么呢?哎,其实得到的又是一个新的table,所以我们可以把它叫做result。TABLE2,哎,那它跟之前我们得到这个result table就是对应的啊,当然我们这里边的处理逻辑是不太一样的,本质上它是类似的。
10:01
这就是我们所说的啊,两种不同的表的查询转换的方式,在实际应用的过程当中呢,其实我们熟悉之后啊,一般我们都是直接使用CQ啊,但是有时候呢,可能我们也会把这两者结合起来进行使用,因为每一次CQL查询的结果啊得到的,那这其实还是一个table的对象实例嘛,哎,所以有时候有可能我们基于这个table对象实例,直接就可以去调对应的这些table API去做一个简单的转换啊,有时候会直接这么去做啊,那另外还涉及到一个问题,就是我们得到这个新的对象实例,如果基于它要做进一步的转换查询又该怎么做呢?诶,那就是我们说的啊,还可以再把这个对象实例再。当前的这个表环境里边去做一个注册啊,这就是我们说的创建表的第二种方式,创建一个虚拟表。创建。虚拟表,或者说创建一个虚拟视图啊,比方说之前我们得到这个result table啊,我们可以把它在当前的环境里边做一个注册table env,注册的时候我们还记得是create tempor review里边传两个参数,前面第一个是一个string,这就是当前注册的表的名称啊,这个名称可以跟之前这个一样,也可以不一样啊,比如说我们当前这个啊,就叫做一个呃,中间的结果啊,比方说我们就叫做temptable,这个完全是可以的。
11:28
后边传入的呢,第二个参数就是。某一个想要做注册的table的对象实例啊,这样的话,接下来我们在CQ当中就可以直接使用tempt table这样一个表明了去进行转换操作,直接写CQ就可以了。这就是关于表的查询转换的过程啊,那至于说表的更复杂的一些查询转换,比如说我们这里边还没有提到,之前曾经强调过DSAPI里边比较高级的那些用法啊,比如说诶,更加复杂的聚合操作,比如说开窗口去进行聚合,比如说进行两张表的状元操作,这些我们都没有涉及到,哎,那所以本质上来讲,那些操作啊,都可以归到表的查询转换这里。
12:12
我们在这儿呢,只是简单的做了一个介绍。
我来说两句