查询所有HIVE表分区数据量
Posted 小基基o_O
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查询所有HIVE表分区数据量相关的知识,希望对你有一定的参考价值。
文章目录
概述
- 查询HIVE表分区的数据占用和行数,用于数据治理
- 通常,每天一个分区;
通常,今天查看昨天分区数据量
本文日期分区字段为ymd
创建分区表
-- 创建多级分区表
DROP TABLE IF EXISTS t3;
CREATE TABLE t3 (f1 STRING,f2 INT)
PARTITIONED BY (ymd STRING COMMENT '年月日',h INT COMMENT '时');
-- 插入数据
INSERT INTO TABLE t3 PARTITION(ymd='2022-08-08',h=8)
VALUES ('ef',9),('hh',13);
查看单个HIVE表分区的行数
SELECT COUNT(1) FROM 表 WHERE 分区="分区值";
查看单个HIVE表分区的行数和数据占用
DESC FORMATTED 表 PARTITION(分区="分区值");
分区属性 | 说明 | 备注 | 所在mysql表 |
---|---|---|---|
PART_ID | 分区唯一标识 | PARTITIONS | |
PART_NAME | 分区名称 | 例如ymd=2022-08-08 | PARTITIONS |
CREATE_TIME | 分区创建时间 | ≤transient_lastDdlTime | PARTITIONS |
numFiles | 文件数 | PARTITION_PARAMS | |
numRows | 行数 | LOAD DATE 写分区时,该值为0 | PARTITION_PARAMS |
rawDataSize | 原始数据大小 | LOAD DATE 写分区时,该值为0 | PARTITION_PARAMS |
totalSize | 数据在HDFS的大小(不含副本) | PARTITION_PARAMS | |
numFilesErasureCoded | 通常是0 | PARTITION_PARAMS | |
transient_lastDdlTime | 最近1次DDL时间 | ≥分区创建时间 | PARTITION_PARAMS |
COLUMN_STATS_ACCURATE | LOAD DATE 写分区,该值为NULL INSERT 写分区,该值为"BASIC_STATS":"true" | PARTITION_PARAMS |
批量查询HIVE表分区的行数和数据占用
HIVE元数据存储在MySQL,模型如下:
E-R图
批量查询HIVE表分区的行数和数据占用的SQL
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;
table_name | partition_name | create_time | num_files | num_rows | raw_data_size | total_size | transient_last_ddl_time | column_stats_accurate |
---|---|---|---|---|---|---|---|---|
default.t3 | ymd=2022-08-08/h=8 | 2022/8/29 10:44 | 1 | 2 | 9 | 11 | 2022/8/29 10:44 | “BASIC_STATS”:“true” |
补充
- HIVE的
LODA DATA
和Sqoop的hive-import
写进分区,是冇计算行数的 - 建议:HIVE
LODA DATA
或Sqoophive-import
到中间表,再从中间表SELECT INSERT
到ODS层
两个好处:1、计算行数;2、合并小文件
车手 - Cyndi Wang
以上是关于查询所有HIVE表分区数据量的主要内容,如果未能解决你的问题,请参考以下文章