使用SparkSql进行表的分析与统计

背景

​ 我们的数据挖掘平台对数据统计有比较迫切的需求,而Spark本身对数据统计已经做了一些工作,希望梳理一下Spark已经支持的数据统计功能,后期再进行扩展。

准备数据

在参考文献6中下载鸢尾花数据,此处格式为iris.data格式,先将data后缀改为csv后缀(不影响使用,只是为了保证后续操作不需要修改)

数据格式如下:

SepalLengthSepalWidthPetalLengthPetalWidthName
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

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;,结果如下:

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用法如下:

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.

列统计的描述命令语法如下:

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 tablename COMPUTE STATISTICS FOR COLUMNS columnname [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;获取指定一列的统计信息,结果如下:

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语句如下:

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.distinctCount21
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

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倍以上的性能。

id6)

Current Releases

VersionSpark VersionRelease DateDeprecation AnnouncementDeprecation Date
5.2
Spark 2.4
Jan 24, 2019May 27, 2019
Sep 30, 2019
5.1
Spark 2.4
Dec 18, 2018Apr 18, 2019
Aug 19, 2019
5.0
Spark 2.4
Nov 08, 2018Mar 08, 2019
Jul 08, 2019
4.3
Spark 2.3
Aug 10, 2018Dec 09, 2018
Apr 09, 2019
4.2
Spark 2.3
Jul 09, 2018Nov 05, 2018
Mar 05, 2019
3.5-LTSSpark 2.2
Dec 21, 2017Jan 02, 2019
Jan 02, 2020

Marked for Deprecation

VersionSpark VersionRelease DateDeprecation AnnouncementDeprecation Date
4.3
Spark 2.3
Aug 10, 2018Dec 09, 2018
Apr 09, 2019
4.2
Spark 2.3
Jul 09, 2018Nov 05, 2018
Mar 05, 2019
3.5-LTSSpark 2.2
Dec 21, 2017Jan 02, 2019
Jan 02, 2020

Deprecated Releases

Version
Spark VersionRelease DateDeprecation AnnouncementDeprecation Date
4.1
Spark 2.3
May 17, 2018Sep 17, 2018
Jan 17, 2019
4.0
Spark 2.3
Mar 01, 2018Jul 01, 2018
Nov 01, 2018
3.4
Spark 2.2
Nov 20, 2017Mar 31, 2018
Jul 30, 2018
3.3
Spark 2.2
Oct 04, 2017Mar 31, 2018
Jul 30, 2018
3.2
Spark 2.2
Sep 05, 2017Jan 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, 2016Mar 31, 2018
Jul 30, 2018
Spark 2.1.1-db6
Spark 2.1
Aug 03, 2017Mar 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, 2017Mar 31, 2018
Jul 30, 2018
Spark 2.0 (Auto Updating)Spark 2.0
Jul 26, 2016Jan 30, 2018
Apr 30, 2018
Spark 2.0.2-db4
Spark 2.0
Mar 24, 2017Jan 30, 2018
Apr 30, 2018
Spark 1.6.3-db2
Spark 1.6
Mar 24, 2017Jan 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 发布!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
上百节课详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 课程介绍: 讲解一个真实的、复杂的大型企业级大数据项目,是Spark的大型项目实战课程。 通过本套课程的学习,可以积累大量Spark项目经验,迈入Spark高级开发行列。 课程特色: 1、项目中全面覆盖了Spark Core、Spark SQLSpark Streaming这三个技术框架几乎全部的初级和高级的技术点和知识点, 让学员学以致用,通过一套课程,即掌握如何将Spark所有的技术点和知识点应用在真实的项目中,来实现业务需求! 2、项目中的4个功能横块,全郃是实际企业项目中提取出来的,并进行技术整合和改良过的功能模块.全都是企业级的复杂和真实的需求,业务模块非常之复杂,绝对不是市面上的Dem级别的大数据项目能够想比拟的,学习过后,真正帮助学员增加实际 企业级项目的实战经验。 3、项目中通过实际的功能模块和业务场景,以及讲师曾经开发过的处理十亿、甚至百亿以上数据级别的SparK作业的经验积累,贯穿讲解了大量的高级复杂的性能调优技术和知识、troubleshooting解决线上报错和故障的经验、高端的全方位数据倾斜处理和解决方案.真正帮助学员掌握高精尖的Spark技术! 4、项目中采用完全还原企业大数据项目开发场景的方式来讲解,每一个业务模块的讲解都包括了需求分析、方案设计、数据设计、编码实现、功能测试、性能调优等环节,真实还原企业级大数据项目开发场景。 模块简介: 1、用户访问session分析,该模块主要是对用户访问session进行统计分析.包括session的聚合指标计算、 按时间比例随机抽取session、获取每天点击、下单和购买排名前10的品类、并获取top10品类的点击量排名前10的session.该模块可以让产品经理、数据分析师以及企业管理层形象地看到各种条件下的具体用户行为以及统计指标.从而对公司的产品设计以及业务发展战略做出调整.主要使用Spark Core实现. 2、页面单跳转化率统计,该模块主要是计算关键页面之间的单步跳转转化率,涉及到页面切片算法以及页面流匹配算法.该模块可以让产品经理、数据分析师以及企业管理层看到各个关键页面之间的转化率.从而对网页布局,进行更好的优化设计。主要使用Spark Core实现. 3、热门商品离线统计,该模块主要实现每天统计出各个区域的top3热门商品.然后使用Oozie进行离线统计任务的定时调度,使用Zeppeline进行数据可视化的报展示.该模块可以让企业管理层看到公司售卖的 商品的整体情况,从而对公司的商品相关的战略进行调螫.主要使用Spark SQL实现。 4、广告流量实时统计.该模块负责实时统计公司的广告流量.包括广告展现流量和广告点击流量,实现动态黑名单机制以及黑名单过滤,实现滑动窗口内的各城市的广告展现流立和广告点击流直的统计,实现 每个区域诲个广告的点击流置实时统计,实现每个区域top3点击量的广告的统计,主要使用Spark Streaming实现.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值