【零】SparkSQL特性与优化

SparkSQL特性之:代码量少,可读性高。

计算平均数的功能,左是hadoop写MapReduce的代码量,太繁琐。右是用Spark Core RDD API写,代码量少但可读性不好。

【零】SparkSQL特性与优化_第1张图片

同样是计算平均数,用Spark SQL或者DataFrame,代码可读性比RDD好很多。

【零】SparkSQL特性与优化_第2张图片

SparkSQL特性之:统一访问操作接口。

在SparkSQL中read/write不同格式的数据都是有统一个接口。支持(json、parquet、orc等等)。

【零】SparkSQL特性与优化_第3张图片

还可以使用SparkSQL自定义的数据源完成ETL操作。

【零】SparkSQL特性与优化_第4张图片

Spark SQL的DataFrame/DataSet提供了强大的API

1.select required columns选择需要的列

2.join不同的数据源(mysql、hive等等)

3.聚合函数

4.filter过滤

5.group by

等等

SparkSQL具有Schema推导、合并的功能

schema推导

【零】SparkSQL特性与优化_第5张图片

schema合并,这个操作消耗很多资源,从1.5开始默认是关闭的。需要自己打开。

【零】SparkSQL特性与优化_第6张图片

【零】SparkSQL特性与优化_第7张图片

SparkSQL自动分区探测(parquet)

大数据中表的分区是常用的优化方式,以Hive为例。分区表中数据会被存放在不同的目录中。分区的列值标识在分区目录上,下图分区是性别、国家。parquet数据源能自动探测并且推导出来分区的信息。

【零】SparkSQL特性与优化_第8张图片

我们可以通过传递路径/path/table(注意是到根目录下,不要带上分区目录,如果传入/paht/table/gender=male则性别不会被当作分区,根目录传到哪里,就从下一层开始找)给SparkSession.read.parquet or SparkSession.read.load,SparkSQL会自动从路径中抽取出分区信息如下:

【零】SparkSQL特性与优化_第9张图片

能推测出列的类型包括:string和数值类型。如果不想自动推测列的类型,可以通过设置参数spark.sql.sources.partitionColumnTypeInference.enabled来关闭该功能。如果关闭类型推测,全部数据都会被当作string类型。

Spark不同API性能对比

使用DataFrame API的速度比RDD API快很多!

DataFrame中封装了逻辑执行计划,逻辑执行计划会交给catalyst完成做各种优化。

RDD的API是函数式的,有不可变的特性,大部分情况下是创建对象而不是修改对象。导致在运行时可能会创建非常多的对象,导致GC的压力很大。

【零】SparkSQL特性与优化_第10张图片

SparkSQL简单优化方式:

1.用列存储。例如用(parquet、orc)

2.分区裁剪。

3.predicates下压到数据源,查询时从数据源端就过滤掉不需要的数据。(列式存储和JDBC都有)

 

你可能感兴趣的:(spark,streaming,spark,SQL,Spark,SQL)