MRS Hive列统计信息
Hive列统计信息
Hive的列统计信息记录了Hive表字段的元信息,根据字段类型的不同,统计的元信息也是稍有差异的。本文讲述两种常用的字段类型,int和string。int类型有4个统计信息,分别是:min、max、num_nulls、distinct_count;string类型也有4个统计信息,分别是: num_nulls、distinct_count、avg_col_len、max_col_len。
- 创建Hive测试表
create table test_col_stats(id int,name string) partitioned by(part int);
此时,该表的字段是没有统计信息的,因为该表此时还没有数据
- 往测试表插入数据
insert into test_col_stats partition(part=1) values(1,'a'),(2,'bb'),(3,'ccc'),(4,'test'),(5,'col'),(6,'stats');
查看测试表id字段的统计信息
desc formatted test_col_stats partition(part=1) id;
发现int类型的id字段的4个统计信息依然没有统计到数据。原因是Hive表字段的统计信息默认是关闭,即不会自动统计列的元信息。如果需要自动统计列的元信息,则可以设置以下两个参数为true:
set hive.stats.autogather=true;
set hive.stats.column.autogather=true;
- 计算Hive表列统计信息
对于已经存在数据的表,可以手动执行analyze语句来计算列的统计信息。
analyze table test_col_stats compute statistics for columns;
待analyze语句执行完成后,再次查看列(id字段)的统计信息:
desc formatted test_col_stats partition(part=1) id;
查看string类型的name字段的统计信息:
desc formatted test_col_stats partition(part=1) name;
通过以上截图,发现该表id字段和name字段的统计信息已经能够查询出来,说明手动执行analyze语句计算统计信息成功。
- Analyze语句(计算列统计信息)执行过程简述
首先,在Beeline提交该语句后,Hiveserver会启动一个MapReduce任务,来统计各个列的元信息,将结果输出到hdfs的一个临时路径,待MapReduce任务完成后, Hiveserver接着启动一个StatsTask来读取MapReduce的输出结果,反序列化成列统计信息对象,最后通过Metastore持久化到Hive的元数据库。在持久化完成后,就可以在Beeline客户端查询到该表的列统计信息。值得一提的是,列统计信息的distinct_count指标并不是精确计算的,而是一个估计值,由HyperLogLog对象估计而来的。
- 点赞
- 收藏
- 关注作者
评论(0)