00:00
好同学们啊,那么刚才呢,时间过去了一会儿,现在呢,我在查询数据的话呢,只能显示到三条数据了啊,那么为了把我刚才的数据呢都查出来,我这里呢,把开始的时间再往前调啊,从负一小时呢改成负二小时,点击提交啊可以看到呢,现在把之前的数据呢啊也给查出来了。好,那么接着我们这个查询的结果呢,来进行探讨啊,现在呢,我查询的是这个存储桶里的所有数据。呃,那么这个存储桶里面呢,有几个measurement呢?是不是只有一个,就是我们写的car,好啊,那么现在呢,我们回忆一下我们之前说的这个class DB管理数据的一个数据模型啊,我们说呢,In Fla DB是按照序列的方式去管理数据的。啊,那么现在呢,仿照这张图,我们去建一个PPT,哎在PPT里呢,把我们现在哎这个example query里面的数据呢,把它的序列给画一下,看他现在是里面是啊一个什么样的情况。好,我在这里呢,新建一个空白文档。
01:04
啊,这里呢,我把这个原本的东西给删掉。哎,此处呢,我截个图啊,截个图。好,我们拉上来。呃,我们现在呢,只有一个measurement,呃,就是我们所说的car。啊,我现在呢,把这个卡写进来好,呃,那么这里呢,我先把这个该关东西呢,关一下来,把这些屏给它清掉啊,把这个之前写的。好啊,那么现在呢,我们有一个measurement呢,就是car,然后呢,我们还有一个标签集叫code等于零一,哎,我这里呢,插入一个文本框。好,等于零一。啊,这是我们的标签级,那么我们之前是不是说过,哎,我们的measurement summer ment measurement。
02:00
哎,再加上一个t set,哎,再加标签集,再加一个字段名称fielded,哎,这三个东西联合起来是不是可以定义一个序列呢?哎,所以说呢,刚开始的时候我们去插入了一条数据啊,叫做这个car,然后呢,它的值是我们的,呃,它的这个标签呢,是扣的零一。哎,Code等于零一啊之后呢,我们就写了一个right等于35啊,那么我们知道啊,这个时候呢,就出现了一个字段啊,叫做right,我在这里呢,插入一个文本框。Re,好,那么接下来呢,我们就给它插入了一个35的值啊,我在这里呢,做一个直线图。啊,比如说这个35的值,那么现在呢,就有一个数据点啊,就有一个数据点啊,于是呢,我们现在又插了一个40。啊,后面后面的我们第二次操作呢,又差了一个40。
03:07
Right等于40啊,那我们现在的数据呢,是不是在这个序列里面就会新增一个数据点啊,可以看到。啊,这是原来的35。啊,再加一个数据点,现在呢是原来的,现在呢是40啊,那么后来呢,我们又去插入了两次数据啊,第三次插入数据的时候呢,我们加了一个字段,哎,叫car逗号,然后标签集呢,还是扣零一,哎,然后这时候呢,Right等于。啊,等于60啊等于44,呃,另外呢,这时候我们加了一个叫做温度TP等于26。啊,等于26,呃,那么接下来呢,我们可以看到,哎这里呢,哎,我们的速度仍然呢,是添加一个数据点。啊,但是这个时候呢,我们又新增了一个序列。啊,就是我们的名为T的这个序列。
04:10
好啊,那么这个时候呢,它同时啊,同时它这里面呢,只有一个值就是26。呃,现在呢,我加上一个圆圈。啊,来把我们的26呢给表示上。好把这个把这个数据点的给他移过来。好啊,这个呢,就当做是我们的26,后来呢,我又执行了一次写入啊,又执行了一次写入,这次写入的数据呢叫car。扣的等于零一。啊,然后呢?Re,等于多少,等于60。哎,这次呢,没有写tmp啊,那么请问我现在在对哪个序列执行写入操作。哎,是不是我现在圈中的这一条。哎,是不是这个car扣的零一,然后rate呢?哎,我这一条行线E啊,这一次写入操作是不是相当于没搭理我们下面这条序列,哎,只对上面这条序列写入了一个新的数据啊,我给圈上这个点儿,哎所以说呢,现在查询的结果就是,哎,我这个序列里面可以看到这个序列里面有四条数据。
05:18
然后呢,啊TP呢,只有一条数据。好,那么这就是对我们刚才写入操作的一个解释啊,接下来呢,再让我们回到查询本身啊,现在呢,我先把平清一下。哎,刚才呢,不知不觉的给大家透露了一个消息,就是我们刚才查询的这些数据里面呢,包含两个序列啊,那么现在呢,我们来看一下这里面的数据。呃,首先呢,我用这个框呢,给大家框一下。现在我们把这个注意力呢,放在前四行,放在前四行。好,那我现在呢,再换个颜色,换个蓝色啊,大家呢,关注我现在圈中的这三列,一个是measurement,诶稍等。
06:03
哎,一个是没说。一个呢是field。一个呢,就是我们的code。我们是不是说measurement,然后还有这个一个字段,再加我们的标签集,可以共同确定一个序列,哎,那么我们现在可以看到前四行呢,是不是measurement都是一样的值,然后字段名称都是一样的值,包括扣的都是一样的值啊,那么我们现在呢,可以说前四行数据呢,其实共属于一个序列。哎,共属于一个序列。哎,那么这个序列的定义呢?啊,就是我们说的measurement为car,哎,然后后面的这个标签集是code等于零一,哎,然后字段呢,为right的序列。
07:00
啊,那么另外就是我们可以看到tmp是不是单独属于另外一个序列啊,就是这个样子,所以说现在呢,我们再关注一下,我们左边有一个字段,我们一直没有介绍叫table。哎,可以看到这个table呢,可以看到啊,我们前四行同属于一个序列,同时呢。哎,同时呢,我们table的编号呢是零。然后我们这个TP呢,它单独属于序列,而且呢,它的table报值呢,跟别的数据呢不一样,它呢是一,所以说我们左边的table呢,它的这个取值啊,其实起到了帮我们区分不同序列的作用。啊,那么现在呢,再给大家解释一下,为什么我们的这个表里面呢?哎,这个字段和值会变成这种摘表格式,哎,是因为我们还是说回到序列的定义上这个概念上来啊,哎,一个序列是由什么呀,是由measurement。
08:02
和什么和标签级,那么标签级呢,是由多个标签的建值队和在再和什么呀,再和一个,哎,再和一个啊注意我这里要强调一个字段名称,哎定义的哎,一个序列是由measurement和标签集再和一个字段名称共同定义的,哎,所以说呢,转成这种摘表呢,可以保证我们每一行里面呢,只有一个关于field的信息啊,那么如果呢,这一行里面只有一个关于field的信息啊,那么我们是不是就可以用这一行数据来表示一个序列里面的数据点呢?啊,一行就是一个数据点。哎,如果是宽表呢,我们可以看一下啊,如果是宽表啊,我这里呢,就要先写两个字段名称,一个呢叫做rate re啊,另一个呢就叫T,然后呢,同样是这一行啊,同样是这一行。
09:02
哎,这一行里面。呃,那么我们现在呢,就需要去写了,写这个数据啊,那么它呢,就是,呃,这个瑞特呢,可能就是哎44,那么我们的温度呢,就可能是26,那么这里呢,就出现一个问题,如果你一行里面包含两个字段的信息,那么我怎么知道你这一行属于哪个序列呢,是不是?哎,所以说呢,这里讲的就是啊,为什么把这个字段呢,搞成一个摘表的格式啊,它其实呢,方便我们用行去表示我们序列里面的数据点。好,那么这些讲完之后呢,我们把平清一下啊,此时呢,要给大家讲三个重要的概念,分别是表表流和我们常用的这个序列啊,那么这三个概念呢,其中啊,我们的序列。
10:01
啊,序列属于in Fla DB给我们带来的一个概念。呃,另外呢,表和表流属于我们的flux语言给我们带来的概念。好啊,那么我们flux的语言里面为什么不延续我们in flax DB里面序列的概念呢?哎,我们说是因为flux语言,它这个语言的野心,哎,我们可以看一下它的官方文档。啊,你可以看到这里面呢,有一个呃,查询数据源啊,除了这个in DB呢,它还支持查询circleq类型的啊circleq的这个关系型的数据库,你点开这个加号,你会发现它支持很多很多的关系型数据库。但是关系型数据库以什么样的方式来管理数据呢?是不是就是表?啊,我们可以随便点开一个,比如说查询买SQL数据源的,呃,这个事例看一下啊,点击。
11:01
啊,可以看到它这里呢,有一个函数叫circleq.from啊,通过这种方式呢,就可以直接去查询买circle。呃,所以我们的flax语言呢,为了抢占市场,哎,他呢就把关系型数据库里面的表给引进来了,哎,但是呢,我们in Fla DB里面又没有表这个概念,我们in Fla DB呢,是使用序列的方式去管理数据,于是呢,为了能让这个关系型数据库里面的表和我们in Fla DB里面的序列的概念呢,哎,能够对应,因此呢,我们在这个查询的时候呢,做了一个折中,哎就是把我们序列里面的信息展示成这种行列的形式。啊,这里呢,可以看我们的文档啊,之前呢,给大家说过。呃,我们的这个inlu DB和这个circle的区别。呃,在这个位置。哎,可以看到在这个关系型数据库里面呢,数据才是这么展示的,而在我们in flab中呢,数据本来是这样存储的,所以说我们查询的时候呢,其是把一个序列的数据当做表的方式去展示。
12:08
但是这个时候呢,就又出现一个矛盾,呃,因为通常来说呢,我们对时序数据库的一个查询,哎,我们通常呢,希望一次性呢,可以查询出来多个序列。比如说上面呢,是一条序列。啊,下面呢,又是一条序列。好啊,那么我们在这个时序数据库里的查询场景呢,通常是哎,查询过去30秒的,这么说,这么多数据啊,所有的数据点,然后呢,我去套一个最大值的函数max函数。然后我就可以对各自序列哎,求出一个当时的最大值来。哎,比如他和他。呃,那么所以说呢,开疆拓土归开疆拓土啊,但是不能忘了他这个in DB的亲爸爸,所以呢,为了能够让表这种数据格式和我们的序列啊,还有包括我们英Fla DB的使用场景能够吻合起来,于是它创建了一个概念叫做表流,那表流啊,那么表流什么意思呢?你可以理解为一个由表形成的数组。
13:15
好,到此为止呢,我们回到我们的web UI。好哎,现在呢,我把这个屏呢,稍微清一下。好,可以说呢,其实可以看到我们现在这一个整个的结果就叫表流。然后呢,这里面其实有多张表,然后每一张表呢,你可以看到这里有一个字段叫做table,哎,TABLE0,它就是一张表。呃,那么这个表流里面的一张表啊,表流里面的一张表,它其实呢,就对应着我们in Fla DB里面的一个序列。哎,所以呢,我们现在看到的这个表流,其实呢,里面有两张表,哎,一个是我们的,哎,这一个代表速度的序列,另外一个呢,是我们代表温度的序列啊可以我再给大家画个圈。
14:10
哎,这呢也是一个序列。好,现在呢,我把这些擦一下。啊,可以看到啊,呃,就我们这个视觉上的一个观感来说呢,好像这个表留它难道不也是一张表吗?呃,这么一说的话,你说的表和表流之间的关系,我好像就可以理解为,哎,子表跟全表之间的关系。所以呢,我全表里面包含几个子表,其实完全取决于我对这些行怎么进行划分。所以我们现在呢,可以看到啊,有一个我们一直没有解释过的东西,就是这个字段名字下面的group,我们可以看到有些字段下面是group,有些字段下面呢则是no group。哎,什么意思呢?就是我们这个全表,哎,我给大家写一个circleq语句,哎,如果是circleq的话啊,其实意思就是我select星from全表。
15:15
Group by,好,按照什么基因呢?我们可以看到有measurement。Summer ment,然后可以看到还有什么呢?还有这个下划线start和下划线stop啊,那么这两个字段呢,每一行的值都一样,我们暂且呢把它忽略,其实这个东西跟我们后面讲的开窗有关系啊,先把忽略啊,再接下来看还有还跟什么有关系,哎,还跟这个field有关系。呃,也就是说它还要根据下划线file的进行开窗啊,进进行分组fiel l,然后还有什么呢?还有就是我们的这个标签,哎,也是扣的,也就是扣的,哎,那么这个全表里面的所有行按照这三个字段进行一个分组的操作,最后得到的两张子表是不是刚好就对应我们in Fla DB里面的两个序列呢?哎,答案就是这个样子。
16:15
呃,根据这个group by字段,能够把我们这个全表分成几张子表,那么这个表流里面就有几个序列,就有几张表。啊,那么这里呢,可以给大家先说一下,就是如果呢,用我们flux语言去查询in Fla DB,呃,那么默认就会按照指标名称,字段名称,还有标签集进行分组,但是呢,如果你用Fla语言查,呃,查询这个关系型数据库,比如my SQ SQL server这种,呃,那么你查询的数据呢,默认是不分组。部分组呢,表流和表的概念就合二为一了啊,就只有一张表了,这个时候呢,就跟使用哎我们的普通的关系型数据库呢差别不大了,呃,那么现在既然知道我们这个序列呢是通过全表哎,Group by出来的,那么我们说这里面的这个子表,我是不是可以通过调整guru by的这个字段来进行修改呢?答案当然是可以,我们可以对这张表流啊,这个表流进行一个重分组的操作,哎,此处呢,先给大家演示一下,有一个函数叫做group,我在这个润置后面呢,去敲一个管道符。
17:28
好,再写一个group函数gup,然后小括号啊,这里面呢,可以传进来一个参数叫做CS,也就是我们的列名,好,这里呢传入一个数组啊,字符串数组指定我们要根据哪一些列进行分组,此时呢,如果我把这个分组的列呢写成下划线value,我们可以看看效果,Va点击submit。啊,注意最左边这一列啊,我点击。
18:00
好哎,可以看到现在的这个时间呢,已经过了现在啊,因为我这个讲的时间有点长啊,为了把前面的数据查出来呢,我需要把这个时间改成负4H,点击submit。可以看到我的这个值有五种可能,因此呢,我整个全表就被分为了哎,五个子表。所以说呢,最后再说,哎,这个表和序列之间的绑定关系呢,其实是可以被我们后后面的操作破坏掉的,哎,所以说from range这个操作得到出来的一个表流默认呢,是按照我们这里面序列定义的字段来进行分组的。啊,最后呢,我先把这个group这个字段呢,Group这个函数给它删掉,哎,再次点击submit,我现在把这些东西呢都给清掉。呃,我们之前说呢,现在这里呢,有两个子表,而且呢对应我们in DB里面的两个序列,而且呢,之前我给大家说啊,我们in Fla DB的一个使用场景呢,就是在序列内部啊,去比较最大值。
19:06
啊,就我目前这个例子来说,我在全局比较最大值呢,其实是没有意义的啊,因为把这个速度和温度比起来呢,哎,完全是没有意义啊,所以说我现在如果调用一个max函数呢,我希望得到每一个序列内部的最大值,这里呢,可以先给大家演示一下,在这个range后面呢,我直接去传递一个,哎,Ma克斯函数。点击提交。哎,可以看到现在原本是两张子表,现在每个子表呢都只留下了一个值,因为max呢是一个聚合函数啊,这个聚合的过程呢,在我们的官方文档上就显示的非常明白啊,比如说可以看到这是三张子表,然后经过聚合呢,每张表原来有三行数据,现在呢,一聚合每张子表呢只剩一行数据,但是整个表流里面呢,还剩三张子表,而且每个子表里面呢只有一条啊,就像说我们现在这个情况,我们现在还有两个子表,但是呢,每个词表里面只剩一条数据了。
20:05
最后要说呢,哎,就是我们的表流在这个flux语言里面呢,并不仅仅是一个逻辑上的概念,哎,他在我们的flux语言里面呢,是有实实在在的类型的。我们现在这个from查询哈,我现在用一个变量A给它接住啊,它是可以传递的。啊,那么把这个查询结果付给变量A呢,我现在让变量A和一个整数类型一去相加,哎,可以看到会报错啊,我们现在直接点击sum,那么这里呢,肯定会报一个类型错误,我们看看呢,待会是什么类型好可以看到呢,我这里提交了。哎,这里面呢,报了一个错,哎,他说什么类型呢,不能和这个int类型相加,这里可以看到,你可以看到这里有个stream,哎,这个stream呢,意思就是我们的表流啊,但是刚才我们讲这个类型的时候,为什么不讲这个stream类型呢?哎,答案是官方文档呢,没有把这个stream算到这个啊复合类型里面去,所以说呢,我们这个课程呢,还是以官方文档呢啊作为一个总的参考,呃,所以说呢,Stream呢,我们就没有没有作为一个复合类型,哎,但是实际上你要知道这个from from这个参数往后开始下面的这个管道符,哎,这个管道符它只能作用于stream类型。
21:23
而且呢,有些函数是可以跟在管道符后面的,有些函数是不能跟在管道符后面的,后面呢,我们会在课程里面给大家说怎么分辨这些函数啊,哪些能够当做管道函数,哪些呢只能当做普通的一个函数,好那么这一节呢,我们给大家介绍了,呃,我们这个Fla语言里面的表表流,以及和in Fla DB里面序列之间的关系,呃,这三个概念呢,大家一定要好好理解。
我来说两句