一、Spark SQL 简介
Spark SQL 是 Spark 用来处理结构化数据的一个模块,它提供了一个编程抽象叫做 DataFrame 并且作为分布式 SQL 查询引擎的作用。
为什么要学习 Spark SQL?我们已经学习了 Hive,它是将 Hive SQL 转换成 MapReduce 然后提交到集群上执行,大大简化了编写 MapReduce 的程序的复杂性,由于 MapReduce 这种计算模型执行效率比较慢。所以 Spark SQL 的应运而生,它是将 Spark SQL 转换成 RDD,然后提交到集群执行,执行效率非常快!同时 Spark SQL 也支持从 Hive 中读取数据。
二、Spark SQL 的特点
- 无缝集成在 Spark 中,将 SQL 查询与 Spark 程序混合。Spark SQL 允许您使用 SQL 或熟悉的 DataFrame API 在 Spark 程序中查询结构化数据。适用于 Java、Scala、Python 和 R 语言。
- 提供统一的数据访问,以相同的方式连接到任何数据源。DataFrames 和 SQL 提供了一种访问各种数据源的通用方法,包括 Hive、Avro、Parquet、ORC、JSON 和 JDBC。您甚至可以通过这些源连接数据。
- 支持 Hive 集成。在现有仓库上运行 SQL 或 HiveQL 查询。Spark SQL 支持 HiveQL 语法以及 Hive SerDes 和 udf,允许您访问现有的 Hive 仓库。
- 支持标准的连接,通过 JDBC 或 ODBC 连接。服务器模式为业务智能工具提供了行业标准 JDBC 和 ODBC 连接。
三、核心概念:DataFrames 和 Datasets
-
DataFrame
DataFrame 是组织成命名列的数据集。它在概念上等同于关系数据库中的表,但在底层具有更丰富的优化。DataFrames 可以从各种来源构建,例如:
- 结构化数据文件
- hive 中的表
- 外部数据库或现有 RDDs
DataFrame API 支持的语言有 Scala,Java,Python 和 R。
从上图可以看出,DataFrame 多了数据的结构信息,即 schema。RDD 是分布式的 Java 对象的集合。DataFrame 是分布式的 Row 对象的集合。DataFrame 除了提供了比 RDD 更丰富的算子以外,更重要的特点是提升执行效率、减少数据读取以及执行计划的优化。
-
Datasets
Dataset 是数据的分布式集合。Dataset 是在 Spark 1.6 中添加的一个新接口,是 DataFrame 之上更高一级的抽象。它提供了 RDD 的优点(强类型化,使用强大的 lambda 函数的能力)以及 Spark SQL 优化后的执行引擎的优点。一个 Dataset 可以从 JVM 对象构造,然后使用函数转换(map,flatMap,filter 等)去操作。Dataset API 支持 Scala 和 Java。Python 不支持 Dataset API。
四、创建 DataFrames
- 测试数据如下:员工表
- 定义 case class(相当于表的结构:Schema)
case class Emp(empno:Int,ename:String,job:String,mgr:Int,hiredate:String,sal:Int,comm:Int,deptno:Int)
- 将 HDFS 上的数据读入 RDD,并将 RDD 与 case Class 关联
val lines = sc.textFile("hdfs://bigdata111:9000/input/emp.csv").map(_.split(","))
- 把每个 Array 映射成一个 Emp 的对象
val emp = 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))
- 生成 DataFrame
val allEmpDF = emp.toDF
- 通过 DataFrames 查询数据
- 将 DataFrame 注册成表(视图)
allEmpDF.createOrReplaceTempView("emp")
- 执行 SQL 查询
spark.sql("select * from emp").show