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 | ANALYZE TABLE Table1 COMPUTE STATISTICS; |