【零】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都有)