1.1 Hadoop-impala十大优化之(3)—impala表和列信息统计操作
1.1.1 表和列的信息统计
show table stats parquet_snappy;
compute stats parquet_snappy;
n 如果是hive的话,统计信息命令如下
u ANALYZE TABLE COMPUTE STATISTICS FOR COLUMNS
show table stats parquet_snappy;
+——-+——–+———+————–+——————-+———+——————-+…
| #Rows | #Files | Size | Bytes Cached | Cache Replication | Format | Incremental stats |…
+——-+——–+———+————–+——————-+———+——————-+…
| -1 | 96 | 23.35GB | NOT CACHED | NOT CACHED | PARQUET | false |…
+——-+——–+———+————–+——————-+———+——————-+…
compute stats parquet_snappy;
+—————————————–+
| summary |
+—————————————–+
| Updated 1 partition(s) and 6 column(s). |
+—————————————–+
show table stats parquet_snappy;
+————+——–+———+————–+——————-+———+——————-+…
| #Rows | #Files | Size | Bytes Cached | Cache Replication | Format | Incremental stats |…
+————+——–+———+————–+——————-+———+——————-+…
| 1000000000 | 96 | 23.35GB | NOT CACHED | NOT CACHED | PARQUET | false |…
+————+——–+———+————–+——————-+———+——————-+…
1.1.2 关于列的信息统计
show column stats parquet_snappy;
compute stats parquet_snappy;
show column stats parquet_snappy;
+————-+———-+——————+——–+———-+———-+
| Column | Type | #Distinct Values | #Nulls | Max Size | Avg Size |
+————-+———-+——————+——–+———-+———-+
| id | BIGINT | -1 | -1 | 8 | 8 |
| val | INT | -1 | -1 | 4 | 4 |
| zerofill | STRING | -1 | -1 | -1 | -1 |
| name | STRING | -1 | -1 | -1 | -1 |
| assertion | BOOLEAN | -1 | -1 | 1 | 1 |
| location_id | SMALLINT | -1 | -1 | 2 | 2 |
+————-+———-+——————+——–+———-+———-+
compute stats parquet_snappy;
+—————————————–+
| summary |
+—————————————–+
| Updated 1 partition(s) and 6 column(s). |
+—————————————–+
show column stats parquet_snappy;
+————-+———-+——————+——–+———-+——————-+
| Column | Type | #Distinct Values | #Nulls | Max Size | Avg Size |
+————-+———-+——————+——–+———-+——————-+
| id | BIGINT | 183861280 | -1 | 8 | 8 |
| val | INT | 139017 | -1 | 4 | 4 |
| zerofill | STRING | 101761 | -1 | 6 | 6 |
| name | STRING | 145636240 | -1 | 22 | 13.00020027160645 |
| assertion | BOOLEAN | 2 | -1 | 1 | 1 |
| location_id | SMALLINT | 339 | -1 | 2 | 2 |
+————-+———-+——————+——–+———-+——————-+
1.1.3 有关分区表的信息统计
show partitions year_month_day;
+——-+——-+—–+——-+——–+———+————–+——————-+———+…
| year | month | day | #Rows | #Files | Size | Bytes Cached | Cache Replication | Format |…
+——-+——-+—–+——-+——–+———+————–+——————-+———+…
| 2013 | 12 | 1 | -1 | 1 | 2.51MB | NOT CACHED | NOT CACHED | PARQUET |…
| 2013 | 12 | 2 | -1 | 1 | 2.53MB | NOT CACHED | NOT CACHED | PARQUET |…
| 2013 | 12 | 3 | -1 | 1 | 2.52MB | NOT CACHED | NOT CACHED | PARQUET |…
| 2013 | 12 | 4 | -1 | 1 | 2.51MB | NOT CACHED | NOT CACHED | PARQUET |…
| 2013 | 12 | 5 | -1 | 1 | 2.52MB | NOT CACHED | NOT CACHED | PARQUET |…
| Total | | | -1 | 5 | 12.58MB | 0B | | |…
+——-+——-+—–+——-+——–+———+————–+——————-+———+…
show table stats year_month_day;
+——-+——-+—–+——-+——–+———+————–+——————-+———+…
| year | month | day | #Rows | #Files | Size | Bytes Cached | Cache Replication | Format |…
+——-+——-+—–+——-+——–+———+————–+——————-+———+…
| 2013 | 12 | 1 | -1 | 1 | 2.51MB | NOT CACHED | NOT CACHED | PARQUET |…
| 2013 | 12 | 2 | -1 | 1 | 2.53MB | NOT CACHED | NOT CACHED | PARQUET |…
| 2013 | 12 | 3 | -1 | 1 | 2.52MB | NOT CACHED | NOT CACHED | PARQUET |…
| 2013 | 12 | 4 | -1 | 1 | 2.51MB | NOT CACHED | NOT CACHED | PARQUET |…
| 2013 | 12 | 5 | -1 | 1 | 2.52MB | NOT CACHED | NOT CACHED | PARQUET |…
| Total | | | -1 | 5 | 12.58MB | 0B | | |…
+——-+——-+—–+——-+——–+———+————–+——————-+———+…
show column stats year_month_day;
+———–+———+——————+——–+———-+———-+
| Column | Type | #Distinct Values | #Nulls | Max Size | Avg Size |
+———–+———+——————+——–+———-+———-+
| id | INT | -1 | -1 | 4 | 4 |
| val | INT | -1 | -1 | 4 | 4 |
| zfill | STRING | -1 | -1 | -1 | -1 |
| name | STRING | -1 | -1 | -1 | -1 |
| assertion | BOOLEAN | -1 | -1 | 1 | 1 |
| year | INT | 1 | 0 | 4 | 4 |
| month | INT | 1 | 0 | 4 | 4 |
| day | INT | 5 | 0 | 4 | 4 |
+———–+———+——————+——–+———-+———-+
compute stats year_month_day;
+—————————————–+
| summary |
+—————————————–+
| Updated 5 partition(s) and 5 column(s). |
+—————————————–+
show table stats year_month_day;
+——-+——-+—–+——–+——–+———+————–+——————-+———+…
| year | month | day | #Rows | #Files | Size | Bytes Cached | Cache Replication | Format |…
+——-+——-+—–+——–+——–+———+————–+——————-+———+…
| 2013 | 12 | 1 | 93606 | 1 | 2.51MB | NOT CACHED | NOT CACHED | PARQUET |…
| 2013 | 12 | 2 | 94158 | 1 | 2.53MB | NOT CACHED | NOT CACHED | PARQUET |…
| 2013 | 12 | 3 | 94122 | 1 | 2.52MB | NOT CACHED | NOT CACHED | PARQUET |…
| 2013 | 12 | 4 | 93559 | 1 | 2.51MB | NOT CACHED | NOT CACHED | PARQUET |…
| 2013 | 12 | 5 | 93845 | 1 | 2.52MB | NOT CACHED | NOT CACHED | PARQUET |…
| Total | | | 469290 | 5 | 12.58MB | 0B | | |…
+——-+——-+—–+——–+——–+———+————–+——————-+———+…
show column stats year_month_day;
+———–+———+——————+——–+———-+——————-+
| Column | Type | #Distinct Values | #Nulls | Max Size | Avg Size |
+———–+———+——————+——–+———-+——————-+
| id | INT | 511129 | -1 | 4 | 4 |
| val | INT | 364853 | -1 | 4 | 4 |
| zfill | STRING | 311430 | -1 | 6 | 6 |
| name | STRING | 471975 | -1 | 22 | 13.00160026550293 |
| assertion | BOOLEAN | 2 | -1 | 1 | 1 |
| year | INT | 1 | 0 | 4 | 4 |
| month | INT | 1 | 0 | 4 | 4 |
| day | INT | 5 | 0 | 4 | 4 |
+———–+———+——————+——–+———-+——————-+
1.1.4 增量信息统计
在2.1.0高,你可以使用语法计算增量数据和增量数据下降。增量子句与增量统计工作,是一个专门的功能分区表,是大或经常更新新的分区。
INCREMENTAL STATS or DROP INCREMENTAL STATS statement.
1.1.5 什么时候需要重新统计信息
当一个内容表或分区明显变化,重新计算统计相关数据表或分区。
变化是“重大”的程度不同,根据表的绝对和相对大小。
通常,如果你添加了30%多个数据表,这是值得重新计算统计,因为行和不同值的数量差异可能导致impala选择不同的连接顺序时,表中使用的查询。这个指南对于最大的表是最重要的。
例如,增加30%个新的数据表中含有1 TB的具有更大的影响比加入顺序加30%表只包含几兆字节,而较大的表对查询性能有较大的影响如果impala选择一个次优顺序连接由于过时的统计数据。
如果你加载一个完整的数据表中的数据的新的集合,而每一列的行数和不同值的数量是相对不变的,你不需要重新计算统计表。
如果一个表的数据是过时的,和表的大小使它重新计算新的数据立即不切实际,你可以使用下拉数据声明删除过时的数据,使其更容易识别,需要一个新的计算统计操作表。
对于一个大的分区表,请考虑使用增量统计特征在Impala 2.1.0高可用,在增量统计概要说明。如果你添加一个新的分区表,这是值得重新计算增量数据,因为操作只需扫描数据,一个新的分区。
1.1.6 查看表和列的统计信息样例
[localhost:21000] > show table stats store;
+——-+——–+——–+——–+
| #Rows | #Files | Size | Format |
+——-+——–+——–+——–+
| -1 | 1 | 3.08KB | TEXT |
+——-+——–+——–+——–+
|Returned 1 row(s) in 0.03s
[localhost:21000] > show column stats store;
+——————–+———–+——————+——–+———-+———-+
| Column | Type | #Distinct Values | #Nulls | Max Size | Avg Size |
+——————–+———–+——————+——–+———-+———-+
| s_store_sk | INT | -1 | -1 | 4 | 4 |
| s_store_id | STRING | -1 | -1 | -1 | -1 |
| s_rec_start_date | TIMESTAMP | -1 | -1 | 16 | 16 |
| s_rec_end_date | TIMESTAMP | -1 | -1 | 16 | 16 |
| s_closed_date_sk | INT | -1 | -1 | 4 | 4 |
| s_store_name | STRING | -1 | -1 | -1 | -1 |
| s_number_employees | INT | -1 | -1 | 4 | 4 |
| s_floor_space | INT | -1 | -1 | 4 | 4 |
| s_hours | STRING | -1 | -1 | -1 | -1 |
| s_manager | STRING | -1 | -1 | -1 | -1 |
| s_market_id | INT | -1 | -1 | 4 | 4 |
| s_geography_class | STRING | -1 | -1 | -1 | -1 |
| s_market_desc | STRING | -1 | -1 | -1 | -1 |
| s_market_manager | STRING | -1 | -1 | -1 | -1 |
| s_division_id | INT | -1 | -1 | 4 | 4 |
| s_division_name | STRING | -1 | -1 | -1 | -1 |
| s_company_id | INT | -1 | -1 | 4 | 4 |
| s_company_name | STRING | -1 | -1 | -1 | -1 |
| s_street_number | STRING | -1 | -1 | -1 | -1 |
| s_street_name | STRING | -1 | -1 | -1 | -1 |
| s_street_type | STRING | -1 | -1 | -1 | -1 |
| s_suite_number | STRING | -1 | -1 | -1 | -1 |
| s_city | STRING | -1 | -1 | -1 | -1 |
| s_county | STRING | -1 | -1 | -1 | -1 |
| s_state | STRING | -1 | -1 | -1 | -1 |
| s_zip | STRING | -1 | -1 | -1 | -1 |
| s_country | STRING | -1 | -1 | -1 | -1 |
| s_gmt_offset | FLOAT | -1 | -1 | 4 | 4 |
| s_tax_percentage | FLOAT | -1 | -1 | 4 | 4 |
+——————–+———–+——————+——–+———-+———-+
Returned 29 row(s) in 0.04s
在分析列统计表的表报表时,您必须指定用于收集统计数据的每个列。impala计算统计报表自动汇总所有列的统计,因为它读取整个表比较快,可以有效地计算所有列的值。这个例子显示了运行后的计算统计报表,统计数据被填充在表和它的所有列中:
[localhost:21000] > compute stats store;
+——————————————+
| summary |
+——————————————+
| Updated 1 partition(s) and 29 column(s). |
+——————————————+
|Returned 1 row(s) in 1.88s
[localhost:21000] > show table stats store;
+——-+——–+——–+——–+
| #Rows | #Files | Size | Format |
+——-+——–+——–+——–+
| 12 | 1 | 3.08KB | TEXT |
+——-+——–+——–+——–+
|Returned 1 row(s) in 0.02s
[localhost:21000] > show column stats store;
+——————–+———–+——————+——–+———-+——————-+
| Column | Type | #Distinct Values | #Nulls | Max Size | Avg Size |
+——————–+———–+——————+——–+———-+——————-+
| s_store_sk | INT | 12 | -1 | 4 | 4 |
| s_store_id | STRING | 6 | -1 | 16 | 16 |
| s_rec_start_date | TIMESTAMP | 4 | -1 | 16 | 16 |
| s_rec_end_date | TIMESTAMP | 3 | -1 | 16 | 16 |
| s_closed_date_sk | INT | 3 | -1 | 4 | 4 |
| s_store_name | STRING | 8 | -1 | 5 | 4.25 |
| s_number_employees | INT | 9 | -1 | 4 | 4 |
| s_floor_space | INT | 10 | -1 | 4 | 4 |
| s_hours | STRING | 2 | -1 | 8 | 7.083300113677979 |
| s_manager | STRING | 7 | -1 | 15 | 12 |
| s_market_id | INT | 7 | -1 | 4 | 4 |
| s_geography_class | STRING | 1 | -1 | 7 | 7 |
| s_market_desc | STRING | 10 | -1 | 94 | 55.5 |
| s_market_manager | STRING | 7 | -1 | 16 | 14 |
| s_division_id | INT | 1 | -1 | 4 | 4 |
| s_division_name | STRING | 1 | -1 | 7 | 7 |
| s_company_id | INT | 1 | -1 | 4 | 4 |
| s_company_name | STRING | 1 | -1 | 7 | 7 |
| s_street_number | STRING | 9 | -1 | 3 | 2.833300113677979 |
| s_street_name | STRING | 12 | -1 | 11 | 6.583300113677979 |
| s_street_type | STRING | 8 | -1 | 9 | 4.833300113677979 |
| s_suite_number | STRING | 11 | -1 | 9 | 8.25 |
| s_city | STRING | 2 | -1 | 8 | 6.5 |
| s_county | STRING | 1 | -1 | 17 | 17 |
| s_state | STRING | 1 | -1 | 2 | 2 |
| s_zip | STRING | 2 | -1 | 5 | 5 |
| s_country | STRING | 1 | -1 | 13 | 13 |
| s_gmt_offset | FLOAT | 1 | -1 | 4 | 4 |
| s_tax_percentage | FLOAT | 5 | -1 | 4 | 4 |
+——————–+———–+——————+——–+———-+——————-+
Returned 29 row(s) in 0.04s
下面的示例显示了如何将统计数据表示为一个分区表。在这种情况下,我们已经建立了一个表,以保持世界上最琐碎的人口普查数据,一个单一的字符串字段,按一年的列分区。表统计包括每个分区的单独的条目,以及数字字段的最终总计。列数据包括分区列一些容易推断出来的事实,如不同值的数量(划分子目录的数量)。
localhost:21000] > describe census;
+——+———-+———+
| name | type | comment |
+——+———-+———+
| name | string | |
| year | smallint | |
+——+———-+———+
Returned 2 row(s) in 0.02s
[localhost:21000] > show table stats census;
+——-+——-+——–+——+———+
| year | #Rows | #Files | Size | Format |
+——-+——-+——–+——+———+
| 2000 | -1 | 0 | 0B | TEXT |
| 2004 | -1 | 0 | 0B | TEXT |
| 2008 | -1 | 0 | 0B | TEXT |
| 2010 | -1 | 0 | 0B | TEXT |
| 2011 | 0 | 1 | 22B | TEXT |
| 2012 | -1 | 1 | 22B | TEXT |
| 2013 | -1 | 1 | 231B | PARQUET |
| Total | 0 | 3 | 275B | |
+——-+——-+——–+——+———+
Returned 8 row(s) in 0.02s
[localhost:21000] > show column stats census;
+——–+———-+——————+——–+———-+———-+
| Column | Type | #Distinct Values | #Nulls | Max Size | Avg Size |
+——–+———-+——————+——–+———-+———-+
| name | STRING | -1 | -1 | -1 | -1 |
| year | SMALLINT | 7 | -1 | 2 | 2 |
+——–+———-+——————+——–+———-+———-+
Returned 2 row(s) in 0.02s
The following example shows how the statistics are filled in by a COMPUTE STATS statement in Impala.
[localhost:21000] > compute stats census;
+—————————————–+
| summary |
+—————————————–+
| Updated 3 partition(s) and 1 column(s). |
+—————————————–+
|Returned 1 row(s) in 2.16s
[localhost:21000] > show table stats census;
+——-+——-+——–+——+———+
| year | #Rows | #Files | Size | Format |
+——-+——-+——–+——+———+
| 2000 | -1 | 0 | 0B | TEXT |
| 2004 | -1 | 0 | 0B | TEXT |
| 2008 | -1 | 0 | 0B | TEXT |
| 2010 | -1 | 0 | 0B | TEXT |
| 2011 | 4 | 1 | 22B | TEXT |
| 2012 | 4 | 1 | 22B | TEXT |
| 2013 | 1 | 1 | 231B | PARQUET |
| Total | 9 | 3 | 275B | |
+——-+——-+——–+——+———+
Returned 8 row(s) in 0.02s
[localhost:21000] > show column stats census;
+——–+———-+——————+——–+———-+———-+
| Column | Type | #Distinct Values | #Nulls | Max Size | Avg Size |
+——–+———-+——————+——–+———-+———-+
| name | STRING | 4 | -1 | 5 | 4.5 |
| year | SMALLINT | 7 | -1 | 2 | 2 |
+——–+———-+——————+——–+———-+———-+
Returned 2 row(s) in 0.02s