zoukankan      html  css  js  c++  java
  • Hive基础(11):元数据(二)分析Hive表和分区的统计信息(Statistics)

    http://lxw1234.com/archives/2015/07/413.htm

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

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

    1 新表的统计信息

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

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

    举例来说:

    先创建表lxw1234:

    CREATE TABLE lxw1234 (
    id STRING,
    name STRING
    ) stored AS textfile;
     

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

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

    关于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方式覆盖该表数据,那么统计信息将会更新。

    2 新分区的统计信息

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

    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

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

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

    • 外部表
    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/';
    9.  

    查看元数据:

    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

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

    本文来自博客园,作者:秋华,转载请注明原文链接:https://www.cnblogs.com/qiu-hua/p/14086030.html

  • 相关阅读:
    sfs2x 连接 mongodb
    java websocket
    webstorm 4.0 注册码
    解决 sfs2 admin tool 找不到扩展
    window 注册表五大类
    opengl 学习第二日
    java google Protobuf
    扩展 java sencha touch PhonegapPlugin
    sencha touch2 kryonet socket phonegap 通信 作者:围城
    sencha touch2 layout 笔记
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/14086030.html
Copyright © 2011-2022 走看看