Impala 优化之统计数据预存储「compute stats」

由于大表关联,分析同学的执行操作要得出结果往往需要好几分钟,这在千万级、亿级数据量的表之间关联得出结果,不能说是很慢,但是依旧有着可提升的空间。

探索

Impala 中,有一个神秘指令,COMPUTE STATS

它可以预先分析表和列的的结构,并将其存储在元数据中。等到执行查询的时候, Impala 便会根据存储的元数据做出相应的查询优化。

也就是下面这条语句:

1
COMPUTE STATS t1;

执行前

show table stats t1;

#Rows #Files Size Bytes Cached Cache Replication Format Incremental stats Location
-1 4 1.72GB NOT CACHED NOT CACHED PARQUET false hdfs://nameservice1/user/hive/warehouse/t1

show column stats t1;

Column Type #Distinct Values #Nulls Max Size Avg Size
id BIGINT -1 -1 8 8
type INT -1 -1 4 4
uid BIGINT -1 -1 8 8

执行后

show table stats t1;

#Rows #Files Size Bytes Cached Cache Replication Format Incremental stats Location
32233129 4 1.72GB NOT CACHED NOT CACHED PARQUET false hdfs://nameservice1/user/hive/warehouse/t1

show column stats t1;

Column Type #Distinct Values #Nulls Max Size Avg Size
id BIGINT 45300013 0 8 8
type INT 14 0 4 4
uid BIGINT 2831250 0 8 8

分析

从上面的表格可以看出,compute stats 为我们缓存了几个较为常用的 count 值,不要小看这几个值。

在大型连表查询中,相比未经过 compute stats 优化的速度提升是几倍甚至十几倍,而相对 hive 的相同查询操作,速度差距将会达到几十倍。

Hive 依然适用

如果想在 hive 中执行,Impala 中查询,也可在 Hive 中执行操作

1
2
ANALYZE TABLE Table1 COMPUTE STATISTICS;
ANALYZE TABLE Table1 COMPUTE STATISTICS FOR COLUMNS;

了解更多

COMPUTE STATS Statement