使用SparkSql进行表的分析与统计
# 背景
我们的数据挖掘平台对数据统计有比较迫切的需求,而Spark本身对数据统计已经做了一些工作,希望梳理一下Spark已经支持的数据统计功能,后期再进行扩展。
# 准备数据
在参考文献6中下载[鸢尾花数据](https://archive.ics.uci.edu/ml/machine-learning-databases/iris/),此处格式为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数仓中
```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语法如下:
```sql
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用法如下:
```sql
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`关键字,不会全表扫描,但只能得到所占空间大小。
表统计信息的描述命令语法如下:
```sql
DESCRIBE [EXTENDED] [db_name.]table_name
```
> Return the metadata of an existing table (column names, data types, and comments). If the table does not exist, an exception is thrown.
>
> **EXTENDED**
> Display detailed information about the table, including parent database, table type, storage information, and properties.
> Describe Partition
运行`DESCRIBE EXTENDED iris;`,结果如下:
```shell
spark-sql> DESCRIBE EXTENDED iris;
SepalLength float NULL
SepalWidth float NULL
PetalLength float NULL
PetalWidth float NULL
Species string NULL
# Detailed Table Information CatalogTable(
Table: `default`.`iris`
Owner: root
Created: Sat Feb 16 17:24:32 CST 2019
Last Access: Thu Jan 01 08:00:00 CST 1970
Type: EXTERNAL
Schema: [StructField(SepalLength,FloatType,true), StructField(SepalWidth,FloatType,true), StructField(PetalLength,FloatType,true), StructField(PetalWidth,FloatType,true), StructField(Species,StringType,true)]
Provider: hive
Properties: [rawDataSize=-1, numFiles=0, transient_lastDdlTime=1550311815, totalSize=0, COLUMN_STATS_ACCURATE=false, numRows=-1]
Statistics: sizeInBytes=3808, rowCount=150, isBroadcastable=false
Storage(Location: hdfs://data126:8020/mnt/disk1/starqiu/iris, InputFormat: org.apache.hadoop.mapred.TextInputFormat, OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, Serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Properties: [field.delim=,, serialization.format=,])
Partition Provider: Catalog)
Time taken: 0.112 seconds, Fetched 7 row(s)
```
通过`Statistics:`可以看到表的记录总数是150条,所占空间3808B,约4KB。
## 列统计
Column statistics用法如下:
```sql
ANALYZE TABLE [db_name.]table_name COMPUTE STATISTICS FOR COLUMNS col1 [, col2, ...]
```
> Collect column statistics for the specified columns in addition to table statistics.
>
> Tip
>
> Use this command whenever possible because it collects more statistics so the optimizer can find better plans. Make sure to collect statistics for all columns used by the query.
列统计的描述命令语法如下:
```sql
DESCRIBE [EXTENDED][db_name.]table_name column_name
New in version runtime-3.3.
```
> EXTENDED
> Display detailed information about the specified columns, including the column statistics collected by the command ANALYZE TABLE table_name COMPUTE STATISTICS FOR COLUMNS column_name [column_name, ...].
需要注意的是这个功能在runtime-3.3版本才有的特性,而runtime-3.3封装的是Spark 2.2,会详见文末附录的`databricks Runtime版本与Spark版本的对应关系`
运行命令`ANALYZE TABLE iris COMPUTE STATISTICS FOR COLUMNS SepalLength, SepalWidth, PetalLength, PetalWidth, Species;`计算指定多列的统计信息,
运行`DESCRIBE EXTENDED iris SepalLength;`获取指定一列的统计信息,结果如下:
```shell
spark-sql> ANALYZE TABLE iris COMPUTE STATISTICS FOR COLUMNS SepalLength, SepalWidth, PetalLength, PetalWidth, Species;
Time taken: 4.45 seconds
spark-sql> DESCRIBE EXTENDED iris PetalWidth;
col_name PetalWidth
data_type float
comment NULL
min 0.10000000149011612
max 2.5
num_nulls 0
distinct_count 21
avg_col_len 4
max_col_len 4
histogram NULL
Time taken: 0.104 seconds, Fetched 10 row(s)
```
目前测试Spark2.2.2不支持该语句,但是Spark2.4.0支持。如果不支持,则可以通过访问hive的元数据库也可以得到这些信息,sql语句如下:
```sql
select param_key, param_value
from TABLE_PARAMS tp, TBLS t
where tp.tbl_id=t.tbl_id and tbl_name = 'iris'
and param_key like 'spark.sql.stat%';
```
以下是PetalWidth列的统计结果,可以看到包含**不重复的记录数,空值数,最大值、最小值,平均长度以及最大长度**
| param_key | param_value |
| ------------------------------------------------------ | ------------------- |
| spark.sql.statistics.colStats.PetalWidth.avgLen | 4 |
| spark.sql.statistics.colStats.PetalWidth.distinctCount | 21 |
| spark.sql.statistics.colStats.PetalWidth.max | 2.5 |
| spark.sql.statistics.colStats.PetalWidth.maxLen | 4 |
| spark.sql.statistics.colStats.PetalWidth.min | 0.10000000149011612 |
| spark.sql.statistics.colStats.PetalWidth.nullCount | 0 |
| spark.sql.statistics.colStats.PetalWidth.version | 1 |
# 总结
可以看到这些统计信息不仅对了解数据质量非常有用,对使用Spark sql进行查询也能得到优化,进一步提升速度。后续再写一篇CBO如何利用这些信息进行优化。
目前还不清楚Runtime中的Spark功能和开源版的有无差异,但Spark2.4支持表的分析统计操作,建议平台后续项目升级到Spark2.4 。
# 附录
## 鸢尾花数据说明
Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性。iris以鸢尾花的特征作为数据来源,常用在分类操作中。该数据集由3种不同类型的鸢尾花的50个样本数据构成。其中的一个种类与另外两个种类是线性可分离的,后两个种类是非线性可分离的。
**四个属性:**
Sepal.Length(花萼长度),单位是cm;
Sepal.Width(花萼宽度),单位是cm;
Petal.Length(花瓣长度),单位是cm;
Petal.Width(花瓣宽度),单位是cm;
**三个种类:**
Iris Setosa(山鸢尾);
Iris Versicolour(杂色鸢尾);
Iris Virginica(维吉尼亚鸢尾)。
## databricks Runtime
![DatabricksUnifiedAnalyticsPlatform](https://img2018.cnblogs.com/blog/1226548/202001/1226548-20200102134042808-1709154063.png)
Runtime是databricks 统一分析平台的一部分,官网描述如下:
> Accelerate innovation by unifying data science, engineering and business, with the Databricks Unified Analytics Platform, from the original creators of Apache Spark™.
Runtime的描述如下:
> Simplify operations and get up to 50x better performance with cloud-optimized Apache Spark™.
可以看到主要是基于云优化来简化操作并提升50倍以上的性能。
## [databricks Runtime版本与Spark版本的对应关系](https://docs.databricks.com/release-notes/runtime/databricks-runtime-ver.html#id6)
**Current Releases**
| Version | Spark Version | Release Date | Deprecation Announcement | Deprecation Date |
| ------- | ------------- | ------------ | ------------------------ | ---------------- |
| 5.2 | Spark 2.4 | Jan 24, 2019 | May 27, 2019 | Sep 30, 2019 |
| 5.1 | Spark 2.4 | Dec 18, 2018 | Apr 18, 2019 | Aug 19, 2019 |
| 5.0 | Spark 2.4 | Nov 08, 2018 | Mar 08, 2019 | Jul 08, 2019 |
| 4.3 | Spark 2.3 | Aug 10, 2018 | Dec 09, 2018 | Apr 09, 2019 |
| 4.2 | Spark 2.3 | Jul 09, 2018 | Nov 05, 2018 | Mar 05, 2019 |
| 3.5-LTS | Spark 2.2 | Dec 21, 2017 | Jan 02, 2019 | Jan 02, 2020 |
**Marked for Deprecation**
| Version | Spark Version | Release Date | Deprecation Announcement | Deprecation Date |
| ------- | ------------- | ------------ | ------------------------ | ---------------- |
| 4.3 | Spark 2.3 | Aug 10, 2018 | Dec 09, 2018 | Apr 09, 2019 |
| 4.2 | Spark 2.3 | Jul 09, 2018 | Nov 05, 2018 | Mar 05, 2019 |
| 3.5-LTS | Spark 2.2 | Dec 21, 2017 | Jan 02, 2019 | Jan 02, 2020 |
**Deprecated Releases**
| Version | Spark Version | Release Date | Deprecation Announcement | Deprecation Date |
| ------------------------- | ------------- | ------------ | ------------------------ | ---------------- |
| 4.1 | Spark 2.3 | May 17, 2018 | Sep 17, 2018 | Jan 17, 2019 |
| 4.0 | Spark 2.3 | Mar 01, 2018 | Jul 01, 2018 | Nov 01, 2018 |
| 3.4 | Spark 2.2 | Nov 20, 2017 | Mar 31, 2018 | Jul 30, 2018 |
| 3.3 | Spark 2.2 | Oct 04, 2017 | Mar 31, 2018 | Jul 30, 2018 |
| 3.2 | Spark 2.2 | Sep 05, 2017 | Jan 30, 2018 | Apr 30, 2018 |
| 3.1 | Spark 2.2 | Aug 04, 2017 | – | Oct 30, 2017 |
| 3.0 | Spark 2.2 | Jul 11, 2017 | – | Sep 05, 2017 |
| Spark 2.1 (Auto Updating) | Spark 2.1 | Dec 22, 2016 | Mar 31, 2018 | Jul 30, 2018 |
| Spark 2.1.1-db6 | Spark 2.1 | Aug 03, 2017 | Mar 31, 2018 | Jul 30, 2018 |
| Spark 2.1.1-db5 | Spark 2.1 | May 31, 2017 | – | Aug 03, 2017 |
| Spark 2.1.1-db4 | Spark 2.1 | Apr 25, 2017 | Mar 31, 2018 | Jul 30, 2018 |
| Spark 2.0 (Auto Updating) | Spark 2.0 | Jul 26, 2016 | Jan 30, 2018 | Apr 30, 2018 |
| Spark 2.0.2-db4 | Spark 2.0 | Mar 24, 2017 | Jan 30, 2018 | Apr 30, 2018 |
| Spark 1.6.3-db2 | Spark 1.6 | Mar 24, 2017 | Jan 30, 2018 | Jun 30, 2018 |
# 参考文献
1. https://docs.databricks.com/spark/latest/spark-sql/language-manual/analyze-table.html
2. https://docs.databricks.com/spark/latest/spark-sql/language-manual/describe-table.html
3. https://docs.databricks.com/spark/latest/spark-sql/cbo.html
4. https://docs.databricks.com/release-notes/runtime/databricks-runtime-ver.html#versioning
5. https://blog.csdn.net/Albert201605/article/details/82313139
6. https://archive.ics.uci.edu/ml/datasets/Iris
> 本文由博客一文多发平台 [OpenWrite](https://openwrite.cn?from=article_bottom) 发布!
使用SparkSql进行表的分析与统计的更多相关文章
- 分析Hive表和分区的统计信息(Statistics)
类似于Oracle的分析表,Hive中也提供了分析表和分区的功能,通过自动和手动分析Hive表,将Hive表的一些统计信息存储到元数据中. 表和分区的统计信息主要包括:行数.文件数.原始数据大小.所占 ...
- MYSQL进阶学习笔记十一:MySQL 表的分析,检查和优化!(视频序号:进阶_28)
知识点十二:MySQL 表的分析,检查和优化(28) 表的分析,检查和优化: 定期分析表: ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, ...
- mtools 是由MongoDB 官方工程师实现的一套工具集,可以很快速的日志查询分析、统计功能,此外还支持本地集群部署管理.
mtools 是由MongoDB 官方工程师实现的一套工具集,可以很快速的日志查询分析.统计功能,此外还支持本地集群部署管理 https://www.cnblogs.com/littleatp/p/9 ...
- Sybase数据库收集表及其索引的统计信息
更新表及其索引的统计信息: update table statistics 表名 go update index statistics 表名 go 建议此操作在闲时操作.
- SSH网上商城---需求分析+表关系分析
SSH---小编初次接触的时候傻傻的以为这个跟SHE有什么关系呢?又是哪路明星歌手,后来才知道小编又土鳖了,原来SSH是这个样子滴,百度百科对她这样阐述,SSH即 Spring + Struts +H ...
- mysql死锁-查询锁表进程-分析锁表原因【转】
查询锁表进程: 1.查询是否锁表 show OPEN TABLES where In_use > 0; 2.查询进程 show processlist 查询到相对应的进程===然 ...
- OVS 内核KEY值提取及匹配流表代码分析
原文链接:http://ry0117.com/2016/12/24/OVS内核KEY值提取及匹配流表代码分析/ 当开启OVS后,创建datapath类型为system的网桥并他添加相关接口,OVS网桥 ...
- 基于ACCESS和ASP的SQL多个表查询与计算统计代码(一)
近期在写几个关于"Project - Subitem - Task"的管理系统,说是系统还是有点夸大了,基本就是一个多表查询调用和insert.update的数据库操作.仅仅是出现 ...
- sql server的数据库个数、表个数及表的数据量统计
sql server的数据库个数.表个数及表的数据量统计 --由于今天要监控数据,急需统计实例中1有多少库2库里有多少表3每个表有多少数据 --将写好的代码贴出来,用到如下的: --sysobje ...
随机推荐
- 配置 IO 时要记得换 Page
配置 IO 时要记得换 Page 在配置某些芯片时,配置 IO 时要记得换页,不然不生效. 注意查看 IO 的相关规格书说明,而且每个厂商是不一样的.
- SDUT-2772_数据结构实验之串一:KMP简单应用
数据结构实验之串一:KMP简单应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定两个字符串string1和str ...
- Java练习 SDUT-3328_JAVA判断合法标识符
JAVA判断合法标识符 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入若干行字符串,判断每行字符串是否可以作为JA ...
- 04使用harbor配置私仓
安装harbor之前,需要安装好Python,Docker,DockerCompose.Python需要2.7以上的版本,Docker需要1.10以上的版本:Docker Compose 需要1.6. ...
- selenium webdriver学习(四)------------定位页面元素(转)
selenium webdriver学习(四)------------定位页面元素 博客分类: Selenium-webdriver seleniumwebdriver定位页面元素findElemen ...
- get_magic_quotes_gpc() PHP转义的真正含义
如何正确的理解PHP转 义是一个初学者比较困扰的问题.我们今天为大家简要的讲述了PHP转义的具体含义,希望有所帮助.PHP转义一直困扰着我, 今天认真的看了一下PHP手册, 终于解决了. 在PHP中默 ...
- 用winrar和zip命令拷贝目录结构
linux系统下使用zip命令 zip -r source.zip source -x *.php -x *.html # 压缩source目录,排除里面的php和html文件 windows系统下使 ...
- Linux下yum安装Redis
检验是否有yum源: [root@localhost ~]# yum install redis 显示没有软件包Redis,安装epel仓库(提供一些RHEL/CentOS默认不提供的软件包). [r ...
- P1108 分解质因数
题目描述 给你一个正整数 \(n\) ,请给 \(n\) 分解质因数,并按照样例输出的格式输出对应的结果. 输入格式 输入包含一个正整数 \(n (2 \le n \le 10^9)\) . 输出格式 ...
- POJ 1236 Network of Schools(tarjan)
Network of Schools Description A number of schools are connected to a computer network. Agreements h ...