统计HIVE字段行数NULL行数字段重复行数

Posted 小基基o_O

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了统计HIVE字段行数NULL行数字段重复行数相关的知识,希望对你有一定的参考价值。

文章目录

场景

mysql数据导入HIVE数据仓库ODS层后,统计主键行数、主键NULL行数、主键重复行数

统计HIVE表主键行数、主键NULL行数、主键重复行数的SQL

-- 统计HIVE表源MySQL主键行数、主键NULL行数、主键重复行数
WITH
w AS (
    SELECT
        `id`
        ,ROW_NUMBER()OVER(PARTITION BY `id` ORDER BY `id`)r
    FROM `hive_tb`
    WHERE ymd="ymd"
)
SELECT
    COUNT(1)                                       -- 行数
    ,COUNT(if(`id` IS NOT NULL AND `r`==1,1,NULL)) -- 非空主键去重后行数
    ,COUNT(if(`id` IS NULL,1,NULL))                -- 主键NULL行数
    ,COUNT(if(`id` IS NOT NULL AND `r`>1,1,NULL))  -- 主键重复行数
FROM w;

测试

-- 建表测试
DROP TABLE IF EXISTS `temp_test`;
CREATE TABLE `temp_test`(
    `id`      STRING  COMMENT '主键'
) COMMENT '测试'
PARTITIONED BY (`ymd` STRING);
-- 插入数据
INSERT OVERWRITE TABLE `temp_test` PARTITION(ymd="2022-04-17")
VALUES ("1"),("2"),("3"),(NULL),("3"),("3"),(NULL),("4");
-- 查询数据
SELECT * FROM `temp_test`;
-- 统计HIVE表源MySQL主键行数、主键NULL行数、主键重复行数
WITH
w AS (
    SELECT
        `id`
        ,ROW_NUMBER()OVER(PARTITION BY `id` ORDER BY `id`)r
    FROM `temp_test`
    WHERE ymd="2022-04-17"
)
SELECT
    COUNT(1)                                       -- 行数
    ,COUNT(if(`id` IS NULL,1,NULL))                -- 主键NULL行数
    ,COUNT(if(`id` IS NOT NULL AND `r`>1,1,NULL))  -- 主键重复行数
    ,COUNT(if(`id` IS NOT NULL AND `r`==1,1,NULL)) -- 非空主键去重后行数
FROM w;

样本

+---------------+----------------+
| temp_test.id  | temp_test.ymd  |
+---------------+----------------+
| 1             | 2022-04-17     |
| 2             | 2022-04-17     |
| 3             | 2022-04-17     |
| NULL          | 2022-04-17     |
| 3             | 2022-04-17     |
| 3             | 2022-04-17     |
| NULL          | 2022-04-17     |
| 4             | 2022-04-17     |
+---------------+----------------+

样本计算结果

+------+------+------+------+
| _c0  | _c1  | _c2  | _c3  |
+------+------+------+------+
| 8    | 2    | 2    | 4    |
+------+------+------+------+

Appendix

统计HIVE主键的行数、NULL行数、重复行数,可用于数据同步校验
可用MySQL存储每天校验结果,DDL 如下:

CREATE TABLE checkout_synchronism(
 -- 基础信息
 source_host VARCHAR(255) NOT NULL COMMENT '源地址',
 source_type VARCHAR(255) NOT NULL COMMENT '源类型',
 source_database_name VARCHAR(255) NOT NULL COMMENT '源库名',
 source_table_name VARCHAR(255) NOT NULL COMMENT '源表名',
 source_primary_key VARCHAR(255) NOT NULL COMMENT '主键',
 source_increment_tag VARCHAR(255) NOT NULL COMMENT '源表增量标识',
 target_database VARCHAR(255) NOT NULL COMMENT '目标库',
 target_table VARCHAR(255) NOT NULL COMMENT '目标表',
 target_partition VARCHAR(255) NOT NULL COMMENT '分区键',
 target_partition_value VARCHAR(255) NOT NULL COMMENT '分区值',
 -- 度量值
 source_rows BIGINT NOT NULL COMMENT '源表行数',
 target_rows BIGINT NOT NULL COMMENT '目标表行数',
 target_distinct_pk_rows BIGINT NOT NULL COMMENT '目标表非空主键去重后行数',
 target_pk_null_rows INT NOT NULL COMMENT '目标表主键null',
 target_pk_repetition INT NOT NULL COMMENT '目标表主键重复',
 update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
 -- 主键
 primary key (target_database,target_table)
)COMMENT='数据同步校验';

以上是关于统计HIVE字段行数NULL行数字段重复行数的主要内容,如果未能解决你的问题,请参考以下文章

sql中 count(*) 和 count(1)什么区别?

hive mysql count distinct 多列

python统计c++源程序文件中不重复代码行数

Hbase快速统计行数

sql统计行数,但是需要去重中间的重复数据

优化 Python 中的文件和数字行数