【零】SparkSQL特性与优化

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

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

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

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

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

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

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

1.select required columns选择需要的列

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

3.聚合函数

4.filter过滤

5.group by

等等

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

schema推导

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

SparkSQL自动分区探测(parquet)

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

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

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

Spark不同API性能对比

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

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

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

SparkSQL简单优化方式:

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

2.分区裁剪。

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值