COMPUTE STATS 语句收集卷信息, 表列和分区的数据分布情况;
收集的信息存储在元数据库中,用于优化Impala查询;
例如,如果Impala能确定一张表是大还是小,表里有多少唯一值,就可以为join查询或插入操作组织和并行化工作线程;
CDH 5.10 / Impala 2.8之后,可以对分区表使用COMPUTE INCREMENTAL STATS
,以替代对全表或一次一个分区的操作;可以使用比较符匹配多个分区;
例如,表INT_PARTITIONS包含4个分区;
> show partitions int_partitions;
+-------+-------+--------+------+--------------+-------------------+---------+...
| x | #Rows | #Files | Size | Bytes Cached | Cache Replication | Format |...
+-------+-------+--------+------+--------------+-------------------+---------+...
| 99 | -1 | 0 | 0B | NOT CACHED | NOT CACHED | PARQUET |...
| 120 | -1 | 0 | 0B | NOT CACHED | NOT CACHED | TEXT |...
| 150 | -1 | 0 | 0B | NOT CACHED | NOT CACHED | TEXT |...
| 200 | -1 | 0 | 0B | NOT CACHED | NOT CACHED | TEXT |...
| Total | -1 | 0 | 0B | 0B | | |...
+-------+-------+--------+------+--------------+-------------------+---------+...
只统计一些分区,通过比较符
> compute incremental stats int_partitions partition (x < 100);
+-----------------------------------------+
| summary |
+-----------------------------------------+
| Updated 1 partition(s) and 1 column(s). |
+-----------------------------------------+
通过in语句
> compute incremental stats int_partitions partition (x in (100, 150, 200));
+-----------------------------------------+
| summary |
+-----------------------------------------+
| Updated 2 partition(s) and 1 column(s). |
+-----------------------------------------+
通过between…and…
> compute incremental stats int_partitions partition (x between 100 and 175);
+-----------------------------------------+
| summary |
+-----------------------------------------+
| Updated 2 partition(s) and 1 column(s). |
+-----------------------------------------+
联合使用
> compute incremental stats int_partitions partition (x in (100, 150, 200) or x < 100);
+-----------------------------------------+
| summary |
+-----------------------------------------+
| Updated 3 partition(s) and 1 column(s). |
+-----------------------------------------+
使用非操作符
> compute incremental stats int_partitions partition (x != 150);
+-----------------------------------------+
| summary |
+-----------------------------------------+
| Updated 3 partition(s) and 1 column(s). |
+-----------------------------------------+
对于大表,COMPUTE STATS
可能要花费很多时间,需要优化;
COMPUTE STATS
不能和EXPLAIN
或impala-shell的SUMMARY
命令一起使用;
可以使用impala-shell的PROFILE
语句检测运行时间;
实例有两张表,T1和T2;
T1是小表,T2有100K行; 要做T1.ID和T2.PARENT的join操作;
最开始,统计信息只包含一些物理度量信息,如文件数,总大小和固定长度字段(如int类型)的大小;-1表示未知的值;
T1的初始统计信息
//# 表统计信息
> show table stats t1;
+-------+--------+------+--------+
| #Rows | #Files | Size | Format |
+-------+--------+------+--------+
| -1 | 1 | 33B | TEXT |
+-------+--------+------+--------+
//# 字段统计信息
> show column stats t1;
+--------+--------+------------------+--------+----------+----------+
| Column | Type | #Distinct Values | #Nulls | Max Size | Avg Size |
+--------+--------+------------------+--------+----------+----------+
| id | INT | -1 | -1 | 4 | 4 |
| s | STRING | -1 | -1 | -1 | -1 |
+--------+--------+------------------+--------+----------+----------+
T2的统计信息
//# 表统计信息
> show table stats t2;
+-------+--------+----------+--------+
| #Rows | #Files | Size | Format |
+-------+--------+----------+--------+
| -1 | 28 | 960.00KB | TEXT |
+-------+--------+----------+--------+
//# 字段统计信息
> show column stats t2;
+--------+--------+------------------+--------+----------+----------+
| Column | Type | #Distinct Values | #Nulls | Max Size | Avg Size |
+--------+--------+------------------+--------+----------+----------+
| parent | INT | -1 | -1 | 4 | 4 |
| s | STRING | -1 | -1 | -1 | -1 |
+--------+--------+------------------+--------+----------+----------+
收集更多的统计信息
> compute stats t1;
+-----------------------------------------+
| summary |
+-----------------------------------------+
| Updated 1 partition(s) and 2 column(s). |
+-----------------------------------------+
> show table stats t1;
+-------+--------+------+--------+
| #Rows | #Files | Size | Format |
+-------+--------+------+--------+
| 3 | 1 | 33B | TEXT |
+-------+--------+------+--------+
> show column stats t1;
+--------+--------+------------------+--------+----------+----------+
| Column | Type | #Distinct Values | #Nulls | Max Size | Avg Size |
+--------+--------+------------------+--------+----------+----------+
| id | INT | 3 | -1 | 4 | 4 |
| s | STRING | 3 | -1 | -1 | -1 |
+--------+--------+------------------+--------+----------+----------+
语法1
COMPUTE STATS [db_name.]table_name [ ( column_list ) ] [TABLESAMPLE SYSTEM(percentage) [REPEATABLE(seed)]]
column_list ::= column_name [ , column_name, ... ]
语法2
COMPUTE INCREMENTAL STATS [db_name.]table_name [PARTITION (partition_spec)]
partition_spec ::= partition_col=constant_value
partition_spec ::= simple_partition_spec | complex_partition_spec
simple_partition_spec ::= partition_col=constant_value
complex_partition_spec ::= comparison_expression_on_partition_col
PARTITION
子句只能与INCREMENTAL
子句连用;
PARTITION
子句在COMPUTE INCREMENTAL STATS
里是可选的,而在DROP INCREMENTAL STATS
里是必须的;
当在COMPUTE INCREMENTAL STATS
或DROP INCREMENTAL STATS
通过PARTITION (partition_spec)
子句定义分区时,必须包含所有分区列,并对所有分区键列定义常量值;
注意
最开始,Impala依赖用户运行Hive的ANALYZE TABLE
语句收集信息,但这种方法不可靠并且难以使用;
Impala的COMPUTE STATS
语句用来改善这些问题;
非增量统计COMPUTE STATS
语句,可以指定逗号分隔的字段列表;没有指定字段表列,会统计表里的所有列;
如果字段没有参于查询,则会增加无必要的开销,尤其是对宽表和未使用的大文本;
如果给定的是空字段列表,则COMPUTE STATS
不会统计分析任何字段;
如果给定的字段无法分析,COMPUTE STATS
会返回错误,如字段不存在;
COMPUTE STATS
不支持的字段类型,如复杂类型或字段是分区中的字段;
在CDH5.15/Impala2.12之后,可选的TABLESAMPLE
子句,可以使COMPUTE STATS
操作只处理指定百分比的数据;
如果表太大,完整的COMPUTE STATS
操作不实际,可以使用TABLESAMPLE
子句从数据表样本外推统计;
COMPUTE INCREMENTAL STATS
适用于已分区的表,会作用于表分区数据而不是全表;
可用于有许多分区的大表,当添加或删除分区时,完整的COMPUTE STATS
会花费很多的时间;
COMPUTE INCREMENTAL STATS
应用于未分区的表,会自动转为COMPUTE STATS
;
当使用SHOW TABLE STATS
查看时,Incremental stats
列会显示false;
重要
对一张表,不能同时使用COMPUTE STATS
或COMPUTE INCREMENTAL STATS
;
如果要更换语句,要先使用DROP STATS
删除统计信息;
当对一张表第一次运行COMPUTE INCREMENTAL STATS
时,会忽略已存在统计信息而重新计算,预期会有一次资源紧张的操作,即全表扫描;
对有大量分区和字段的表,对每个分区及每个字段,会在内存加载大约400字节的元信息,会缓存在catalogd主机和每个impalad主机;如查所有表的元信息超过2G,可有会引起服务停机;
注意
许多高性能和高资源的操作依赖于表和字段统计,用以构建精确和有效的查询计划,COMPUTE STATS
是ETL处理结束时很重要的一步;
当对慢查询进行优化或有OOM时,在所有表上运行COMPUTE STATS
COMPUTE STATS
或COMPUTE INCREMENTAL STATS
,Impala会自动添加查询选项MT_DOP=4
,增加节点内的并行性以优化CPU消耗;当前,COMPUTE STATS
的信息不包含复杂类型字段的信息,复杂字段的统计计量总显示-1;
查询复杂字段时,Impala使用启动法估计数据分布;
COMPUTE STATS
也能应用于HBase表;收集的信息和HDFS表不同,但收集的元信息也应用于HBase表参于查询的优化;
COMPUTE STATS
也能应用于S3(Amazon Simple Storage Service);