当前位置: 首页 > news >正文

数据逻辑校验机制

文章目录

  • 概述
    • 度量值是否可加
    • 左联前后数量校验
    • 数值类型校验,是否越界,是否损失精度
    • 每日分区数据量监控
    • 重复值和NULL检测
    • 时间数据校验

概述

数据开发不同于后端开发之处在于:
后端开发可是有测试👧帮忙进行功能测试的噢~
而数据开发工程师却没有😰😂😭

数据逻辑错误不像功能bug那么明显,计算结果错误并不会使程序报错
对此建立数据逻辑校验机制,包括👇

  1. 左联前后数量校验(联表后数据量=左表数据量)
  2. 度量值是否可加
  3. 每日分区数据量统计
  4. 数值类型校验,是否越界,是否损失精度
  5. 重复值和NULL检测
  6. 时间数据类型校验,注意时区

度量值是否可加

  • 统计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,因为STRINGINT后,前面的0会被吃掉

每日分区数据量监控

在HIVE上查询

DESC FORMATTED 表名 PARTITION(分区名="分区值");
返回值说明
CreateTime分区创建时间(transient_lastDdlTimeCreateTime
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;

在这里插入图片描述

时间数据校验

注意时区


相关文章:

  • Linux关于jar包的基本操作
  • 用什么软件可以提高视频批量剪辑的效率
  • 搜索替换 csv 文件中的文本
  • DBCO-PEG-Casein/Ovalbumin/Lectins点击化学DBCO偶联络蛋白/卵清蛋白/凝集素
  • 【JetPack Compose】声明式UI 、组合、重组
  • jquary样式操作、动画
  • Apollo配置语法——Apollo配置List和Map以及组合应用——非常详细
  • ESP8266-Arduino编程实例-MAX30102脉搏和心率监测传感器驱动
  • Connor学Android - Bitmap的加载和缓存策略
  • 最新Unity如何打包发布到Android
  • 34. 箭头函数与普通函数的区别?
  • IDC机房盘活资源省钱实例
  • Apache Shiro入门
  • 攻防世界WEB练习-inget
  • Apache Shiro简单介绍
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 78. Subsets
  • cookie和session
  • Java应用性能调优
  • Map集合、散列表、红黑树介绍
  • Puppeteer:浏览器控制器
  • Python爬虫--- 1.3 BS4库的解析器
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Vue 重置组件到初始状态
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 排序(1):冒泡排序
  • 山寨一个 Promise
  • 实现菜单下拉伸展折叠效果demo
  • 通信类
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • # 飞书APP集成平台-数字化落地
  • $.ajax()参数及用法
  • $.each()与$(selector).each()
  • (03)光刻——半导体电路的绘制
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Oracle)SQL优化技巧(一):分页查询
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET Framework .NET Core与 .NET 的区别
  • .NET Framework杂记
  • .NET导入Excel数据
  • /run/containerd/containerd.sock connect: connection refused
  • @GlobalLock注解作用与原理解析
  • @Pointcut 使用
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [<事务专题>]
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians