您的位置:首页 > 其它

分析Hive表和分区的统计信息(Statistics)

2017-09-01 16:02 302 查看
关键字:Hive统计信息、分析Hive表、Hive Statistics
类似于Oracle的分析表,Hive中也提供了分析表和分区的功能,通过自动和手动分析Hive表,将Hive表的一些统计信息存储到元数据中。
表和分区的统计信息主要包括:行数、文件数、原始数据大小、所占存储大小、最后一次操作时间等;


14.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]之十四-Hive的元数据表结构详解
SELECT  *  FROM  TABLE_PARAMS  WHERE  tbl_id = 45857
 
TBL_IDPARAM_KEYPARAM_VALUE
45857transient_lastDdlTime1436916981
 
接下来通过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_IDPARAM_KEYPARAM_VALUE
45857transient_lastDdlTime1436917459
45857numFiles1
45857numRows11067
45857rawDataSize365211
45857totalSize376278
45857COLUMN_STATS_ACCURATEtrue
    
 
这里的rawDataSize是指原始数据的大小,totalSize是指占用HDFS存储空间大小。
如果再次使用INSERT OVERWRITE方式覆盖该表数据,那么统计信息将会更新。
 


14.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_IDCREATE_TIMELAST_ACCESS_TIMEPART_NAMESD_IDTBL_ID
5680614369181670day=2015-07-159825945858
 
SELECT * FROM PARTITION_PARAMS WHERE PART_ID = 56806
PART_IDPARAM_KEYPARAM_VALUE
56806transient_lastDdlTime1436918167
56806numFiles1
56806numRows11067
56806rawDataSize365211
56806totalSize376278
56806COLUMN_STATS_ACCURATEtrue
    
 
与分区统计信息相关的元数据表为
PARTITIONS、PARTITION_PARAMS
 


14.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_IDPARAM_KEYPARAM_VALUE
45859transient_lastDdlTime1436918758
45859numFiles0
45859numRows-1
45859rawDataSize-1
45859totalSize0
45859COLUMN_STATS_ACCURATEfalse
45859EXTERNALtrue
    
 
使用命令分析表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_IDPARAM_KEYPARAM_VALUE
45859transient_lastDdlTime1436918995
45859numFiles0
45859numRows11067
45859rawDataSize365211
45859totalSize0
45859COLUMN_STATS_ACCURATEtrue
45859EXTERNALtrue
    
 
对于外部表,并没有统计文件数和总大小,估计是统计了该表默认路径下的文件数和大小了。(外部表在创建的时候,同时也会在默认路径下创建一个空目录,比如:hdfs://namenode/user/hive/warehouse/default.db/lxw1234)
 
分区
如果通过ALTER TABLE ADD PARTITION的方式增加一个分区,道理上其实和外部表没什么区别;
 
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_IDPARAM_KEYPARAM_VALUE
56807transient_lastDdlTime1436919355
56807numFiles20
56807numRows-1
56807rawDataSize-1
56807totalSize376278
56807COLUMN_STATS_ACCURATEfalse
    
 
很欣慰,通过这种方式增加分区时候,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_IDPARAM_KEYPARAM_VALUE
56807transient_lastDdlTime1436919604
56807numFiles20
56807numRows11067
56807rawDataSize365211
56807totalSize376278
56807COLUMN_STATS_ACCURATEtrue
 
没问题了,已经将行数和原始大小统计进来。
 

Hive相关文章(持续更新)

一起学Hive系列
—-Hive概述,Hive是什么
—-Hive函数大全-完整版
—-Hive中的数据库(Database)和表(Table)
—-Hive的安装配置
—-Hive的视图和分区
—-Hive的动态分区
—-向Hive表中加载数据
—-使用Hive命令行
—-Hive的查询语句SELECT
—-Hive中Join的原理和机制
—-Hive中Join的类型和用法
—-Hive SQL的优化
—-Hive整合HBase,操作HBase表
—-Hive的元数据表结构详解
Hive分析函数系列
Hive索引
hive优化之——控制hive任务中的map数和reduce数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: