• 查询所有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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    查看单个HIVE表分区的行数

    SELECT COUNT(1) FROMWHERE 分区="分区值";
    
    • 1

    查看单个HIVE表分区的行数和数据占用

    DESC FORMATTED 表 PARTITION(分区="分区值");
    
    • 1

    分区属性说明备注所在MySQL表
    PART_ID分区唯一标识PARTITIONS
    PART_NAME分区名称例如ymd=2022-08-08PARTITIONS
    CREATE_TIME分区创建时间transient_lastDdlTimePARTITIONS
    numFiles文件数PARTITION_PARAMS
    numRows行数LOAD DATE写分区时,该值为0PARTITION_PARAMS
    rawDataSize原始数据大小LOAD DATE写分区时,该值为0PARTITION_PARAMS
    totalSize数据在HDFS的大小(不含副本)PARTITION_PARAMS
    numFilesErasureCoded通常是0PARTITION_PARAMS
    transient_lastDdlTime最近1次DDL时间≥分区创建时间PARTITION_PARAMS
    COLUMN_STATS_ACCURATELOAD 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    table_namepartition_namecreate_timenum_filesnum_rowsraw_data_sizetotal_sizetransient_last_ddl_timecolumn_stats_accurate
    default.t3ymd=2022-08-08/h=82022/8/29 10:44129112022/8/29 10:44{“BASIC_STATS”:“true”}

    补充

    • HIVE的LODA DATA和Sqoop的hive-import写进分区,是冇计算行数的
    • 建议:HIVELODA DATA或Sqoophive-import到中间表,再从中间表SELECT INSERT到ODS层
      两个好处:1、计算行数;2、合并小文件

    车手 - Cyndi Wang

  • 相关阅读:
    k-均值聚类算法 Primary
    [接口自动化] 禅道登录 Python+requests[纯代码]
    分享一下花店制作微信小程序的步骤是什么
    微软微服务构建框架Dapr基础入门教程
    【2023高教社杯】C题 蔬菜类商品的自动定价与补货决策 问题分析、数学模型及python代码实现
    path正则匹配MatcherUtil
    并发容器11
    Matlab遗传算法的部分映射交叉算子(pmx)源码
    redis的基本概念和常见问题的解决!
    固定资产可视化智能管理系统
  • 原文地址:https://blog.csdn.net/Yellow_python/article/details/126501200