Spark-SQL
Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。
Hive and SparkSQL
,SparkSQL 可以简化 RDD 的开发,提高开发效率,且执行效率非常快,所以实际工作中,基本上采用的就是 SparkSQL。Spark SQL 为了简化 RDD 的开发, 提高开发效率,提供了 2 个编程抽象,类似 Spark Core 中的 RDD
➢ DataFrame
➢ DataSet
易整合。无缝的整合了 SQL 查询和 Spark 编程
统一的数据访问。使用相同的方式连接不同的数据源
兼容 Hive。在已有的仓库上直接运行 SQL 或者 HQL
标准数据连接。通过 JDBC 或者 ODBC 来连接
在 Spark 中,DataFrame 是一种以 RDD 为基础的分布式数据集,类似于传统数据库中 的二维表格。
DataSet 是分布式数据集合。DataSet 是 Spark 1.6 中添加的一个新抽象,是 DataFrame 的一个扩展。它提供了 RDD 的优势(强类型,使用强大的 lambda 函数的能力)以及 Spark SQL 优化执行引擎的优点。DataSet 也可以使用功能性的转换(操作 map,flatMap,filter 等等)
在 Spark SQL 中 SparkSession 是创建 DataFrame 和执行 SQL 的入口,创建 DataFrame
有三种方式:通过 Spark 的数据源进行创建;从一个存在的 RDD 进行转换;还可以从 Hive
Table 进行查询返回。
读取 json 文件创建 DataFrame
val df = spark.read.json("data/user.json")
对 DataFrame 创建一个临时表
df1.createOrReplaceTempView("people")
通过 SQL 语句实现查询全表
val sqlDF = spark.sql("select * from people")
展示数据:
df.show
对于 DataFrame 创建一个全局表
df1.createGlobalTempView("people1")
通过 SQL 语句实现查询全表
spark.sql("SELECT * FROM global_temp.people1").show()
spark.newSession().sql("SELECT * FROM global_temp.people1").show()
查看 DataFrame 的 Schema 信息
df.printSchema
只查看"username"列数据
df.select("username").show
查看"username"列数据以及"age+1"数据
注意:涉及到运算的时候, 每列都必须使用$, 或者采用引号表达式:单引号+字段名
df.select($"username",$"age" + 1).show
df.select('username, 'age + 1).show()
查看"age"大于"18"的数据
df.filter($"age">18).show
按照"age"分组,查看数据条数
df.groupBy("age").count.show
case class Person(name: String, age: Long)
val caseClassDS = Seq(Person("zhangsan",2)).toDS()
caseClassDS.show
val ds = Seq(1,2,3,4,5).toDS
ds.show
SparkSQL 能够自动将包含有 case 类的 RDD 转换成 DataSet,case 类定义了 table 的结 构,case 类属性通过反射变成了表的列名。Case 类可以包含诸如 Seq 或者 Array 等复杂的结构。
在 SparkSQL 中 Spark 为我们提供了两个新的数据抽象,分别是 DataFrame 和 DataSet。他们 和 RDD 有什么区别呢?
首先从版本的产生上来看:
➢ Spark1.0 => RDD
➢ Spark1.3 => DataFrame
➢ Spark1.6 => Dataset
如果同样的数据都给到这三个数据结构,他们分别计算之后,都会给出相同的结果。不
同是的他们的执行效率和执行方式。在后期的 Spark 版本中,DataSet 有可能会逐步取代 RDD和 DataFrame 成为唯一的 API 接口。
➢ RDD、DataFrame、DataSet 全都是 spark 平台下的分布式弹性数据集,为处理超大型数
据提供便利;
➢ 三者都有惰性机制,在进行创建、转换,如 map 方法时,不会立即执行,只有在遇到
Action 如 foreach 时,三者才会开始遍历运算;
➢ 三者有许多共同的函数,如 filter,排序等;
➢ 在对 DataFrame 和 Dataset 进行操作许多操作都需要这个包:
import spark.implicits._(在创建好 SparkSession 对象后尽量直接导入)
➢ 三者都会根据 Spark 的内存情况自动缓存运算,这样即使数据量很大,也不用担心会
内存溢出
➢ 三者都有分区(partition)的概念
➢ DataFrame 和 DataSet 均可使用模式匹配获取各个字段的值和类型