SparkSQL
概述:
sparkSQL是spark用来处理结构化数据的一个模块。
sparkSQL提供了一个编程的抽象叫做DataFrame并且作为我们分布式SQL的查询引擎
作用:用来处理结构化数据,先将非结构化的数据转成结构化数据。
SparkSQL提供了两种编程模型:
1)SQL的方式 select * from user;
2)DataFrame方式(DSL)
HQL:将SQL转换为mr任务
SparkSQL:将SQL转换为RDD,效率快
特点:
1)容易整合 spark
2)统一数据的访问方式
3)标准的数据连接
支持JDBC/ODBC,可以对接BI工具
4)兼容HIVE
DataFrame
与RDD类似,DataFrame也是一个分布式数据容器。
SparkSQL属于SQL解析引擎。在spark,将SQL解析RDD。注意:这个RDD比较特殊,是
带有schema信息的RDD。
这个RDD就叫DataFrame。
DataFrame像数据库的二维表格(有行有列表描述),它除了数据之外还记录了数据的
结构信息(schema)。
与RDD区别:
DataFrame:存放了结构化数据的描述信息
RDD:存储文本数据、二进制、音频、视频…
思考?如果我想用SQL,我要先干什么?
SQL风格的操作
一. 创建sparkSession
SparkSQL程序的入口:SparkSession(2.0以后引入的统一访问方式。可以访问所有的Spark组件。)
二.读取数据
方式一: 直接读(textFile)
方式二: 读取指定格式的文件,直接创建DF
三.通过schema创建DF
通过方式一读取数据,我们需要得到schema信息,然后通过创建Row来映射列对应schema信息,这样我们才能创建DF,或者通过case样例类(直接toDF)
case class 特点:
可以支持模式匹配,使用case class建立表结构
7521, WARD, SALESMAN,7698, 1981/2/22, 1250, 500, 30
case class Emp(empno:Int,ename:String,job:String,mgr:Int,hiredate:String,sal:Int,comm:Int,deptno:Int)
2、读取文件
val lines = sc.textFile("/usr/local/tmp_files/emp.csv").map(_.split(","))
3、把每行数据,映射到Emp上。
val allEmp = lines.map(x => Emp(x(0).toInt,x(1),x(2),x(3).toInt,x(4),x(5).toInt,x(6).toInt,x(7).toInt))
4、生成DataFrame
val df1 = allEmp.toDF
df1.show
(此时,df.show()就可以看到一个表数据了,此时,我们有两种方式来操作这个表)
方式一:SQL的方式
(常用,毕竟大数据的最终目的就是使用SQL的思想来操作大量的数据)
1.创建视图(临时表)
因为通过sql操作表,我们后面肯定要知道表名,通过创建视图给到表名,我们才可以操作嘛。
此时有两种方式
(1)createOrReplaceTempView,createTempView,createGlobalTempView
(分别是以Session为生命周期和以全局的application为生命周期,可以通过stop()给删掉,在spark缓存中)
(2)registerTempTable(过时)
在Spark的早期版本,我们使用registerTempTable来注册Dataframe。然而在Spark 2.0中,这个API已经被遗弃了。registerTempTable名字很让人误解,因为用户会认为这个函数会将Dataframe持久化并且保证这个临时表,但是实际上并不是这样的,所以社区才有意将它替换成createTempView。
2.操作表
此时通过之前Session对象.sql(sql)来操作数据
方式二: DSL的方式(不用创建视图)
df1.select( " e n a m e " , "ename",