概述:
数据开发不同于后端开发之处在于:
后端开发可是有测试👧帮忙进行功能测试的噢~
而数据开发工程师却没有😰😂😭
数据逻辑错误不像功能bug那么明显,计算结果错误并不会使程序报错
对此建立数据逻辑校验机制,包括👇
LEFT JOIN
B表 得到 C表,应满足
C
表行数
=
A
表行数
C表行数=A表行数
C表行数=A表行数SUM
一列INT
类型数据后,如果结果超出INT
范围,就要写到BIGINT
类型的列10元
运费分摊到3
个商品时,金额只保留2位小数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;
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;
当SQL计算均值遇到NULL时,需要和需求人员沟通好逻辑,看要不要把NULL算上
yyyy-MM-dd
,如2022-02-02
yyyy-MM-dd HH:mm:ss
,如2022-02-02 02:22:22