1 Spark SQL 简介

1.概述

Spark SQL 是一层依赖Spark Core也就是基础操作的API封装出的一层组件. 和GraphX类似, 它的核心思想是解决两个问题:

  1. 如何把底层数据结构化. 在Spark SQL这里是结构化成表.值得一提的是,当前有Delta Lake来提供众多底层文件的接入. 这个项目的存在非常接近左耳朵耗子设想的OLAP分析工具, 上层分析不依赖底层存储. 数据的备份, 平衡, 增量更新, 优化等都应该在存储层自动完成.
  2. 如何对结构化数据进行计算. 在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的actiontransform语句.

1 Spark SQL 简介_第1张图片
DataSet 执行流程概览

下面是一个具体的例子

// 定义一个对象
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用户更加友好, 更加适合传统的数据分析师们使用.

1 Spark SQL 简介_第2张图片
区别

你可能感兴趣的:(1 Spark SQL 简介)