Spark SQL是Spark用于结构化数据处理的模块,前身是Shark。Shark基于Hive开发,虽提升了SQL-on-Hadoop效率,但对Hive依赖过多。2014年6月1日Shark项目停止开发,团队将资源投入Spark SQL项目。Spark SQL具有诸多优点,如摆脱对Hive依赖、支持多种数据源、有多种性能优化技术、组件可扩展等
Spark SQL是对Spark Core的封装,老版本中有SQLContext和HiveContext两种SQL查询起始点,SparkSession是最新SQL查询起始点,是SQLContext和HiveContext的组合
Spark SQL特点包括:
易整合:无缝整合SQL查询和Spark编程
统一的数据访问:使用相同方式连接不同数据源
兼容 Hive:在已有仓库上可直接运行SQL或HQL
标准数据连接:通过JDBC或ODBC连接
DataFrame是一种以RDD为基础的分布式数据集,带有schema元信息。与RDD相比,Spark SQL能更好优化其执行计划,提升运行效率。DataFrame类似于传统数据库中的二维表格,支持嵌套数据类型,API友好,门槛较低
DataSet是Spark1.6中添加的新抽象,是DataFrame的扩展。它是分布式数据集合,提供RDD的优势以及Spark SQL优化执行引擎的优点,是强类型的,可以用样例类定义结构信息,用户友好的API风格兼具类型安全检查和查询优化特性,还可以使用功能性转换操作
SparkSession是Spark SQL的入口,创建DataFrame有三种方式:
通过Spark的数据源进行创建,如读取json文件
从一个存在的RDD进行转换
从Hive Table进行查询返回
读取JSON文件创建DataFrame后,可对DataFrame创建临时表或全局表,然后通过SQL语句实现查询全表等操作
DataFrame的DSL语法包括:
创建DataFrame,如通过 spark.read.json 方法读取json文件
查看DataFrame的Schema信息,使用 printSchema 方法
查看指定列数据,如 select 方法
涉及运算时,列需使用 $ 或引号表达式
过滤数据使用 filter 方法,分组统计使用 groupBy 和 count 方法
RDD与DataFrame转换需注意:
RDD转换为DataFrame需引入 spark.implicits._ ,可通过样例类或直接操作实现
DataFrame转换为RDD可直接获取内部的RDD
创建DataSet有两种方式:
使用样例类序列创建,如 Seq(Person("zhangsan",2)).toDS()
使用基本类型的序列创建,如 Seq(1,2,3,4,5).toDS
RDD与DataSet转换需要注意:
SparkSQL能自动将含有case类的RDD转换成DataSet
DataSet转换为RDD可直接获取内部RDD
DataFrame和DataSet转换方法:
DataFrame可转换为DataSet,如 df.asUser
DataSet可转换为DataFrame,如 ds.toDF
RDD、DataFrame、DataSet三者的关系:
共性:都是Spark平台下的分布式弹性数据集,有惰性机制、共同函数、自动缓存运算、分区概念,DataFrame和DataSet可使用模式匹配获取字段值和类型
区别:RDD:一般与spark mllib同时使用,不支持sparksql操作
DataFrame:每一行类型固定为Row,不支持spark mllib操作,支持sparksql操作和一些保存方式
DataSet:和DataFrame拥有相同成员函数,区别在于行数据类型,DataFrame是DataSet的特例