类似于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/';
    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. ALTER TABLE lxw1234 ADD PARTITION (day = '2015-07-15')
  6. 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)的更多相关文章

  1. Sybase数据库收集表及其索引的统计信息

    更新表及其索引的统计信息: update table statistics 表名 go update index statistics 表名 go 建议此操作在闲时操作.

  2. SQL Server 统计信息(Statistics)-概念,原理,应用,维护

    前言:统计信息作为sql server优化器生成执行计划的重要参考,需要数据库开发人员,数据库管理员对其有一定的理解,从而合理高效的应用,管理. 第一部分 概念 统计信息(statistics):描述 ...

  3. Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件

    首先说一下,这里解决的问题应用场景: sparksql处理Hive表数据时,判断加载的是否是分区表,以及分区表的字段有哪些?再进一步限制查询分区表必须指定分区? 这里涉及到两种情况:select SQ ...

  4. Oracle—表、约束、索引、表空间、分区、序列、统计信息

    表.约束.索引.表空间.分区.序列.统计信息 一.表及其操作 1.创建表 create table 表名 ( 字段名1 字段类型 默认值 是否为空 , 字段名2 字段类型 默认值 是否为空, 字段名3 ...

  5. Hive 表分区

    Hive表的分区就是一个目录,分区字段不和表的字段重复 创建分区表: create table tb_partition(id string, name string) PARTITIONED BY ...

  6. hive表分区相关操作

    Hive 表分区 Hive表的分区就是一个目录,分区字段不和表的字段重复 创建分区表: create table tb_partition(id string, name string) PARTIT ...

  7. 收集oracle统计信息

    优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN:列统计: --列中唯一值的数量(NDV),NULL值的数量,数据分 ...

  8. 使用DBMS_STATS来收集统计信息【转】

    overview Oracle's cost-based optimizer (COB) uses statistics to calculate the selectivity (the fract ...

  9. Oracle 分区表的统计信息实例

    ORACLE的统计信息在执行SQL的过程中扮演着非常重要的作用,而且ORACLE在表的各个层次都会有不同的统计信息,通过这些统计信息来描述表的,列的各种各样的统计信息.下面通过一个复合分区表来说明一些 ...

随机推荐

  1. bzoj1051题解

    [题意分析] 给你一张有向图,求有多少个点,满足以其他任意一点为起点都能到达该点. [解题思路] 如果这张有向图不连通,则一定没有点能被其他所有点到达,答案为0. 然后先用tarjan缩一波强连通分量 ...

  2. BZOJ 2225: [Spoj 2371]Another Longest Increasing (CDQ分治+dp)

    题面 Description 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. Input Output ...

  3. 玩转gulp之watch监听文件自动编译

    博客移至 https://www.dodoblog.cn/blog?id=5befc928e0feb34495b57035 我们在写页面的时候,用到sass less等css预处理器的时候,虽然写的很 ...

  4. (转)Java安全通信:HTTPS与SSL

    转:http://www.cnblogs.com/devinzhang/archive/2012/02/28/2371631.html 1. HTTPS概念 1)简介 HTTPS(全称:Hyperte ...

  5. KNN与决策树

    KNN: 就是计算特征之间的距离,某一个待预测的数据分别与已知的所有数据计算他们之间的特征距离,选出前N个距离最近的数据,这N个数据中哪一类的数据最多,就判定待测数据归属哪一类. 假如N=3,图中待测 ...

  6. spring boot 重复提交

    package com.future.interceptor; import javax.servlet.http.HttpServletRequest; import org.aspectj.lan ...

  7. java.sql.SQLException: validateConnection false

    -- :: --- [Create-] com.alibaba.druid.pool.DruidDataSource : create connection error java.sql.SQLExc ...

  8. 测试网中用户添加docker yum源

    /etc/yum.repo.d 中新建docker.repo 添加 [docker]name=CentOS-$releasever - Mediabaseurl=ftp://10.191.51.X/d ...

  9. 归档和解档配合NSFile存储数据

    NSString *Name = @"yc"; //第一个常量NSDocumentDirectory表示正在查找沙盒Document目录的路径(如果参数为NSCachesDirec ...

  10. POST提交数据之---Content-Type的理解

    Content-Type是指http/https发送信息至服务器时的内容编码类型,contentType用于表明发送数据流的类型,服务器根据编码类型使用特定的解析方式,获取数据流中的数据. 在网络请求 ...