元数据管理-hive表Statistics信息获取
1概述
表的基础信息维护展示是数据仓库元数据管理的主要内容之一,对于hive来说如表名,表注释,内外表类型,列的字段名、字段类型、字段备注、是否是分区字段,存储文件类型,压缩格式等信息,这些都是在建表时就可以获取的。还有一些和表中数据存储相关的信息,比如行数,文件数,压缩前后存储大小等信息是随着ETL数据变化而变化的,我们希望在ETL结束后能够获取这些最新信息到我们元数据管理系统中。庆幸的是hive支持表statistic信息的自动统计,我们可以直接从hive的元数据库中获取到这些信息。
2Statistics(统计信息)介绍
Statistics并不是hive的专属特性,在oracle和mysql等数据库中也有分析表存储了表的统计信息,数据库根据这些统计信息对查询计划进行优化。hive同样把表的统计信息作为输入,通过成本优化函数获取最优的执行计划。
hive已经支持表,分区,列级别的统计信息:
1)表和分区的统计信息(0.7.0版本开始支持)
- 行数
- 文件数
- 文件大小
2)列的统计信息(0.10.0版本开始支持)
- number of distinct values
- number of NULL values
- number of TRUES/FALSE values
- min/max values
- avg/max of column length
3Statistics使用
1)表,分区级别的统计信息
对于新创建的表或者分区,默认情况下,如果通过INSERT OVERWRITE的方式插入数据,那么Hive会自动将该表或分区的统计信息更新到元数据。有一个参数来控制是否自动统计,hive.stats.autogather,默认为true.
对于已经存在表或分区我们可以通过ANALYZE命令手动更新其Statistics信息:
ANALYZE TABLE Table1 COMPUTE STATISTICS;//统计全表的所有分区的信息
ANALYZE TABLE Table1 COMPUTE STATISTICS NOSCAN;//只统计文件数和文件大小,不扫描文件行数,执行较快
ANALYZE TABLE Table1 PARTITION(ds='2008-04-09', hr=11) COMPUTE STATISTICS;//统计执行分区的信息
非分区表的statics信息存在hive元数据表TABLE_PARAMS中:
select * from TABLE_PARAMS where TBL_ID=102966
分区表的statics信息存在hive元数据表PARTITION_PARAMS 中:
select * from PARTITION_PARAMS where PART_ID=3011
2)列级别的统计信息
对于列级别的统计信息默认自动统计是关闭的,由参数hive.stats.column.autogather控制,默认false(hive3.0后为true)。
同样我们可以通过ANALYZE命令手动更新其Statistics信息
ANALYZE TABLE Table1 COMPUTE STATISTICS FOR COLUMNS;//统计全表或所有分区列信息
ANALYZE TABLE Table1 PARTITION(ds, hr) COMPUTE STATISTICS FOR COLUMNS;//统计指定分区列的信息
对于非分区表列的statics信息存在hive元数据表TABLE_COL_STATS中:
对于分区表列的statics信息存在hive元数据表PART_COL_STATS中:
4避坑指南
笔者曾经对多个表执行analyze命令,为了加快执行速度,开启了多个线程并行去执行,但是最后发现元数据中数据发生混乱,其A表的分区映射到了B表下,导致数据查询错误。怀疑这个命令是非线程安全的,如果同时对多个表执行annalyze命令会导致元数据库中的数据出现混乱,大家使用的时候需要注意