00:00
上一节我们已经将所有的环境都准备好了啊,那接下来我们就可以开始开发了啊,按照我们之前的分析啊,这个数据质量管理模块呢,一共分为四个子功能模块,分别是检测模块,告警模块,可视化模块以及调度模块。那现在呢,我们先从检测模块开始啊。这个模块的主要功能呢,其实就是检测数据仓库当中与数据质量相关的指标啊,并且将这个结果写到MYSQL数据库当中。啊,没错吧?啊,那按照我们之前的需求分析啊,我们需要分别统计ods层、DM层以及DWD层的相关指标啊,然后大家注意观察啊,那咱们每一层都有多个检测指标啊,而且呢,不同的层里边可能会包含相同的指标,没错吧?啊,举个例子啊,你看DWD层和dim层我们都需要去做空值检查和重复值检查。那所以啊,这里为了代码的复用啊,我们可以先分别去实现每个单一指标的检测功能,那具体的工作呢,就是为每个单一指标来分别编写一个通用的脚本啊,之后呢,在逐个编写每层的检测脚本啊,那当然呢,这个具体的工作就是根据需要调用我们刚才编写的单一指标的脚本啊,那这两部分内容分别对应于2.4的这两节啊第一节单一规则检测脚本,那这里指的就是我们刚刚提到的诶每个指标的检测脚本啊,那下面的数仓各层检测脚本,那当然它指的就是每一层的检测脚本,那每层的检测脚本呢?诶,会调用我们前面所编写的单一规则检测脚本,OK,那接下来呢,我们就来明确一下规则检测模块的具体内容啊,那首先我们需要去编写所谓的单一规则检测脚本,单一规则检测脚本呢,一共有五个啊,那分别是主键空值检测脚本主键重复值检测。
01:58
脚本啊,值域检测脚本啊,数据量环比增长检测脚本以及数据量同比增长检测脚本啊,OK,那我们再来看一下我们数仓各层的检测脚本啊,那数仓各层检测脚本呢,我们一共要写三个啊,那分别是OD层的检测脚本,那DWD层的检测脚本以及dim层的检测脚本啊好,那现在我们先从第一部分内容开始。
02:23
来我们先看第一个脚本啊,就是空ID检测脚本啊,实际上这个脚本的功能比较简单啊,那主要就是检测目标对象的空值个数啊,并且将统计结果呢,写入到my circle啊,Date supervisor数据库当中的no ID这张表中啊啊那现在呢,我们一起来看一下脚本的内容啊,那首先我们在idea当中创建一个no id.SH文件啊来右键,然后new I fail里边呢是no下游线id.SH啊,一个shell脚本啊,创建出来之后呢,我们此呢可以装一个shellscript的一个插件,相当于是啊点击就可以,那这个插件呢,可以提供啊关键字高亮以及语法提示的功能啊好,那完之后呢,我们把这个脚本的内容给它复制过来。
03:12
哎,CTRLC来放到当中。好,那在这儿呢,我需要给大家简单说明一下啊,啊就是本课程呢,主要讲解呃,数据质量管理模块的架构和功能实现的思路啊,这个并不是shell啊,或者是Python语言的技术课啊,那所以说我们相关的语法就不做过多的说明了,好那接下来我们一起看一下脚本的具体内容啊,那首先我们在这儿使用gets这个命令呢,去解析脚本的选项参数啊,那在这呢,我们能够看到啊,这个脚本支持的选项参数有杠T啊,杠D。杠C、杠X,杠X以及杠L啊,那这些选项参数代表的含义分别是什么呢?我给大家简单说一下啊,啊此处杠T代表的是检测对象的表名,杠D呢表示的是统计日期,那杠C呢表示是检测对象的列名啊,杠S呢表示的是统计指标的下限啊,而杠X表示的就是统计指标的上限啊,那杠L呢表示的就是告警级别。
04:17
那并且哎,我们此处呃,会对传入的所有的选项参数进行变历啊,并且呢,哎,分别将每个选项参数的值赋予相应的变量啊,那大家一起看一下啊,那此处呢,我们会将杠T选项的值哎赋予table变量啊,杠D选项的值呢赋予DT变量啊,那杠C选项的值那赋予Co变量啊,杠X的值赋予ma变量啊,那再往下杠X的值呢,会赋予max变量啊那继续往下走,杠L的值呢,会被赋予level变量。好,那这部分内容呢,就是对我们这个脚本的所有的选项参数的一个解析过程,那接下来我们再继续往下看啊,那下边这两行代码呢,实际上是分别对DT变量和level变量进行了非空的判断。
05:10
啊,我们具体看一下,那假如说DT变量为空,那也就是什么呀。也就是我们在调用脚本的时候呢,没有传入杠D参数,没错吧,你不传杠D参数是不是DT变量就没有值,没有值就是空对吧?那如果它为空呢?那此处就会自动计算前一天的日期对吧?Date-D减1DAY,然后呢,使用百分号F给它格式化成年月日的格式啊,然后呢,将结果赋予变量。那也就是说我们实际在调用那个脚本的时候呢,是可以不传杠D参数的,没错吧,因为在通常情况下,我们离线数仓是不是每天计算的就是前一天的指标啊,那所以说呢,在大多数情况下,我们DT变量呢,就使用它的默认值,也就是前一天的日期就可以了啊。好,那接下来我们往下看,那下面呢,是对level这个变量进行了非空的判断,那如果level变量的值为空,也就是我们在调用脚本的时候呢,没有入杠L参数啊,那这时候呢,这个level就会赋予一个默认值零,OK,那此处呢,实际上就相当于是对DT和LEVEL2个变量赋予了两个默认值啊好,那我们再继续往下看啊,那下边呢,明了两个变量,那一个呢是have DB等于J,这个J呢,实际上就是我们的数据仓库当中的库名,那下边还有一个就是have engine啊,此处呢,给它赋予的值是have,那这个have engine也就是一个查询引擎,对吧?它指的是什么的查询引擎呢?
06:38
那实际上呢,就是我们后续去统计空值的时候需要使用的计算引擎,那再往下呢,是几个与买SQL相关的参数啊,那由于啊,我们需要将最终的统计结果写入到MYQL数据库当中,所以在这儿呢,有几个必要的参数必须得配一下啊,好,我们逐个看一下啊,那分别是my user,也就是用户名对吧?在这儿呢,我使用的是root用户啊,那然后呢,是my circlel password,也就是密码啊,那再往下呢,是myl hostd,就是数据库的主机名啊,那再有呢,就是MYDB,这个呢,就是数据库的名称啊,还有一个MYTBL,这个呢,指的就是表名啊,那当然这个数据库就是我们之前创建的date supervisor这个库。
07:23
那这个表名呢,就是我们用来存储空值检测结果的no ID,然后呢,大家需要注意一下啊,就是这些参数啊,大家需要根据自己的实际情况做出相应的修改啊,这块呢重点注意一下诶,主机名,用户名以及密码啊好,那我们再往下看啊,那下边呢是一条curs的认证语句,那在这儿为什么需要认证呢?其实很简单啊,那因为一会儿啊,我们需要使用have哎,执行一条SQL语句去计算统计对象的个数啊,那又因为我们现在的hi度集群呢,启用了科S安全认证。对吧?那所以说在我们查询之前必须得进行认证才可以啊,那当然了,如果是在非安全环境下,也就是说海杜未启用科S认证的环境当中,哎,我们就无需认证了,然后呢,大家再注意观察一下啊,那此处我们认证的用户是谁?是不是就是have啊,因为have用户呢,他拥有数仓当中每一张表的访问权限,对吧?那所以说此处我们认证为haveve用户是没有任何问题的啊啊那接下来我们再往下看啊,那下边呢,其实就比较简单了啊,下边呢,就是使用have engine,也就是我们生明的haveve,对吧,Have-E去执行一条SQ语句,那当然这个SQL语句的核心逻辑就是去计算哎,我们的目标对象的空值个数啊来,我们看一下这个circle怎么写的啊,就比较简单,往后走来。
08:45
大家来看啊,那首先在这儿呢,它select,哎,COUNT1对吧,COUNT1FROM哪张表呢?From have DB里边呢?哎,Table这张表,那这个have DB是谁呀?是不是就是我们刚刚声明的啊,对吧?这就是我们数据库的那个库名,没错吧?那这个table是谁呢?其实table啊,就是我们前面通过杠T这个参数传进来的表明,对吧?那其实这张表啊,就是我们的统计对象,没错吧?啊好,那接下来我们再看一下它的过滤条件啊,这个其实才是核心的逻辑,再往后走,那后边有一个V2DT等于啊,DT变量,那当然这个DT呢,就是我们前边通过杠D参数进来的日期,没错吧?然后看后边and,诶,Column is no,对吧?这个column是谁?
09:30
啊,其实就我们通过杠C传进来的那个列名对不对?那我们来一下这个搜索的核心逻辑啊,其实很简单啊,是不是就是统计啊,Have DB这个数据库下边的table,这张表当中的DT,这个分区当中的column这个列的now值的个数啊,那这个呢,就是核心的统计逻辑,OK,那我们再往前看啊,那除了这个S语句呢,我们这儿是不是还设置了一个参数啊,对吧?这个参数上看一下set have.sell.print等于false对吧?这个参数它的作用啥呀?
10:03
哎,很简单,哎,就是是否打印表头,那如果这个参数设为啊,那我们select出来的结果里边呢,会包含两行,一行是表头,一行呢是统计结果,但在这儿呢,我们并不需要这个表头啊,咱只需要这个统计结果,那所以说在这儿呢,我们将其设为了false,那就说最终的结果里边呢,只有一个数值啊好,那完之后我们来看一下这个数值我们怎么处理的啊,好,那来看啊,这是不是用Dollar小括号将have-E这个shell命令给它括起来了呀?那大家知道这个Dollar小括号的作用是啥吗?啊,其是这个Dollar括号的作用呢,和号的作用是一样的,它会将里边诶这个上要病列的结果赋予前边的变量啊,那也就说我们将统计结果是不是赋予了result这个变量啊好,那我们再来看一下最后一部分内容啊,最后一部分内容的作用啊,其实就是将统计结果写入到MYSQL数据库当中啊来我们看一下它怎么写的啊,在这儿它使用了诶my circlel杠一啊,然后呢去执行了一条insert语句啊,最终呢,将我们的统计结果啊,以及统计对象的表明,统计对象的列名以及统计日期啊,还有统计结果的上下限以及告警级别啊,写入到了MYDB这个库下边的my circle table这张表当中,那当然就是be supervisor里边的no ID OK,那这个脚本的全部内容呢,我们就看完了啊,那最后呢,我再给大家总结一下这个脚本的逻辑啊,那首先啊,这个脚本它是一个通用。
11:34
的检测空值个数的脚本没错吧?啊,它可以根据我们传入的参数去计算数仓当中任意一张表当中的任意一个字段的空制个数,OK,那在我们使用这个脚本的时候呢?诶,我们需要给它传入一个表名啊,再传入一个列名啊,那其实就是我们的统计对象对吧?那这个脚本接入到参数之后呢,会去执行一条have的SQL语句啊,然后呢,去计算统计对象的now值的个数,最后呢,在执行一条MYSQ的SQL语句,将统计结果呢,给它写入到诶咱们MYSQL的数据库当中,OK,那这就是这个脚本的核心逻辑。
12:11
那接下来呢,我们再来看第二一个脚本啊,第二个脚本呢,是重复值检测脚本啊,那这个脚本的主要功能呢,就是计算重复值的个数啊,并且将统计结果写入到MYSQL表当中啊OK,那我们同样把这个脚本呢,先创建出来啊,那这个脚本的名字呢,叫做duty k.SH那现在我们先在idea当中给它创建出来啊,来我们右键,然后new啊fail。CTRLV啊好,我们把这个脚本的内容粘贴过来。来,CTRLC。CTR位,好,那现在我们一起来看一下这个脚本的具体内容啊,那其实这个脚本呢,与我们刚刚讲的no id.SH这个脚本的结构是完全一样的啊好,我们简单看一下啊,那首先呢,我们还是使用get off这个命令呢,去解析我们传入的诶参数对吧?并将每个参数呢赋予与之对应的变量啊,而且这个变量呢,跟刚才也都是一样的啊,在这儿我们就不再一个一个去看了啊好,我们继续往下走啊,那下边呢,仍然是为DT和LEVEL2个变量赋予默认值啊,那DT的默认值呢,仍然是昨天的日期啊,Le的默认值呢,仍然是零。
13:20
好,我们继续往下看啊,那下边呢,哎,同样是声明了两个变量,分别是have DB等于j ma,然后have engine等于have啊,然后再往下,那下边呢,还是与my circlel相关的几个参数啊,那分别是用户名、密码,主机名啊,数据库名以及表名,然后要注意的一点是啊,那这个表名是duplicate对吧?啊好,那接下来我们往下走,那下边呢,仍然是curs的认证语句啊那再往下呢,诶,还是使用have-E去执行一个SQ语句,那只不过呢,这次我们统计的是重复值的个数对吧?啊好,那现在呢,我们来看一下这个重复值统计的逻辑是什么啊来,往后走,我们来看这儿啊,那这儿呢,我们嵌套了一个子查询,对吧?那现在我们先看最内层这个circle啊来,最内层这个circle呢,是这样写的,我来选中看一下啊,那首先是不是select啊,完之后呢,From对吧,From哪张表,From have DB啊里边的table这张表,那have DB呢,就是我们前面声明的j ma,那table呢,就是我们。
14:20
的表名对吧?然后VDT等于Dollar dt,那这个呢,就是我们传进来的日期对吧?然后Dollar column对吧?那这是按谁分组,是不是按照我们传进来的那个列进行分组啊,没错吧,那分完组之后,你看他做了一个什么操作,是不是用having做了一个过滤啊对吧?过滤条件是什么?大家看是不是count Dollar column大于一啊对吧?那这个circle呢,其实不难理解啊,来我们简单看一下啊,那首先在这儿呢,我们按照column这个列进行分组对吧?啊,那他会把什么样的数据分到一组?他是不是会把该列值相同的行分到同一组当中?没错吧,啊,完了之后呢,又对每一组进行了一个count统计,那count统计呢,是不是就是统计一下诶,每一组一共有多少行啊对吧,然后呢,使用having can't大于一这样的一个过滤条件去把什么样的组过滤出来。
15:13
是不是去把那个超过两行的组过滤出来啊,对吧,那超过两行就意味着啥?意味着这一组它是有重复值的。没错吧,啊OK,那前面呢,我们要把这个呃,Column给它选择出来了,那也就是我们这儿选择出来的数据就是重复的值。那当然在这儿呢,我们要统计的不是具体的重复值有谁,而是一共有多少个重复值,对吧?那所以外边呢,我们又来了一层这个查询,对不对,是不是直接select count1from咱们里边这个子查询啊,没错吧,那也是我们这儿得到这个COUNT1的结果,就是重复值的个数啊,OK啊,那我们继续往下进行啊,那外边呢,是不是又使用do小括号去获取了have-E这个shell命令的结果呀,对吧?然后呢,将这个结果赋予了前面的result变量。
16:01
啊,那最后呢,还是使用MY杠一啊,将我们的统计结果写入到目标表当中,那当然咱们现在的目标表呢,就是date supervisor库下边的duplicate表啊OK,那这就是duplicate.sh这个脚本的全部内容啊最后呢,我们再来总结一下这个脚本的逻辑啊,那首先这个脚本呢,它也是一个通用的脚本啊,当然呢,是用来计算重复值个数的一个脚本啊啊OK,那它呢,可以根据我们传入的参数啊,去统计任意一张表当中的任意一个字段的重复值个数啊那当然啊,在我们去使用这个脚本的时候呢,我们需要给它传入一个表名啊,然后呢,再传入一个诶列名啊,那OK,那他拿到我们传的参数之后呢,呃,就会去执行一个函数语句去统计啊目标对象的重复值个数,那之后呢,将统计结果写入到ma serve当中,OK,那这个脚本呢,我们就讲完了,好,我们继续看下一个啊,那下一个呢是值域检测脚本啊,那值域检测脚本呢,它的。
17:01
主要内容就是计算啊,超出规定域的值的个数啊,那并且呢,将结果写入到MYL当中啊,那同样呢,我们还是先把这个脚本创建出来啊,然后再去看一下它的具体内容诶,CTRLC。哎,我们右键。然后新建一个文件啊,CTRLV啊,那现在把脚本的内容粘贴过来。啊,CTRLZ。啊,CTR位,那这个脚本的结构呢,与我们前面讲的两个脚本也是一样的啊,只不过这个脚本呢,它多增加了两个选项参数,那分别是杠A和杠B啊那这个A和B分别指代的是什么呢?那其实呢,A和B指代的就是我们规定值域的上下限啊,这个A指代的就是下限,而B呢指代就是上限,那我们呢,诶会将杠A和杠B这两个选项参数的值,那分别赋予r min和max变量啊OK,那我们继续往下走啊下边的内容跟前面都是一致的,所以在这儿呢就不再赘述了啊啊,那其实这个脚本的核心内容呢,哎,就还是啊在这儿执行的这条have的SQL语句对吧?啊那接下来我们就看一下这个SQL语句,看看它到底是如何去计算超出值域范围的记录的个数了啊,其实很简单,我们往后走来,那这条C语句呢,就是select count1from have DB这个库下边的table这张表,对吧?然后后边的过滤条件。
18:26
现呢是VDT等于Dollar dt啊,And Dollar column not between m and max啊,那这个circle其实也不难理解对吧?首先啊,它使用一个过滤条件啊,那将不在值域范围内的记录给它过滤出来对吧?那当然在这儿呢,我们要的不是具体的每条记录对不对?我们要的是啥?诶,我们要的是这样的记录一共有多少个对吧?那所以最后呢,我们直接select count1对不对?那这个COUNT1统计出来的结果就是超出值域范围的记录的个数啊好,那同样呢,是使用Dollar小括号将这个值取出来赋予result这个变量,对吧?那最后呢,哎,还使用MY杠一将我们统计出来的结果写入到目标的MYDB下面的my table这张表当中啊,那这个table呢,指的是RNG这张表。
19:19
啊,好了,那润点SH这个脚本的全部内容就说完了,那我们继续看下一个脚本啊,那下一个脚本呢,是数据量环比检测脚本啊,那这个脚本的主要功能呢,就是去计算数据量的环比增长值啊,并且呢,将结果写入到买的表当中啊,那现在我们把这个脚本创建出来,脚本名字呢,叫做day on day.sh来右键来新建文件。CTRLV啊,然后把脚本的内容拿过来。来往下。那这个脚本的结构呢,与前面的几个脚本也是一样的啊,所以在这儿呢,我们重点看一下它的核心内容就可以了,那也就是说看一下啊,它到底是如何去计算数据量的每日环比增长的啊,那在这儿呢,我们重点看一下这部分内容就可以了啊,其实它计算呢,分为三步走,首先第一步计算昨日的数据量啊,第二步呢,计算今日的数据量,那第三步呢,哎在使用哎环比增长的公式去计算环比增长的百分比。
20:18
好,那现在我们先看一下第一步啊,看看它是如何去计算昨日的数据量的,其实很简单啊,就是一条have的生数语句,来我们看一下怎么写的啊,Select count1 from啊,Have DB啊,里边的table这张表对吧?然后后边呢,过滤条件是there dt等于date at Dollar dt减一对吧?那现在这个过滤条件是不是就是DT等于前一日的日期啊,对吧?啊,那也就是说呢,哎,我会将前一日的数据过滤出来啊,对吧?然后呢,使用一个COUNT1去统计前一日的数据量没错吧?啊,那下边呢,与之对应的就是计算啊今日数据量的这个circle语句对吧?啊,这个其实也比较简单啊,是不是就是V2 DT等于Dollar dt对吧?那这个过滤条件呢,会把今日的数据过滤出来,那之后呢,使用COUNT1去计算今日的数据量啊,OK啊,那这两条circlel执行完之后呢?呃,同样会使用do小括号啊,将其统计结果取出来对吧?然后分别赋予yesterday和today这两个变。
21:18
啊,那第三步呢?诶,是不是就是利用每日环比增长的计算公式去计算增长的百分比啊,对吧?那这个公式是什么?我们来看一下啊,这个公式很简单啊,怎么做的,来看一下是不是用今日的数据量减去前一日的数据量之后呢,再去除以前一日的数据量,对吧?那这个呢,就是环比增长的计算公式啊,是这样的啊当然了,在这儿我们考虑到了一个异常情况,什么情况啊。啊,就是说昨日的数据量是不是有可能为零啊,对吧?那如果为零在这呢,我们就直接返回一个异常结果,OK,那这就是day day这个脚本的核心内容啊,其余内容呢,我们就不再赘述了啊。那接下来我们看最后一个脚本啊,那最后一个呢,是数据量同比检测脚本啊,那先回忆一下啊,什么是同比检测啊,那在这儿呢,我们做的是每周同比检测,那所谓每周同比检测呢,就是用当天的值与上周与之对应的那一天的值进行比较啊,然后呢,去观察这个数据量的增长情况啊啊,那当然这个脚本主要实现的功能呢,就是去计算我们这所提到的每周的同比增长值啊,那并将最终的结果呢写入到买思购表当中啊啊,那现在我们来看一下这个脚本的具体内容啊,首先把这个脚本创建出来。
22:38
来右键。New fail ctrl v啊,那这个脚本呢,叫做week on week对吧?啊啊,那现在把脚本的内容拿过来。TRLC来CTRLV啊呃,由于这个脚本呢,它的结构与前面所讲的脚本大致也是相同的啊,那所以在这儿呢,我们也是只看核心内容就可以了,也就是看一下它到底是如何去计算数据量的,每周同比增长的啊好,那其实我们重点要看的就是这部分内容啊,那它的计算呢,也是分为三步走啊,首先第一步啊,计算上一周的数据量,那当然这个上周的数据量具体指的是什么啊,具体指的是上周啊,与今日相对应的那一天的数据量,然后第二步计算本周的数据量,当然这个本周的数据量呢,指的就是本周今日的数据量,那最后呢,在使用同比增长的计算公式去计算增长的百分比啊好,那现在我们来看一下这三步具体是怎么做的啊,先看前两步啊,其实前两步呢,说白了还是两条词构语句对吧?好,我们来看一下它是怎么写的啊,首先我们看这个啊。
23:43
呃,来,Select count1 from,还有DB里边的table这张表对吧?那过理条件是啥物条件是不是DT等于data at Dollar dt减七啊,对吧?啊,那Dollar dt是不是就是我们传进来的这个日期,没错吧?减七,减七是不是就是上一周与这一天对应的那一天呀?完了之后呢?诶,我们使用COUNT1去计算一下上周这一天的数据量啊,没错吧?那下边与之对应的呢?哎,就是计算我们本周也就是今日的数据量对吧?怎么计算呢?看一下,首先你看过滤条件啊,过滤条件就是V尔DT等于Dollar dt对吧?那这样一来就把今天的数据量过滤出来了,之后呢,使用COUNT1去计算它的数据量,OK,那两个数据量算出来之后呢?诶,使用Dollar小括号将它的值取出来,对吧?然后呢,分别赋予last week和this week这两个变量啊,那最后呢,再使用这个计算公式去计算增长的百分比,这公式也不难啊,来看一下是不是就用本周的数据量减去上周数据量,然后呢,再去除以上周的数据量啊。
24:44
那这样一来呢,我们得到的就是数据量的每周同比增长的百分比,好,那这就是这个脚本的主要内容,那至此我们所需的五个单一规则检测脚本就全部完成了。
我来说两句