数据质量概述及通用脚本

概述

数据质量表示着数据的健康性。

数据质量的高低代表了该数据满足数据消费者期望的程度,这种程度基于他们对数据的使用预期,也就是数据的准确程度是否达到他们的要求。

而数据质量管理就是负责这个的模块。

数据质量标准分类

  • 数据完整性
    不存在大量或关键字段缺失值,在ETL过程中保证数据完整不丢失。数据总数增长符合正常趋势。
  • 数据一致性
    数仓各层数据应与上一层数据一致,数仓指标与数据源保持一致。
  • 数据唯一性
    每一个事实应当只出现一次。

增量数据质量检验通用脚本(指定分区数据质量检验)

表格式:

create table table_increment(
    data_date string comment '数据时间分区dt',
    database_name string comment '库名',
    table_name string comment '表名',
    table_type string comment '表类型(全量/增量)',
    add_count bigint comment '当日新增数量的记录数',
    null_count bigint comment '表空值记录数',
    duplicate_count bigint  comment '表重复值记录数',
    total_count bigint comment '全表记录数'
)

脚本:

#!/bin/bash
# 校验数据的库名
database_name = $1
# 新增数据所在分区
do_date = $2
# 校验数据的表名
table_name = $3
# 需要校验空值的列名,以 ‘,’分割
null_column = $4

# 初始化SQL查询语句
null_where_sql_str=''
# 将空值校验字段切分为数组
array=(${null_column//,/})
# 遍历数组,拼接空值查询条件
for(( i=0;i< ${#array[@]};i++)) do
    if [$i -eq 0];then
        null_where_sql_str = "where ${array[i]} is null"
    else
        null_where_sql_str = "$null_where_sql_str or ${array[i]} is null"
    fi
done;

# 执行当日增量数据记录数量SQL查询语句
echo "----------检验当日增量记录数----------"
add_count_query_result = `hive -e "select count(*) from $database_name.$table_name where dt='$do_date'"`           
# 取出当日增量数据记录数量
add_count = ${add_count_query_result:3}    

# 执行当日全表数量记录数量SQL查询语句
echo "----------检验当日全量记录数----------"
total_count_query_result = `hive -e "select count(*) from $database_name.$table_name"`
# 取出当日全量数据记录数量
total_count = ${add_count_query_result:3}   

# 执行全表空值数量记录数量SQL查询语句
echo "----------检验全表空值记录数----------"
total_null_query_result = `hive -e "select count(*) from $database_name.$table_name $null_where_sql_str"`
# 取出全量空值数据记录数量
null_count = ${table_null_query_result:3}

# 执行全表重复值数量记录数量SQL查询语句
echo "----------检验全表重复值记录数----------"
table_duplicate_query_result = `hive -e "select sum(tmp.duplicate_count) a duplicate_sum from(select count(*) as duplicate_count from $database_name.$table_name group by $null_column having count(*)>1) as tmp"`
# 取出当日全量数据记录数量
duplicate_count = ${table_duplicate_query_result:3}

# 将所有数据校验结果插入到表中
echo "----------开始插入数据----------"
hive -e "insert into datacheck.table_increment values('$do_date','$database_name','$table_name','increment_table',$add_count,$null_count,$duplicate_count,$total_count)"

四个参数:

  • 第一个参数是数据库名
  • 第二个参数是分区名
  • 第三个参数是表名
  • 第四个参数是字段名,字段名以逗号分隔

全量数据质量检验通用脚本

表格式:

create table table_total_quantity(
    data_date string comment '数据时间分区dt',
    database_name string comment '库名',
    table_name string comment '表名',
    table_type string comment '表类型(全量/增量)',
    null_count bigint comment '表空值记录数',
    duplicate_count bigint  comment '表重复值记录数',
    total_count bigint comment '全表记录数'
)

脚本:

#!/bin/bash
# 校验数据的库名
database_name = $1
# 校验数据的表名
table_name = $2
# 需要校验空值的列名,以 ‘,’分割
null_column = $3

# 初始化SQL查询语句
null_where_sql_str=''
# 将空值校验字段切分为数组
array=(${null_column//,/})
# 遍历数组,拼接空值查询条件
for(( i=0;i< ${#array[@]};i++)) do
    if [$i -eq 0];then
        null_where_sql_str = "where ${array[i]} is null"
    else
        null_where_sql_str = "$null_where_sql_str or ${array[i]} is null"
    fi
done;

# 执行当日全表数量记录数量SQL查询语句
echo "----------检验当日全量记录数----------"
total_count_query_result = `hive -e "select count(*) from $database_name.$table_name"`
# 取出当日全量数据记录数量
total_count = ${add_count_query_result:3}   

# 执行全表空值数量记录数量SQL查询语句
echo "----------检验全表空值记录数----------"
total_null_query_result = `hive -e "select count(*) from $database_name.$table_name $null_where_sql_str"`
# 取出全量空值数据记录数量
null_count = ${table_null_query_result:3}

# 执行全表重复值数量记录数量SQL查询语句
echo "----------检验全表重复值记录数----------"
table_duplicate_query_result = `hive -e "select sum(tmp.duplicate_count) a duplicate_sum from(select count(*) as duplicate_count from $database_name.$table_name group by $null_column having count(*)>1) as tmp"`
# 取出当日全量数据记录数量
duplicate_count = ${table_duplicate_query_result:3}

# 将所有数据校验结果插入到表中
echo "----------开始插入数据----------"
hive -e "insert into datacheck.table_total_quantity values('$do_date','$database_name','$table_name','increment_table',$null_count,$duplicate_count,$total_count)"

四个参数:

  • 第一个参数是数据库名
  • 第二个参数是表名
  • 第三个参数是字段名,字段名以逗号分隔

ODS层数据质量校验

首先把ODS层中的表分为需要增量检查的表与需要全量检查的表,然后调用相应的脚本。

增量检查

  • 订单详情表(ods_order_detail)
  • 用户表(ods_user_info)
  • 支付流水表(ods_payment_info)
  • 。。。

全量检查

  • 订单表(ods_order_info)
  • SKU商品表(ods_sku_info)
  • 商品一级分类表(ods_base_category1)
  • 商品二级分类表(ods_base_category2)
  • 商品三级分类表(ods_base_category3)
  • 。。。

这样的话,我们可以写一个shell脚本,将质量检测脚本调用每个表的语句都写进去。

#!/bin/bash
# 增量检测

# 分区
data_date = $1


/usr/hdk/table_increment.sh mall $data_date ods_order_detail id,order_id,user_id,sku_id,sku_name,order_price,sku_num,create_time

/usr/hdk/table_increment.sh mall $data_date ods_user_info id,name,birthday,gender,email,user_level,create_time,operate_time

/usr/hdk/table_increment.sh mall $data_date ods_payment_info id,out_trado_no,order_id,user_id,alipay_trado_no,total-amount,subject,payment_type,payment_time

# 全量检测
/usr/hdk/table_total_quantity.sh mall ods_order_info  ..,..

...

然后就不用一个一个敲了,直接跑脚本就行。

DWD层数据质量校验

你可能感兴趣的:(---数据质量,数据质量)