一、介绍
Spark Core 中,如果想要执行应用程序,需要首先构建上下文环境对象 SparkContext,Spark SQL 其实可以理解为对Spark Core 的一种封装,不仅仅在模型上进行了封装,上下文环境对象也进行了封装。
在老的版本中,SparkSQL 提供两种 SQL 查询起始点:一个叫 SQLContext,用于 Spark 自己提供的 SQL 查询;一个叫HiveContext,用于连接 Hive 的查询。
SparkSession 是 Spark 最新的 SQL 查询起始点,实质上是 SQLContext 和 HiveContext 的组合,所以在 SQLContext 和HiveContext 上可用的 API 在 SparkSession 上同样是可以使用的。SparkSession 内部封装了 SparkContext,所以计算实际上是由 SparkContext 完成的。当我们使用 spark-shell 的时候,spark 会自动的创建一个叫做 spark 的 SparkSession,就像我们以前可以自动获取到一个 sc 来表示 SparkContext。
二、DataFrame
2.1 dataframe 介绍
在 Spark 中,DataFrame 是一种以 RDD 为基础的分布式数据集,类似于传统数据库中的二维表格。DataFrame 与 RDD 的主要区别在于,前者带有 schema 元信息,即 DataFrame 所表示的二维表数据集的每一列都带有名称和类型。这使得 Spark SQL 得以洞察更多的结构信息,从而对藏于 DataFrame 背后的数据源以及作用于 DataFrame 之上的变换进行了针对性的优化,最终达到大幅提升运行时效率的目标。反观 RDD,由于无从得知所存数据元素的具体内部结构,Spark Core 只能在 stage 层面进行简单、通用的流水线优化。同时,与 Hive 类似,DataFrame 也支持嵌套数据类型(struct、array 和 map)。从 API 易用性的角度上看,DataFrame API 提供的是一套高层的关系操作,比函数式的 RDD API 要更加友好,门槛更低。
2.2 dataframe 使用
1、创建 dataframe
(1) 从 Spark 数据源进行创建
A、查看 Spark 支持创建文件的数据源格式
scala> spark.read.
csv jdbc load options parquet table textFile
format json option orc schema text
B、创建 user.json 文件
[root@hadoop151 data]# cat user.json
{
"username":"zhangsan","age":20}
C、读取 json 文件创建 dataframe
scala> var df = spark.read.json("/opt/module/spark/data/user.json")
df: org.apache.spark.sql.DataFrame = [age: bigint, username: string]
+---+--------+
|age|username|
+---+--------+
| 20|zhangsan|
+---+--------+
(2) 从 RDD 进行转换
(3) 从 Hive Table 进行查询返回
2、SQL 语法
SQL 语法风格是指我们查询数据的时候使用 SQL 语句来查询,这种风格的查询必须有临时视图或者全局视图来辅助。
A、读取 JSON 文件创建 DataFrame
scala> val df = spark.read.json("/opt/module/spark/data/user.json")
df: org.apache.spark.sql.DataFrame = [age: bigint, username: string]
B、对 DataFrame 创建一个临时表
scala> df.createOrReplaceTempView("people")
C、通过 SQL 语句实现查询全表
scala> val sqlDF = spark.sql("select * from people")
D、结果展示
scala> sqlDF.show
+---+--------+