背景
我们的数据挖掘平台对数据统计有比较迫切的需求,而Spark本身对数据统计已经做了一些工作,希望梳理一下Spark已经支持的数据统计功能,后期再进行扩展。
准备数据
在参考文献6中下载鸢尾花数据,此处格式为iris.data格式,先将data后缀改为csv后缀(不影响使用,只是为了保证后续操作不需要修改)。
数据格式如下:
SepalLength | SepalWidth | PetalLength | PetalWidth | Name |
---|---|---|---|---|
5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa |
4.9 | 3 | 1.4 | 0.2 | Iris-setosa |
4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa |
4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa |
5 | 3.6 | 1.4 | 0.2 | Iris-setosa |
5.4 | 3.9 | 1.7 | 0.4 | Iris-setosa |
4.6 | 3.4 | 1.4 | 0.3 | Iris-setosa |
数据说明见附录中的鸢尾花数据
。
我们先把数据放到Spark sql数仓中
CREATE TABLE IF NOT EXISTS iris ( SepalLength FLOAT , SepalWidth FLOAT
, PetalLength FLOAT , PetalWidth FLOAT
, Species VARCHAR(100)
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '/mnt/disk1/starqiu/iris';
表的分析与统计
Analyze Table语法如下:
ANALYZE TABLE [db_name.]table_name COMPUTE STATISTICS [analyze_option]
Collect statistics about the table that can be used by the query optimizer to find a better plan.
可以看到Spark表的分析可以为spark sql做查询优化,以便得到更好的查询性能。Spark Sql默认使用CBO(基于代价的优化),这在多表join查询时尤其有用。
此处的analyze_option
参数主要分为两类,表统计和列统计。
表统计
表的基本统计信息一般包括记录总数和所占空间。
Table statistics用法如下:
ANALYZE TABLE [db_name.]table_name COMPUTE STATISTICS [NOSCAN]
Collect only basic statistics for the table (number of rows, size in bytes).
NOSCAN
Collect only statistics that do not require scanning the whole table (that is, size in bytes).
运行命令ANALYZE TABLE iris COMPUTE STATISTICS;
可以得到表的记录总数和所占空间大小。如果不想全表扫描,加上NOSCAN
关键字,不会全表扫描,但只能得到所占空间大小。
表统计信息的描述命令语法如下:
DESCRIBE [EXTENDED] [db_name.]table_name