分析Hive表和分区的统计信息(Statistics)
类似于Oracle的分析表,Hive中也提供了分析表和分区的功能,通过自动和手动分析Hive表,将Hive表的一些统计信息存储到元数据中。
表和分区的统计信息主要包括:行数、文件数、原始数据大小、所占存储大小、最后一次操作时间等;
新表的统计信息
对于一个新创建的表,默认情况下,如果通过INSERT OVERWRITE的方式插入数据,那么Hive会自动将该表或分区的统计信息更新到元数据。
有一个参数来控制是否自动统计,hive.stats.autogather,默认为true.
举例来说:
先创建表lxw1234:
- CREATE TABLE lxw1234 (
- id STRING,
- name STRING
- ) stored AS textfile;
CREATE TABLE lxw1234 (
id STRING,
name STRING
) stored AS textfile;
在元数据表TABLE_PARAMS中,会有一条记录,记录了该表上次DDL的时间,
该表中的TBL_ID对应TBLS表中的TBL_ID.
关于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方式新增的分区,统计信息同新创建的表,只不过在元数据中存放的表不一样。
- CREATE TABLE lxw1234 (
- id STRING,
- name STRING
- ) 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命令去手动分析表或分区的统计信息。
- 外部表
- CREATE EXTERNAL TABLE lxw1234 (
- id STRING,
- name STRING
- ) stored AS textfile
- location 'hdfs://namenode/tmp/lxw1234.com/';
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/';
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表和分区的统计信息(Statistics)的更多相关文章
- Sybase数据库收集表及其索引的统计信息
更新表及其索引的统计信息: update table statistics 表名 go update index statistics 表名 go 建议此操作在闲时操作.
- SQL Server 统计信息(Statistics)-概念,原理,应用,维护
前言:统计信息作为sql server优化器生成执行计划的重要参考,需要数据库开发人员,数据库管理员对其有一定的理解,从而合理高效的应用,管理. 第一部分 概念 统计信息(statistics):描述 ...
- Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件
首先说一下,这里解决的问题应用场景: sparksql处理Hive表数据时,判断加载的是否是分区表,以及分区表的字段有哪些?再进一步限制查询分区表必须指定分区? 这里涉及到两种情况:select SQ ...
- Oracle—表、约束、索引、表空间、分区、序列、统计信息
表.约束.索引.表空间.分区.序列.统计信息 一.表及其操作 1.创建表 create table 表名 ( 字段名1 字段类型 默认值 是否为空 , 字段名2 字段类型 默认值 是否为空, 字段名3 ...
- Hive 表分区
Hive表的分区就是一个目录,分区字段不和表的字段重复 创建分区表: create table tb_partition(id string, name string) PARTITIONED BY ...
- hive表分区相关操作
Hive 表分区 Hive表的分区就是一个目录,分区字段不和表的字段重复 创建分区表: create table tb_partition(id string, name string) PARTIT ...
- 收集oracle统计信息
优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN:列统计: --列中唯一值的数量(NDV),NULL值的数量,数据分 ...
- 使用DBMS_STATS来收集统计信息【转】
overview Oracle's cost-based optimizer (COB) uses statistics to calculate the selectivity (the fract ...
- Oracle 分区表的统计信息实例
ORACLE的统计信息在执行SQL的过程中扮演着非常重要的作用,而且ORACLE在表的各个层次都会有不同的统计信息,通过这些统计信息来描述表的,列的各种各样的统计信息.下面通过一个复合分区表来说明一些 ...
随机推荐
- noip 2014 总结
2014 年的noip 已经结束了,成绩从个人而言不是特别的理想,从今年题的逗的程度,本来是个xxx 就被玩脱了= = 当然现在后悔事没有用的了,不过第二天全屏技术的在最后一小时看到了两道题的错误,然 ...
- hdu4126_hdu4756_求最小生成树的最佳替换边_Kruskal and Prim
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem: Portal: hdu4126 hdu4756 原题目 ...
- detours3.0文档翻译
拦截二进制函数 Detours库可以在运行过程中动态拦截函数调用.detours将目标函数前几个指令替换为一个无条件跳转,跳转到用户定义的detour函数.被拦截的函数保存在trampoline函数中 ...
- oracle11g 导出表报EXP-00011:table不存在。
oracle11g 导出表报EXP-00011:table不存在. oracle11g,在用exp命令备份数据库时,如果表中没有数据报EXP-00011错误,对应的表不存在.这导致对应的空表无法备份. ...
- C盘清理垃圾
经常清理C盘垃圾,会让系统运行更快,避免死机,今天教大家一种简单实用的方法,用文本文档清理垃圾: 1:在电脑桌面空白处右键-建立文本文档: 2:把以下代码复制到文本里 @echo offecho 正在 ...
- PyTorch中,关于model.eval()和torch.no_grad()
一直对于model.eval()和torch.no_grad()有些疑惑 之前看博客说,只用torch.no_grad()即可 但是今天查资料,发现不是这样,而是两者都用,因为两者有着不同的作用 引用 ...
- uoj74 【UR #6】破解密码
题目 发现这个题的本质就是在做\(\rm hash\) 我们显然能够列出\(n\)个方程,之后高消,这是\(O(n^3)\)的 但是观察一下第一个和第二个方程 \[a_{1}26^{n-1}+a_{2 ...
- 【python】collections的使用
老师布置了一个课后作业. 统计文本中字母出现的次数并找到最大的那一个 首先是读取文本吧.和c里的也差不多,打开,关闭,读取. path = f = f.close() 然后就用到了这个黑科技.coll ...
- ES6 学习 -- let const
看过很多大佬的ES6笔记,总结一下学习后的收获,给自己当作一个笔记用用: ES3.ES5定义变量有两种方法:var 和 function ES6定义变量有var.function.let.const等 ...
- MySQL数据库之DCL(数据控制语言)
1.MySQL之DCL设置root指定的ip访问 进入mysql:mysql -uroot -p或者mysql -uroot -h127.0.0.1 -p(host默认为127.0.0.1) mysq ...