Impala SQL语句 COMPUTE STATS

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 STATSDROP 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 STATSCOMPUTE INCREMENTAL STATS;
如果要更换语句,要先使用DROP STATS删除统计信息;

当对一张表第一次运行COMPUTE INCREMENTAL STATS时,会忽略已存在统计信息而重新计算,预期会有一次资源紧张的操作,即全表扫描;

对有大量分区和字段的表,对每个分区及每个字段,会在内存加载大约400字节的元信息,会缓存在catalogd主机和每个impalad主机;如查所有表的元信息超过2G,可有会引起服务停机;

注意
许多高性能和高资源的操作依赖于表和字段统计,用以构建精确和有效的查询计划,COMPUTE STATS是ETL处理结束时很重要的一步;

当对慢查询进行优化或有OOM时,在所有表上运行COMPUTE STATS

  • 精确的统计帮助Impala构建高效的join查询计划,提升性能,降低内存消耗;
  • 精确的统计帮助Impala对insert Parquet表操作高效地分布工作线程,提升性能,降低内存消耗;
  • 估计每个查询的内存使用量,这个信息对资源管理组件很重要;这个信息帮助Impala达到高并行,高效使用内存,避免和其他Hadoop组件的竞争;
  • CDH 5.10 / Impala 2.8之后,对Parquet表使用COMPUTE STATSCOMPUTE INCREMENTAL STATS,Impala会自动添加查询选项MT_DOP=4,增加节点内的并行性以优化CPU消耗;

当前,COMPUTE STATS的信息不包含复杂类型字段的信息,复杂字段的统计计量总显示-1;
查询复杂字段时,Impala使用启动法估计数据分布;

COMPUTE STATS也能应用于HBase表;收集的信息和HDFS表不同,但收集的元信息也应用于HBase表参于查询的优化;
COMPUTE STATS也能应用于S3(Amazon Simple Storage Service);

你可能感兴趣的:(Impala SQL语句 COMPUTE STATS)