关键字: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元数据结构的详细介绍,可参考前一章:
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中的数据库(Database)和表(Table)
hive优化之——控制hive任务中的map数和reduce数
相关推荐
7. **Hive的优化器**:Hive的Cost-Based Optimizer(CBO)和Statistics可以帮助选择最优的执行计划,包括选择最佳的Join顺序和方法。 8. **Hive的Join挑战**:尽管有各种优化策略,但处理大规模数据集的Join仍然是...
Hive 的架构通常包括一个 Metastore 服务,用于存储元数据(如表结构、分区信息等),一个 Hiveserver2 服务,处理客户端的查询请求,以及一个 beeswax 或 JDBC/ODBC 接口,允许用户通过各种客户端(如 beeline、...
COMPUTE STATISTICS`命令更新表的统计信息,提高CBO的准确性。 2. **并行执行**: - 开启`hive.exec.parallel`,允许并行执行Map任务或Reduce任务,加速查询处理。 3. **索引使用**: - 虽然Hive目前的索引支持...
8. **查询优化**: Hive 提供了一些查询优化器,如 Cost-Based Optimizer (CBO) 和 Statistics,它们根据元数据和统计信息来制定最优的查询执行计划。 9. **Hive on Spark**: 虽然默认使用 MapReduce,但 Hive 也...
在`create_hive_table.json`文件中,我们可以看到具体的Hive建表逻辑,包括字段定义、表分区等信息,这些是后续数据处理的基础。 接下来是“Mysql同步HIVE”。在大数据场景中,常常需要将关系型数据库中的数据导入...
数据分区和分桶都可以显著提高 Hive 的查询性能:数据分区:通过将数据按特定列划分,减少了不必要的数据扫描,提高了查询效率。例如,当查询特定分区的数据时,Hive 只需处理相关分区,而不是整个表。数据分桶:...
1.6.2 分区(Partitions)和桶(Buckets) 1.6.3 存储格式 1.6.4 导入数据 1.6.5 表的修改 1.6.6 表的丢弃 1.7 查询数据 1.7.1 排序(Sorting)和聚集(Aggregating) 1.7.2 MapReduce脚本 1.7.3 连接 1.7.4 子查询 ...
1.6.2 分区(Partitions)和桶(Buckets) 1.6.3 存储格式 1.6.4 导入数据 1.6.5 表的修改 1.6.6 表的丢弃 1.7 查询数据 1.7.1 排序(Sorting)和聚集(Aggregating) 1.7.2 MapReduce脚本 1.7.3 连接 ...