数据逻辑校验机制
Posted 小基基o_O
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据逻辑校验机制相关的知识,希望对你有一定的参考价值。
文章目录
概述
数据开发不同于后端开发之处在于:
后端开发可是有测试👧帮忙进行功能测试的噢~
而数据开发工程师却没有😰😂😭
数据逻辑错误不像功能bug那么明显,计算结果错误并不会使程序报错
对此建立数据逻辑校验机制,包括👇
- 左联前后数量校验(联表后数据量=左表数据量)
- 度量值是否可加
- 每日分区数据量统计
- 数值类型校验,是否越界,是否损失精度
- 重复值和NULL检测
- 时间数据类型校验,注意时区
度量值是否可加
- 统计UV时,当天总UV 不能通过 当天各页面UV求和 得到,7日总UV 不能通过 7日的UV求和 得到
- 统计库存时,昨天库存 不能和 前天库存 相加,佛山库存 可与 广州库存 相加
- 统计增长率时,省的增长率 不能通过 市的增长率直接求和或求平均 得到
左联前后数量校验
A表 LEFT JOIN
B表 得到 C表,C表行数应与A表行数相等;
如果
C
表行数
>
A
表行数
C表行数>A表行数
C表行数>A表行数,就说明发生笛卡儿积
数值类型校验,是否越界,是否损失精度
- 在
SUM
一列INT
类型数据后,如果结果超出INT
范围,就要写到BIGINT
类型的列 - 金额折扣后,
3.125
四舍五入保留两位小数 后变成3.13
,精度损失 STRING
列和INT
列匹配时,要把INT
转为STRING
,因为STRING
转INT
后,前面的0会被吃掉
每日分区数据量监控
在HIVE上查询
DESC FORMATTED 表名 PARTITION(分区名="分区值");
返回值 | 说明 |
---|---|
CreateTime | 分区创建时间(transient_lastDdlTime ≥CreateTime ) |
last_modified_by | 最近1次被谁编辑 |
last_modified_time | 最近1次编辑时间 |
numFiles | 分区内文件数 |
numRows | 分区的行数 |
rawDataSize | 分区的原始数据大小(本人理解是:数据在内存中的大小) |
totalSize | 数据占据硬盘的大小 |
transient_lastDdlTime |
在元数据库(mysql)上查询
SELECT
table_name
,PART_NAME AS partition_name
,create_time
,num_files
,num_rows
,raw_data_size
,total_size
-- ,num_files_erasure_coded
,transient_last_ddl_time
,column_stats_accurate
FROM ( -- 昨天分区
SELECT PART_NAME,PART_ID,TBL_ID,FROM_UNIXTIME(CREATE_TIME,"%Y-%m-%d %h:%i:%s") AS create_time FROM PARTITIONS
-- 按分区键值对筛选
WHERE PART_NAME=CONCAT("ymd=",DATE_FORMAT(DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY),"%Y-%m-%d"))
)t1
INNER JOIN ( -- 库名.表名(筛选外部表)
SELECT CONCAT(DBS.NAME,TBLS.TBL_NAME) AS table_name,TBL_ID
FROM DBS INNER JOIN TBLS ON DBS.DB_ID=TBLS.DB_ID
WHERE TBLS.TBL_TYPE="EXTERNAL_TABLE"
-- OR TBLS.TBL_TYPE="MANAGED_TABLE"
)t0 ON t1.TBL_ID=t0.TBL_ID
INNER JOIN (
SELECT
PART_ID
,MAX(IF(PARAM_KEY="numFiles",PARAM_VALUE+0,NULL)) AS num_files
,MAX(IF(PARAM_KEY="numRows",PARAM_VALUE+0,NULL)) AS num_rows
,MAX(IF(PARAM_KEY="rawDataSize",PARAM_VALUE+0,NULL)) AS raw_data_size
,MAX(IF(PARAM_KEY="totalSize",PARAM_VALUE+0,NULL)) AS total_size
,MAX(IF(PARAM_KEY="numFilesErasureCoded",PARAM_VALUE+0,NULL)) AS num_files_erasure_coded
,MAX(IF(PARAM_KEY="transient_lastDdlTime",FROM_UNIXTIME(PARAM_VALUE,"%Y-%m-%d %h:%i:%s"),NULL)) AS transient_last_ddl_time
,MAX(IF(PARAM_KEY="COLUMN_STATS_ACCURATE",PARAM_VALUE,NULL)) AS column_stats_accurate
FROM PARTITION_PARAMS
GROUP BY PART_ID
-- HAVING column_stats_accurate IS NOT NULL
)t2 ON t1.PART_ID=t2.PART_ID;
重复值和NULL检测
HIVE没有主键,但是 HIVE表某些列在业务上是 唯一且非空的
例如:消费者表的唯一标识是用户ID,用户ID不允许重复,用户ID不允许有NULL
WITH
t AS (
SELECT 1 AS user_id UNION ALL
SELECT 2 AS user_id UNION ALL
SELECT 2 AS user_id UNION ALL
SELECT NULL AS user_id
),
w AS (SELECT user_id,ROW_NUMBER()OVER(PARTITION BY user_id) AS r FROM t)
SELECT
COUNT(1) AS total_rows -- 总行数
,COUNT(if(user_id IS NOT NULL AND r==1,1,NULL)) AS distinct_rows -- 非空去重的唯一标识列的行数
,COUNT(if(user_id IS NOT NULL AND r>1,1,NULL)) AS null_rows -- 重复数
,COUNT(if(user_id IS NULL,1,NULL)) AS repetition -- NULL行数
FROM w;
时间数据校验
注意时区
以上是关于数据逻辑校验机制的主要内容,如果未能解决你的问题,请参考以下文章