数据质量概述及通用脚本

概述

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

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

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

数据质量标准分类

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

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

表格式:

create table table_increment(
    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 '表重复值记录数',
    add_count bigint comment '当日新增数量的记录数'
)

脚本:

#!/bin/bash
# 校验数据的库名
database_name=$1
# 校验数据的表名
table_name=$2
# 需要校验空值的列名,以 ‘,’分割
null_column=$3
# 新增数据所在分区
do_date=$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=`beeline -u jdbc:hive2://node01:10000 -n hdfs -e "select count(*) from $database_name.$table_name where start_date='$do_date'"`
# 取出当日增量数据记录数量
add_count_array=(${add_count_query_result//\|/})
add_count=${add_count_array[3]}

# 执行当日增量空值数量记录数量SQL查询语句
echo "----------检验当日增量空值记录数----------"
total_null_query_result=`beeline -u jdbc:hive2://node01:10000 -n hdfs -e "select count(*) from (select * from $database_name.$table_name where start_date='$do_date')increment $null_where_sql_str"`
# 取出当日增量空值数据记录数量
null_count_array=(${total_null_query_result//\|/})
null_count=${null_count_array[3]}

# 执行当日增量重复值数量记录数量SQL查询语句
echo "----------检验当日增量重复值记录数----------"
table_duplicate_query_result=`beeline -u jdbc:hive2://node01:10000 -n hdfs -e "select sum(tmp.duplicate_count) as duplicate_sum from(select count(*) as duplicate_count from (select * from $database_name.$table_name where start_date='$do_date')increment group by $null_column having count(*)>1) as tmp"`
# 取出当日增量数据记录数量
duplicate_count_array=(${table_duplicate_query_result//\|/})
duplicate_count=${duplicate_count_array[3]}

# 将所有数据校验结果插入到表中
echo "----------开始插入数据----------"
beeline -u jdbc:hive2://node01:10000 -n hdfs -e "insert into datacheck.table_increment values('$do_date','$database_name','$table_name','increment_table',$null_count,$duplicate_count,$add_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
# 日期
do_date=$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 "----------检验当日全量记录数----------"
total_count_query_result=`beeline -u jdbc:hive2://node01:10000 -n hdfs -e "select count(*) from $database_name.$table_name"`
# 取出当日全量数据记录数量
total_count_array=(${total_count_query_result//\|/})
total_count=${total_count_array[3]}

# 执行全表空值数量记录数量SQL查询语句
echo "----------检验全表空值记录数----------"
total_null_query_result=`beeline -u jdbc:hive2://node01:10000 -n hdfs -e "select count(*) from $database_name.$table_name $null_where_sql_str"`
# 取出全量空值数据记录数量
null_count_array=(${total_null_query_result//\|/})
null_count=${null_count_array[3]}

# 执行全表重复值数量记录数量SQL查询语句
echo "----------检验全表重复值记录数----------"
table_duplicate_query_result=`beeline -u jdbc:hive2://node01:10000 -n hdfs -e "select sum(tmp.duplicate_count) as duplicate_sum from(select count(*) as duplicate_count from $database_name.$table_name group by $null_column having count(*)>1) as tmp"`
# 取出当日全量数据记录数量
duplicate_count_array=(${table_duplicate_query_result//\|/})
duplicate_count=${duplicate_count_array[3]}

# 将所有数据校验结果插入到表中
echo "----------开始插入数据----------"
beeline -u jdbc:hive2://node01:10000 -n hdfs -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层数据质量校验

create table dwd_table_data_check(
    data_date string comment '数据时间分区dt',
    source_database_name string comment '数据源库库名',
    source_table_name string comment '数据源表表名',
    source_column string comment '数据源表字段名',
    target_database_name string comment '数据目标库库名',
    target_table_name string comment '数据目标表表名',
    target_column string comment '数据目标表字段名',
    consistent_data_count bigint comment '全表数据一致记录数',
    source_table_count bigint comment '数据源表全表记录数', 
    target_table_count bigint comment '数据目标表全表记录数', 
    target_duplicate_count bigint  comment '数据目标表重复值记录数'
);

数据校验脚本:

#!/bin/bash

# 数据源库名
source_database_name = $1

# 数据目标库名
target_database_name = $2

# 增量数据所在的日期分区
do_data=$3

# 校验数据源表的表名
source_table_name=$4

# 校验数据源表的字段(与目标表顺序一致才能对比两个字段)
source_column=$5

# 校验数据目标表的表名
target_table_name=$6

# 校验数据目标表的字段(与源表顺序一致才能对比两个字段)
target_column=$7

# 初始化SQL查询语句
join_on_sql_str=''

# 将校验数据源表的字段切成列名数组
source_column_array=(${source_column//,/})

# 将校验数据目标表的字段切成列名数组
target_column_array=(${target_column//,/})

# 遍历数组,拼接表关联关系,输入字段全部关联
for(( i=0;i< ${#source_column_array[@]};i++)) do
    if [$i -eq 0];then
        join_on_sql_str = "on $source_table_name.${source_column_array[i]}=$target_table_name.${target_column_array[i]}"
    else
        join_on_sql_str = "$join_on_sql_str and $source_table_name.${source_column_array[i]}=$target_table_name.${target_column_array[i]}"
    fi
done;

echo "----------ods-dwd 一致性检查----------"
# 执行数据源表和目标表的关联查询SQL语句,查询数据一致的条数
consistent_data_query_result=`hive -e "select count(*) from $source_database_name .$source_table_name join $target_database_name .$target_table_name $join_on_sql_str"`

# 取出全表查询数据一致的条数
consistent_data_cpunt=${consistent_data_query_result:3}

echo "----------ods层记录条数----------"
# 执行查询数据源表的记录条数
source_data_query_result=`hive -e "select count(*) from $source_database_name.$source_table_name"`

# 取出全表数据源表的记录条数
source_table_count=${source_data_query_result:3}

echo "----------dwd层记录条数----------"
# 执行查询数据目标表的记录条数
target_data_query_result=`hive -e "select count(*) from $target_database_name.$target_table_name"`

# 取出全表数据目标表的记录条数
target_table_count=${target_data_query_result:3}

# 执行全表重复值的记录数量SQL查询语句
table_duplicate_query_result=`hive -e "select sum(tmp.duplicate_count) as duplicate_sun from (select count(*) as duplicate_count from $target_database_name.$target_table_name group by $target_column having count(*)>1) as tmp"`

# 取出全表重复值数据记录数量
duplicate_count = ${table_duplicate_query_result:3}

# 将所有的数据检验结果插入表中
hive -e "insert into datacheck.dwd_table_data_check values('$do_date','$source_database_name ','$source_table_name','$source_column','$target_database_name','$target_table_name','$target_column','$source_table_count','$target_table_count','$duplicate_count')"

7个参数:

  • 第一个参数是数据源库名
  • 第二个参数是数据目标库名
  • 第三个参数是时间分区参数
  • 第四个参数是需要进行数据校验的源表表名
  • 第五个参数是需要进行数据校验的源表的字段,用’,'分隔
  • 第六个参数是需要进行数据校验的目标表表名
  • 第七个参数是需要进行数据校验的目标表的字段,用’,'分隔
  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Shell脚本数据质量验证是一种通过编写Shell脚本来对数据进行质量检查和验证的方法。数据质量验证是指对数据进行检查、评估和确认,以确保数据的准确性、完整性、一致性和可靠性。 Shell脚本数据质量验证通常涉及以下步骤: 1. 数据清理和预处理:首先,Shell脚本将清洗和预处理数据,去除重复项、缺失数据和异常数据等。 2. 数据格式验证:接下来,Shell脚本会对数据的格式进行验证,比如确保日期、时间、数字等字段的格式符合规定的格式。 3. 数据逻辑验证:Shell脚本还会对数据的逻辑关系进行验证,比如检查数据之间的关联性、一致性和完整性等。 4. 数据完整性验证:Shell脚本会验证数据的完整性,确保数据的所有必需字段都存在且没有缺失。 5. 数据准确性验证:Shell脚本会验证数据的准确性,比对数据与实际情况的一致性,检查数据是否存在错误或异常值。 6. 数据查询和可视化:最后,Shell脚本可以通过调用数据库查询语句或使用数据可视化工具来查询和展示数据质量验证结果,以便用户进行进一步的分析和决策。 通过Shell脚本数据质量验证,可以及时发现数据质量问题,提高数据的可信度和可靠性,从而为后续的数据分析和业务决策提供可靠的数据基础。同时,由于Shell脚本的灵活性和可定制性,可以根据具体业务需求来编写相应的数据质量验证规则和逻辑,满足不同场景下的数据质量验证需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒 暄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值