Spark的认识(三)
1、本文内容
-
1、掌握sparkSQL原理
-
2、掌握DataFrame和DataSet数据结构和使用方式
-
3、掌握sparksql代码开发
2、sparksql概述
2.1 sparksql前世今生
-
shark是专门为spark设计的大数据仓库系统
-
shark与hive代码兼容,同时它也依赖于spark的版本
-
后期由于hive的代码升级,spark的版本不断变化。
-
hive的mapreduce处理思想限制了shark的性能
-
后面慢慢把shark这个框架废弃了。把重点转移到sparksql上面
2.2 sparksql 是什么
-
Spark SQL is Apache Spark's module for working with structured data.
-
Sparksql是spark用来处理结构化数据的一个模块。它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用。
3、sparksql特性
-
1、易整合
-
将sql与spark应用程序混合使用,同时使用java、scala、python、R等不同的语言api去操作
-
-
2、统一的数据源访问
-
sparksql可以以一种相同的方式来访问任意的外部数据源
-
SparkSession.read.文件格式("该格式的文件路径")
-
-
3、兼容hive
-
可以通过sparksql去操作hivesql
-
-
4、支持标准的数据库连接
-
可以通过jdbc或者是odbc来操作数据库表中的数据
-
4、DataFrame
4.1 DataFrame是什么
DataFrame它的前身是schemaRDD,它是在spark1.3.0之后把schemaRDD改名为DataFrame, schemaRDD是直接继承自RDD,而DataFrame自己实现了RDD中的一些方法,你可以使用dataFrame调用rdd方法转换成一个RDD. 在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库的二维表格,DataFrame带有Schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型,但底层做了更多的优化
4.2 RDD与DataFrame区别
DataFrame比RDD多了对结构化数据的描述信息,就是schema元信息
4.3 RDD与DataFrame优缺点
-
1、RDD
-
优点
-
1、编译时类型安全
-
编译时类型检查,就是看一下当前的数据类型是不是我们程序需要的数据类型
-
-
2、具有面向对象编程的特性
-
可以使用面向对象编程来操作rdd
-
-
-
缺点
-
1、序列化和反序列化性能开销很大
-
在进行分布式计算的时候,会涉及到数据大量的网络传输
-
RDD会把数据本身和数据结构信息首先都会进行序列化,然后在进行反序列化获取对象
-
-
2、频繁创建大量的对象会带来GC(垃圾回收)
-
-
-
2、DataFrame
-
DataFrame引入了schema和off-heap
-
优点
-
1、由于DataFrame引入了schema,解决了RDD中序列化和反序列性能开销很多这个缺点
-
后期再进行数据传输的时候,只需要序列化和反序列化数据内容本身就可以了,对于数据结构信息也就是schema可以省略掉。
-
-
2、由于DataFrame引入了off-heap(对象的创建不在jvm堆以内,直接使用操作系统层面上的内存),解决了RDD频繁创建大量的对象会带来GC(垃圾回收)这个缺点。
-
-
缺点
-
DataFrame引入了schema和off-heap分别解决了RDD的2个缺点,同时它也丢失rdd的优点
-
1、编译时类型不安全
-
2、不具有面向对象编程的特性
-
-
-
5、读取数据源创建DataFrame
5.1 读取文本文件创建DataFrame
//读取文本文件创建DataFrame val df1=spark.read.text("/person.txt") //打印schema df1.printSchema //展示数据 df1.show
5.2 读取json文件创建DataFrame
//读取json文件创建DataFrame val df2=spark.read.json("/people.json") //打印schema df2.printSchema //展示数据 df2.show
5.3 读取parquet列存储的文件创建DataFrame
//读取parquet文件创建DataFrame val df3=spark.read.parquet("/users.parquet") //打印schema df3.printSchema //展示数据 df3.show
6、DataFrame常用操作
6.1 DSL风格语法
-
就是dataFrama自己封装了一套api,可以通过这套api来操作dataFrame