[一起学Hive]之十五 |
您所在的位置:网站首页 › hive统计信息收集 › [一起学Hive]之十五 |
关键字: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_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方式覆盖该表数据,那么统计信息将会更新。 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_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 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_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的方式增加一个分区,道理上其实和外部表没什么区别; 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
没问题了,已经将行数和原始大小统计进来。 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数
如果觉得本博客对您有帮助,请 赞助作者 。 转载请注明:lxw的大数据田地 » [一起学Hive]之十五-分析Hive表和分区的统计信息(Statistics) 喜欢 (10)分享 (0) |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |