1.概述
Spark SQL 是一层依赖Spark Core也就是基础操作的API封装出的一层组件. 和GraphX类似, 它的核心思想是解决两个问题:
- 如何把底层数据结构化. 在Spark SQL这里是结构化成表.值得一提的是,当前有Delta Lake来提供众多底层文件的接入. 这个项目的存在非常接近左耳朵耗子设想的OLAP分析工具, 上层分析不依赖底层存储. 数据的备份, 平衡, 增量更新, 优化等都应该在存储层自动完成.
- 如何对结构化数据进行计算. 在Spark SQL里, 是对SQL, 具体来说是Hive SQL标准的语句进行翻译, 解释为一系列底层的Map Reduce操作然后进行执行.
Spark SQL 暴露出多种接口
- 基于
DataSet
的方法调用接口 - 直接执行类HIVE的SQL语句
- 在流上的
Structure Streaming API
- Thrift Client直接连进来跑SQL也没有问题. HIVE on Spark是很多公司的部署方式
Spark SQL 支持多种函数
- 大部分HIVE有的标准函数, 当然也支持UDF等等
- 聚合函数, 当然也就支持对应的UDAF
- 窗口函数
2.1 编程接口DataSet
DataSet
是一个新的抽象接口, 非常类似RDD
, 它暴露出各种类SQL的action
和transform
语句.
下面是一个具体的例子
// 定义一个对象
case class Person(name: String, age: Int)
// 新建一个RDD
import org.apache.spark.rdd.RDD
val peopleRDD: RDD[Person] = sc.parallelize(Seq(Person("Jacek", 10)))
// 自动RDD转DataSet
scala> val people = peopleRDD.toDS
people: org.apache.spark.sql.Dataset[Person] = [name: string, age: int]
// 可以跑各种接口了
scala> val teenagers = people.where('age >= 10).where('age <= 19).select('name).as[Str
ing]
teenagers: org.apache.spark.sql.Dataset[String] = [name: string]
scala> teenagers.show
+-----+
| name|
+-----+
|Jacek|
+-----+
// 把它注册成一个临时表
people.createOrReplaceTempView("people")
// 传统SQL一样可以工作
val teenagers = sql("SELECT * FROM people WHERE age >= 10 AND age <= 19")
scala> teenagers.show
+-----+---+
| name|age|
+-----+---+
|Jacek| 10|
+-----+---+
2.2 DataSet
vs DataFrame
两者在新的版本中进行了合并, DataSet
在读写底层文件, 动态绑定元数据和列的关系上进行了改进. 而且在DataBricks的文档中提到, 它对Python用户更加友好, 更加适合传统的数据分析师们使用.
网友评论