zoukankan      html  css  js  c++  java
  • 分析Hive表和分区的统计信息(Statistics)

    类似于Oracle的分析表,Hive中也提供了分析表和分区的功能,通过自动和手动分析Hive表,将Hive表的一些统计信息存储到元数据中。

    表和分区的统计信息主要包括:行数、文件数、原始数据大小、所占存储大小、最后一次操作时间等;

     新表的统计信息

    对于一个新创建的表,默认情况下,如果通过INSERT OVERWRITE的方式插入数据,那么Hive会自动将该表或分区的统计信息更新到元数据。

    有一个参数来控制是否自动统计,hive.stats.autogather,默认为true.

    举例来说:

    先创建表lxw1234:

    1. CREATE TABLE lxw1234 (  
    2. id STRING,  
    3. name STRING  
    4. ) stored AS textfile;  
    CREATE TABLE lxw1234 (
    id STRING,
    name STRING
    ) stored AS textfile;

    在元数据表TABLE_PARAMS中,会有一条记录,记录了该表上次DDL的时间,

    该表中的TBL_ID对应TBLS表中的TBL_ID.

    关于Hive元数据结构的详细介绍,可参考前一章:

    [一起学Hive]之十四-Hive的元数据表结构详解

    SELECT  *  FROM  TABLE_PARAMS  WHERE  tbl_id = 45857

    TBL_ID PARAM_KEY PARAM_VALUE
    45857 transient_lastDdlTime 1436916981

    接下来通过INSERT OVERWRITE向表lxw1234中插入数据:

    INSERT overwrite TABLE lxw1234 SELECT pt,pcid FROM lxw1;

    其实在hive-cli中执行HQL之后,会打印出统计信息:

    Table default.lxw1234 stats:

    [numFiles=1, numRows=11067, totalSize=376278, rawDataSize=365211]

    再查看元数据:

    SELECT  *  FROM  TABLE_PARAMS  WHERE  tbl_id = 45857

    TBL_ID PARAM_KEY PARAM_VALUE
    45857 transient_lastDdlTime 1436917459
    45857 numFiles 1
    45857 numRows 11067
    45857 rawDataSize 365211
    45857 totalSize 376278
    45857 COLUMN_STATS_ACCURATE true
           

    这里的rawDataSize是指原始数据的大小,totalSize是指占用HDFS存储空间大小。

    如果再次使用INSERT OVERWRITE方式覆盖该表数据,那么统计信息将会更新。

     新分区的统计信息

    对于INSERT OVERWRITE方式新增的分区,统计信息同新创建的表,只不过在元数据中存放的表不一样。

    1. CREATE TABLE lxw1234 (  
    2. id STRING,  
    3. name STRING  
    4. ) PARTITIONED BY (day STRING);  
    CREATE TABLE lxw1234 (
    id STRING,
    name STRING
    ) PARTITIONED BY (day STRING);

    创建之后,在分区的元数据中还没有任何该表的信息:

    SELECT * FROM `PARTITIONS` WHERE tbl_id = 45858

    插入数据到一个新的分区:

    INSERT overwrite TABLE lxw1234 PARTITION (day = ‘2015-07-15′)

    SELECT pt,pcid

    FROM lxw1;

    执行打印出的统计信息:

    Loading data to table default.lxw1234 partition (day=2015-07-15)

    Partition default.lxw1234{day=2015-07-15} stats:

    [numFiles=1, numRows=11067, totalSize=376278, rawDataSize=365211]

    再查看元数据:

    SELECT * FROM `PARTITIONS` WHERE tbl_id = 45858

    PART_ID CREATE_TIME LAST_ACCESS_TIME PART_NAME SD_ID TBL_ID
    56806 1436918167 0 day=2015-07-15 98259 45858

    SELECT * FROM PARTITION_PARAMS WHERE PART_ID = 56806

    PART_ID PARAM_KEY PARAM_VALUE
    56806 transient_lastDdlTime 1436918167
    56806 numFiles 1
    56806 numRows 11067
    56806 rawDataSize 365211
    56806 totalSize 376278
    56806 COLUMN_STATS_ACCURATE true
           

    与分区统计信息相关的元数据表为

    PARTITIONS、PARTITION_PARAMS

     已存在表或分区的统计信息

    对于一个已经存在的表、分区或者外部表,则需要通过ANALYZE命令去手动分析表或分区的统计信息。

    • 外部表
    1. CREATE EXTERNAL TABLE lxw1234 (  
    2. id STRING,  
    3. name STRING  
    4. ) stored AS textfile  
    5. location 'hdfs://namenode/tmp/lxw1234.com/';  
    6.    
        CREATE EXTERNAL TABLE lxw1234 (
        id STRING,
        name STRING
        ) stored AS textfile
        location 'hdfs://namenode/tmp/lxw1234.com/';
         

    创建之后该表的元数据:

    SELECT * FROM TABLE_PARAMS WHERE tbl_id = 45859

    TBL_ID PARAM_KEY PARAM_VALUE
    45859 transient_lastDdlTime 1436918758
    45859 numFiles 0
    45859 numRows -1
    45859 rawDataSize -1
    45859 totalSize 0
    45859 COLUMN_STATS_ACCURATE false
    45859 EXTERNAL true
           

    使用命令分析表lxw1234的统计信息:

    ANALYZE TABLE lxw1234 COMPUTE STATISTICS;

    该命令也会启动MapReduce去执行,执行之后打印:

    Table default.lxw1234 stats:

    [numFiles=0, numRows=11067, totalSize=0, rawDataSize=365211]

    查看元数据:

    SELECT * FROM TABLE_PARAMS WHERE tbl_id = 45859

    TBL_ID PARAM_KEY PARAM_VALUE
    45859 transient_lastDdlTime 1436918995
    45859 numFiles 0
    45859 numRows 11067
    45859 rawDataSize 365211
    45859 totalSize 0
    45859 COLUMN_STATS_ACCURATE true
    45859 EXTERNAL true
           

    对于外部表,并没有统计文件数和总大小,估计是统计了该表默认路径下的文件数和大小了。(外部表在创建的时候,同时也会在默认路径下创建一个空目录,比如:hdfs://namenode/user/hive/warehouse/default.db/lxw1234)

    • 分区

    如果通过ALTER TABLE ADD PARTITION的方式增加一个分区,道理上其实和外部表没什么区别;

    1. CREATE TABLE lxw1234 (  
    2. id STRING,  
    3. name STRING  
    4. ) PARTITIONED BY (day STRING);  
    5.    
    6.    
    7. ALTER TABLE lxw1234 ADD PARTITION (day = '2015-07-15')  
    8. location 'hdfs://namenode/tmp/lxw1234.com/';  
    CREATE TABLE lxw1234 (
    id STRING,
    name STRING
    ) PARTITIONED BY (day STRING);
     
     
    ALTER TABLE lxw1234 ADD PARTITION (day = '2015-07-15')
    location 'hdfs://namenode/tmp/lxw1234.com/';

    查看元数据:

    SELECT * FROM PARTITION_PARAMS WHERE PART_ID = 56807

    PART_ID PARAM_KEY PARAM_VALUE
    56807 transient_lastDdlTime 1436919355
    56807 numFiles 20
    56807 numRows -1
    56807 rawDataSize -1
    56807 totalSize 376278
    56807 COLUMN_STATS_ACCURATE false
           

    很欣慰,通过这种方式增加分区时候,Hive已经将分区所对应的路径中的文件数和总大小统计到元数据中。

    再使用命令分析该分区:

    ANALYZE TABLE lxw1234 PARTITION (day = ‘2015-07-15′)

    COMPUTE STATISTICS;

    Partition default.lxw1234{day=2015-07-15} stats:

    [numFiles=20, numRows=11067, totalSize=376278, rawDataSize=365211]

    再查看元数据:

    SELECT * FROM PARTITION_PARAMS WHERE PART_ID = 56807

    PART_ID PARAM_KEY PARAM_VALUE
    56807 transient_lastDdlTime 1436919604
    56807 numFiles 20
    56807 numRows 11067
    56807 rawDataSize 365211
    56807 totalSize 376278
    56807 COLUMN_STATS_ACCURATE true

    没问题了,已经将行数和原始大小统计进来。

  • 相关阅读:
    抓取csdn上的各类别的文章 (制作csdn app 二)
    Android 使用Fragment,ViewPagerIndicator 制作csdn app主要框架
    MongoDB基本使用
    MongoDB之DBref(关联插入,查询,删除) 实例深入
    nginx 1.4.7 发送日志到rsyslog
    nginx 编译参数
    nginx 编译参数
    rsyslog 传输日志
    rsyslog 传输日志
    rsyslog 直接读取日志,当日志截断后,不会继续发送
  • 原文地址:https://www.cnblogs.com/yhl-yh/p/7145231.html
Copyright © 2011-2022 走看看