Spark-SQL: Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。
Hive and SparkSQL: Drill,Impala.Shark
Shark 是伯克利实验室 Spark 生态环境的组件之一. Shark 的出现,使得 SQL-on-Hadoop 的性能比 Hive 有了 10-100 倍的提高。
Spark-SQL 特点
易整合。无缝的整合了 SQL 查询和 Spark 编程 |
统一的数据访问。使用相同的方式连接不同的数据源 |
兼容 Hive。在已有的仓库上直接运行 SQL 或者 HQL |
标准数据连接。通过 JDBC 或者 ODBC 来连接 |
DataFrame 是什么: 优化的执行计划,即查询计 划通过 Spark catalyst optimiser 进行优化。
DataSet 是什么
DataSet 是 DataFrame API 的一个扩展,是 SparkSQL 最新的数据抽象 |
用户友好的 API 风格,既具有类型安全检查也具有 DataFrame 的查询优化特性; |
用样例类来对 DataSet 中定义数据的结构信息,样例类中每个属性的名称直接映射到 DataSet 中的字段名称; |
DataSet 是强类型的。比如可以有 DataSet[Car],DataSet[Person]。 |
DataFrame 是 DataSet 的特列,DataFrame=DataSet[Row] ,所以可以通过 as 方法将 DataFrame 转换为 DataSet。Row 是一个类型,跟 Car、Person 这些的类型一样,所有的表结构信息都用 Row 来表示。获取数据时需要指定顺序 |
DataFrame
DataFrame API 既有 transformation 操作也有 action 操作。
Spark-SQL核心编程(一)
创建 DataFrame
Spark 数据源进行创建
Spark-SQL支持的数据类型:
在 spark 的 bin/data 目录中创建 user.json 文件
展示数据:
SQL 语法
读取 JSON 文件创建 DataFrame
对 DataFrame 创建一个临时表
通过 SQL 语句实现查询全表
结果展示
通过 SQL 语句实现查询全表
Spark-SQL核心编程(二)
DSL 语法
创建一个 DataFrame
查看 DataFrame 的 Schema 信息
只查看"username"列数据
查看"username"列数据以及"age+1"数据
查看"age"大于"17"的数据
按照"age"分组,查看数据条数
RDD 转换为 DataFrame
DataFrame 转换为 RDD
DataFrame 其实就是对 RDD 的封装,所以可以直接获取内部的 RDD
Spark-SQL核心编程(三)
创建 DataSet
使用样例类序列创建 DataSet
在实际使用的时候,很少用到把序列转换成DataSet,更多的是通过RDD来得到DataSet
使用基本类型的序列创建 DataSet
RDD 转换为 DataSet
DataSet 转换为 RDD
DataFrame 和 DataSet 转换
DataSet 转换为 DataFrame
RDD、DataFrame、DataSet 三者的关系 |
Spark1.0 => RDD |
Spark1.3 => DataFrame |
Spark1.6 => Dataset |
三者的共性
RDD、DataFrame、DataSet 全都是 spark 平台下的分布式弹性数据集,为处理超大型数据提供便利; |
三者都有惰性机制,在进行创建、转换,如 map 方法时,不会立即执行,只有在遇到Action 如 foreach 时,三者才会开始遍历运算; |
三者有许多共同的函数,如 filter,排序等; |
在对 DataFrame 和 Dataset 进行操作许多操作都需要这个包:import spark.implicits._(在创建好 SparkSession 对象后尽量直接导入) |
三者都会根据 Spark 的内存情况自动缓存运算,这样即使数据量很大,也不用担心会内存溢出 |
三者都有分区(partition)的概念 |
DataFrame 和 DataSet 均可使用模式匹配获取各个字段的值和类型 |
三者的区别
三者可以通过上图的方式进行相互转换