IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> HIVE Statistics(Hive 统计信息) 的说明和查询优化详解 -> 正文阅读

[大数据]HIVE Statistics(Hive 统计信息) 的说明和查询优化详解

本文从普通用户的角度讲述 Hive 统计信息,源代码角度请参考

统计信息的分类

有两种统计信息,第1种为表和分区的统计信息,第2种为分区的统计信息。

表和分区的统计信息

表的统计信息

包括如下内容:

  • numFiles – 文件的数量
  • numRows – 记录数量
  • totalSize – 总文件大小
  • rawDataSize – 原始数据量(因为可以压缩后存储到文件里)

对于分区表,还包括以下内容:

  • numPartitions 1824

显示表的统计信息的语句。

desc extended table_name;

或者

desc formatted table_name;

其中,用 desc formatted table_name 是格式化输出,更容易阅读,统计信息在 Table Parameters 部分,如下面的示例。

Table Parameters:	 	 
	COLUMN_STATS_ACCURATE	{\"BASIC_STATS\":\"true\"}
	bucketing_version   	2                   
	numFiles            	1826                
	numPartitions       	1824                
	numRows             	2160165             
	rawDataSize         	3930709572          
	totalSize           	122202436           
	transient_lastDdlTime	1646036041          

分区的统计信息

分区的统计信息,内容和非分区表的统计信息一致。显示方法示例:

desc formatted web_sales partition(ws_sold_date_sk=2452642);

Partition Parameters: 部分可以找到分区的统计信息。

Partition Parameters:	 	 
	COLUMN_STATS_ACCURATE	{\"BASIC_STATS\":\"true\"}
	numFiles            	1                   
	numRows             	2379                
	rawDataSize         	4329780             
	totalSize           	127832              
	transient_lastDdlTime	1646036434    

字段的统计信息

字段的统计信息包括字段的最大值,最小值,null 的数量,distinct 的数量等。如一个表的字段统计信息已经收集,在 desc formatted table_name 时,Table Parameters:COLUMN_STATS_ACCURATE有COLUMN_STATS,对应的字段为 true,则表示该字段的统计信息已经收集。 可以用类似以下的命令显示。

desc formatted web_site;
Table Parameters:	 	 
	COLUMN_STATS_ACCURATE	{\"BASIC_STATS\":\"true\",\"COLUMN_STATS\":{\"web_city\":\"true\",\"web_class\":\"true\",\"web_close_date_sk\":\"true\",\"web_company_id\":\"true\",\"web_company_name\":\"true\",\"web_country\":\"true\",\"web_county\":\"true\",\"web_gmt_offset\":\"true\",\"web_manager\":\"true\",\"web_market_manager\":\"true\",\"web_mkt_class\":\"true\",\"web_mkt_desc\":\"true\",\"web_mkt_id\":\"true\",\"web_name\":\"true\",\"web_open_date_sk\":\"true\",\"web_rec_end_date\":\"true\",\"web_rec_start_date\":\"true\",\"web_site_id\":\"true\",\"web_site_sk\":\"true\",\"web_state\":\"true\",\"web_street_name\":\"true\",\"web_street_number\":\"true\",\"web_street_type\":\"true\",\"web_suite_number\":\"true\",\"web_tax_percentage\":\"true\",\"web_zip\":\"true\"}}
	bucketing_version   	2                   
	numFiles            	1                   
	numRows             	32                  
	rawDataSize         	65968               
	totalSize           	6379                
	transient_lastDdlTime	1646818911  

查看分区的字段统计信息还是用以下命令。

desc formatted web_sales partition(ws_sold_date_sk=2452642);

显示一个字段的统计信息

非分区表字段的统计信息

DESCRIBE FORMATTED web_site web_site_sk;
OK
col_name            	web_site_sk         	 	 	 	 	 	 	 	 	 	 
data_type           	bigint              	 	 	 	 	 	 	 	 	 	 
min                 	1                   	 	 	 	 	 	 	 	 	 	 
max                 	32                  	 	 	 	 	 	 	 	 	 	 
num_nulls           	0                   	 	 	 	 	 	 	 	 	 	 
distinct_count      	32                  	 	 	 	 	 	 	 	 	 	 
avg_col_len         	                    	 	 	 	 	 	 	 	 	 	 
max_col_len         	                    	 	 	 	 	 	 	 	 	 	 
num_trues           	                    	 	 	 	 	 	 	 	 	 	 
num_falses          	                    	 	 	 	 	 	 	 	 	 	 
bitVector           	                    	 	 	 	 	 	 	 	 	 	 
comment             	from deserializer   	 	 	 	 	 	 	 	 	 	 
COLUMN_STATS_ACCURATE	{\"BASIC_STATS\":\"true\",\"COLUMN_STATS\":{\"web_city\":\"true\",\"web_class\":\"true\",\"web_close_date_sk\":\"true\",\"web_company_id\":\"true\",\"web_company_name\":\"true\",\"web_country\":\"true\",\"web_county\":\"true\",\"web_gmt_offset\":\"true\",\"web_manager\":\"true\",\"web_market_manager\":\"true\",\"web_mkt_class\":\"true\",\"web_mkt_desc\":\"true\",\"web_mkt_id\":\"true\",\"web_name\":\"true\",\"web_open_date_sk\":\"true\",\"web_rec_end_date\":\"true\",\"web_rec_start_date\":\"true\",\"web_site_id\":\"true\",\"web_site_sk\":\"true\",\"web_state\":\"true\",\"web_street_name\":\"true\",\"web_street_number\":\"true\",\"web_street_type\":\"true\",\"web_suite_number\":\"true\",\"web_tax_percentage\":\"true\",\"web_zip\":\"true\"}}	  
Time taken: 0.107 seconds, Fetched: 13 row(s)

一个分区字段的统计信息

DESCRIBE FORMATTED table_name field_name 可以显示一个字段的统计信息,如下所示:

DESCRIBE FORMATTED web_sales web_site_sk;
OK
col_name            	web_site_sk         	 	 	 	 	 	 	 	 	 	 
data_type           	bigint              	 	 	 	 	 	 	 	 	 	 
min                 	1                   	 	 	 	 	 	 	 	 	 	 
max                 	32                  	 	 	 	 	 	 	 	 	 	 
num_nulls           	0                   	 	 	 	 	 	 	 	 	 	 
distinct_count      	32                  	 	 	 	 	 	 	 	 	 	 
avg_col_len         	                    	 	 	 	 	 	 	 	 	 	 
max_col_len         	                    	 	 	 	 	 	 	 	 	 	 
num_trues           	                    	 	 	 	 	 	 	 	 	 	 
num_falses          	                    	 	 	 	 	 	 	 	 	 	 
bitVector           	                    	 	 	 	 	 	 	 	 	 	 
comment             	from deserializer   	 	 	 	 	 	 	 	 	 	 
COLUMN_STATS_ACCURATE	{\"BASIC_STATS\":\"true\",\"COLUMN_STATS\":{\"web_city\":\"true\",\"web_class\":\"true\",\"web_close_date_sk\":\"true\",\"web_company_id\":\"true\",\"web_company_name\":\"true\",\"web_country\":\"true\",\"web_county\":\"true\",\"web_gmt_offset\":\"true\",\"web_manager\":\"true\",\"web_market_manager\":\"true\",\"web_mkt_class\":\"true\",\"web_mkt_desc\":\"true\",\"web_mkt_id\":\"true\",\"web_name\":\"true\",\"web_open_date_sk\":\"true\",\"web_rec_end_date\":\"true\",\"web_rec_start_date\":\"true\",\"web_site_id\":\"true\",\"web_site_sk\":\"true\",\"web_state\":\"true\",\"web_street_name\":\"true\",\"web_street_number\":\"true\",\"web_street_type\":\"true\",\"web_suite_number\":\"true\",\"web_tax_percentage\":\"true\",\"web_zip\":\"true\"}}	  
Time taken: 0.107 seconds, Fetched: 13 row(s)
  • 显示一个分区中字段的统计信息
hive> desc formatted web_sales partition(ws_sold_date_sk=2452536) ws_item_sk;
OK
col_name            	ws_item_sk          	 	 	 	 	 	 	 	 	 	 
data_type           	bigint              	 	 	 	 	 	 	 	 	 	 
min                 	49                  	 	 	 	 	 	 	 	 	 	 
max                 	35997               	 	 	 	 	 	 	 	 	 	 
num_nulls           	0                   	 	 	 	 	 	 	 	 	 	 
distinct_count      	1499                	 	 	 	 	 	 	 	 	 	 
avg_col_len         	                    	 	 	 	 	 	 	 	 	 	 
max_col_len         	                    	 	 	 	 	 	 	 	 	 	 
num_trues           	                    	 	 	 	 	 	 	 	 	 	 
num_falses          	                    	 	 	 	 	 	 	 	 	 	 
bitVector           	                    	 	 	 	 	 	 	 	 	 	 
comment             	from deserializer   

统计信息的作用

查询优化

查询优化器根据统计信息,可以生成代价更低的执行计划。

查询结果

有些查询,可以从统计信息中直接获取查询的结果,不用生成作业读取文件。
配置参数如下,当为true 时,可以用统计信息的结果。

<property>
   <name>hive.compute.query.using.stats</name>
   <value>true</value>
   <description>
     When set to true Hive will answer a few queries like count(1) purely using stats
     stored in metastore. For basic stats collection turn on the config hive.stats.autogather to true.
     For more advanced stats collection need to run analyze table queries.
   </description>
 </property>
  • 查询记录数
    可以看到没有生成任务,直接返回结果。
hive> select count(1) from web_site;
OK
32
Time taken: 2.123 seconds, Fetched: 1 row(s)
  • 查询最大值,最小值
hive> select min(ws_item_sk) from web_sales where ws_sold_date_sk=2452536;
OK
49
Time taken: 0.393 seconds, Fetched: 1 row(s)
  • 查询distinct 值 会生成一个作业,这部分 Hive 还没有优化
hive> select count(distinct ws_item_sk) from web_sales where ws_sold_date_sk=2452536;
Query ID = hive_20220310161137_2da6da34-7eda-4e39-a1f5-146c19081333
Total jobs = 1
Launching Job 1 out of 1
Tez session was closed. Reopening...
Session re-established.
Session re-established.
Status: Running (Executing on YARN cluster with App id application_1646016563431_0141)

----------------------------------------------------------------------------------------------
        VERTICES      MODE        STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED  
----------------------------------------------------------------------------------------------
Map 1 .......... container     SUCCEEDED      1          1        0        0       0       0  
Reducer 2 ...... container     SUCCEEDED      2          2        0        0       0       0  
Reducer 3 ...... container     SUCCEEDED      1          1        0        0       0       0  
----------------------------------------------------------------------------------------------
VERTICES: 03/03  [==========================>>] 100%  ELAPSED TIME: 4.01 s     
----------------------------------------------------------------------------------------------
Status: DAG finished successfully in 4.01 seconds

Query Execution Summary
----------------------------------------------------------------------------------------------
OPERATION                            DURATION
----------------------------------------------------------------------------------------------
Compile Query                           0.23s
Prepare Plan                            0.08s
Get Query Coordinator (AM)              0.00s
Submit Plan                             3.65s
Start DAG                               0.99s
Run DAG                                 4.01s
----------------------------------------------------------------------------------------------

Task Execution Summary
----------------------------------------------------------------------------------------------
  VERTICES      DURATION(ms)   CPU_TIME(ms)    GC_TIME(ms)   INPUT_RECORDS   OUTPUT_RECORDS
----------------------------------------------------------------------------------------------
     Map 1           2031.00          4,920             68           1,526            1,497
 Reducer 2            445.00          1,000              0           1,497                2
 Reducer 3              0.00            280              0               2                0
----------------------------------------------------------------------------------------------

OK
1497

统计信息自动生成的配置参数

参数hive.stats.autogather配置自动生成表和分区的统计信息。hive.stats.column.autogather 配置自动统计列的统计信息。配置之后,会多一个 Task,收集统计信息,存入 MetaStore。

<property>
    <name>hive.stats.autogather</name>
    <value>true</value>
    <description>A flag to gather statistics (only basic) automatically during the INSERT OVERWRITE command.</description>
  </property>
  <property>
    <name>hive.stats.column.autogather</name>
    <value>true</value>
    <description>A flag to gather column statistics automatically.</description>
  </property>

使用命令手动生成统计信息

生成表的统计信息

以下命令用于生成表的统计信息。如果表是非分区表,则生成所有分区的统计信息。

analyze table web_sales compute statistics;

生成某个分区的统计信息

以下命令用于生成表的某些分区的统计信息。

analyze table web_sales partition(ws_sold_date_sk=2452536) compute statistics;

如果有多个分区列,如 log 表有两个分区字段(dt,hour),则以下语句生成 20220308 日所有小时分区的统计信息。

analyze table log partition(dt='20220308') compute statistics;

生成表的字段统计信息

以下命令用于生成表的所有字段统计信息。如果表是非分区表,则生成所有分区的所有字段统计信息。

analyze table web_sales compute statistics for columns;

生成表的某些字段统计信息

如果不想生成所有字段的统计信息,在后面加上需要的字段名,如下所示。

analyze table web_sales compute statistics for columns web_site_sk,ws_item_sk;

生成表的某些分区的字段统计信息

analyze table store_sales partition(ss_sold_date_sk=2452536) compute statistics for columns;

多分区字段也可以不全部指定。

生成表的某些分区,某些字段的字段统计信息

analyze table store_sales partition(ss_sold_date_sk=2452536) compute statistics for columns ss_sold_time_sk,ss_item_sk;
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 22:17:06  更:2022-03-11 22:21:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:40:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码