大数据学习之SparkSql
95.SPARKSQL_简介
网址: https://spark.apache.org/sql/
Spark SQL 是 Spark 的一个模块,用于处理 结构化的数据 。
SparkSQL 特点
1
易整合
无缝的整合了 SQL 查询和 Spark 编程,随时用 SQL 或
DataFrame API 处理结构化数据。并且支持多语言 Java 、
Scala 、 Python 、 R 。
2
统一的数据访问
使用相同的方式连接不同的数据源或不同的文件格式中的数
据。
3
兼容 Hive
在已有的数据仓库上直接运行 SQL 或者 HiveQL ,也可以使
用 SparkSQL 直接处理数据并生成 Hive 数据表。
1 4
标准的数据连接
支持标准化的 JDBC\ODBC 连接 , 方便和各种数据进行数据交换
实时效果反馈
1. 关于 SparkSQL 特点的描述,错误的是:
A
易整合:无缝的整合了 SQL 查询和 Spark 编程,随时用
SQL 或 DataFrame API 处理结构化数据。并且支持多语言 Java 、
Scala 、 Python 、 R 。
B
统一的数据访问:使用相同的方式连接不同的数据源或不同
的文件格式中的数据。
C
不兼容 Hive 。
D
支持标准化的 JDBC\ODBC 连接 , 方便和各种数据进行数据交
换。
答案:
1=>C 兼容 Hive
96.SPARKSQL_发展史
Hive 是早期唯一运行在 Hadoop 上的 SQL-on-Hadoop 工具。但
是 MapReduce 计算过程中大量的中间磁盘落地过程消耗了大量的
I/O ,降低的运行效率,为了提高 SQL-on-Hadoop 的效率,大量的
SQL-on-Hadoop 工具开始产生,其中表现较为突出的是: Impala 、
Shark 、 Drill 。
其中 Shark 是伯克利实验室 Spark 生态环境的组件之一,是基于
Hive 所开发的工具。 Shark 对于 Hive 的太多依赖,制约了 Spark 各个
组件的相互集成,所以提出了 SparkSQL 项目。
SparkSQL 抛弃原有 Shark 的代码,汲取了 Shark 的一些优点,
如内存列存储( In-Memory Columnar Storage )、 Hive 兼容性
等,重新开发了 SparkSQL 代码;由于摆脱了对 Hive 的依赖性,
SparkSQL 无论在数据兼容、性能优化、组件扩展方面都得到了极大
的方便。
相关时间节点
1
2014 年 1.0 正式发布, Shark 项目和 SparkSQL 项目的主持人
Reynold Xin 宣布:停止对 Shark 的开发,团队将所有资源放
SparkSQL 项目上,至此, Shark 的发展画上了句话,但也因
此发展出两个支线: SparkSQL 和 Hive on Spark 。
3 2
2015 年 1.3 发布 DataFrame 数据结构 , 沿用至今
3
2016 年 1.6 发布 Dataset 数据结构 ( 带泛型的 DataFrame), 适
用于支持泛型的语言 Java 、 Scala
4
2016 年 2.0 统一了 Dataset 和 DataFrame, 以后只有 Dataset
了 , Python 用的 DataFrame 就是没有泛型的 Dataset 。
5
2019 年 3.0 发布, 性能大幅度提升, SparkSQL 变化不大。
6
2021 年 3.2 发布,支持 Java 、 Python 、 Scala 、 R
总结:
SparkSQL 用于处理大规模结构化数据的计算引擎
1
SparkSQL 在企业中广泛使用,并性能极好。
2
SparkSQL :使用简单、 API 统一、兼容 HIVE 、支持标准化 JDBC 和 ODBC 连接
3
SparkSQL 2014 年正式发布,当下使用最多的 2.3 版
4
Spark 发布于 2016 年,当下使用的最新 3.2.1 办发布于 2022 年
97.SPARKSQL_与HIVE区别
98.SPARKSQL_SPARKSESSION
99.SPARKSQL_数据抽象
100.SPARKSQL_DATAFRAME概述
101.SPARKSQL_DATASET概述
102.SPARKSQL_DATAFRAME构成
103.SPARKSQL_创建项目
104.SPARKSQL_createDataFrame创建DF
package com . itbaizhan . sql
import org . apache . spark . SparkConf
import org . apache . spark . rdd . RDD
import org . apache . spark . sql . types .
{ IntegerType , StringType , StructField ,
StructType }
import org . apache . spark . sql .{ DataFrame , Row ,
SparkSession }
1
2
3
4
5
6
7
15 object CreateDataFrame {
def main ( args : Array [ String ]): Unit = {
//1. 创建上下文配置文件对象
val conf = new
SparkConf (). setMaster ( "local[*]" )
. setAppName ( "CreateDataFrame" )
//2. 创建执行环境入口 SparkSession 对象
val spark : SparkSession =
SparkSession . builder ()
. config ( conf ). getOrCreate ()
//3. 读取文件,映射创建 RDD[Row] 对象
val rdd : RDD [ Row ] = spark . sparkContext
. textFile ( "data/sql/student.txt" )
. map ( _ . split ( "," ))
. map ( array => Row ( array ( 0 ). toInt ,
array ( 1 ). trim , array ( 2 ). toInt ))
//4. 定义 StructType 对象,指定所有列名和各自的类
型
val schema : StructType = StructType (
StructField ( "id" , IntegerType , false )
::
StructField ( "name" , StringType ,
false ) ::
StructField ( "age" , IntegerType ,
true ) :: Nil )
//5. 基于 rdd 对象转为 DataFrame
val df : DataFrame =
spark . createDataFrame ( rdd , schema )
//6. 打印 df 的表结构信息
df . printSchema ()
//7. 输出 df 中的数据
df . show ()
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
16 运行输出:
SparkSQL_toDF创建DF
将 RDD 转换为 DataFrame :使用 RDD 的 toDF 方法转换 RDD
// 关闭
spark . stop ()
}
}
32
33
34
35
# 打印 DataFrame 的表结构
root
|-- id: long (nullable = true)
|-- name: string (nullable = true)
|-- age: long (nullable = true)
#df 中的数据
+---+-----+---+
|id |name |age|
+---+-----+---+
|1 |tom |22 |
|2 |lucy |21 |
|3 |peter|23 |
|4 |john |25 |
+---+-----+---+
![](https://i-blog.csdnimg.cn/direct/f48fa8954a73467389335c49342b25a5.png)
105.SPARKSQL_toDF创建DF
在 IDEA 中开发程序时,如果需要 RDD 与 DF 或者 DS 之间互相转
换操作,那么需要引入
import spark.implicits._
package com . itbaizhan . sql
import org . apache . spark . SparkConf
import org . apache . spark . rdd . RDD
import org . apache . spark . sql .{ DataFrame ,
SparkSession }
object ToDFDemo1 {
def main ( args : Array [ String ]): Unit = {
//1. 创建配置文件对象
val conf : SparkConf = new SparkConf ()
. setMaster ( "local[*]" ). setAppName ( "toDF" )
//2. 创建 SparkSession 对象
val spark : SparkSession =
SparkSession . builder (). config ( conf ). getOrCre
ate ()
//4. 添加隐式转换
import spark . implicits . _
//5. 读取本地文件,并映射创建 RDD
val rdd : RDD [( Int , String , Int )] =
spark . sparkContext
. textFile ( "data/sql/student.txt" )
//RDD[String]"1,tom,22"-
>RDD[Array[String]]
. map ( _ . split ( "," ))
//RDD[Array[String]]->RDD[(Int,
String, Int)]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
18 运行输出:
. map ( arr => ( arr ( 0 ). toInt ,
arr ( 1 ). trim , arr ( 2 ). toInt ))
//6. 通过 rdd.toDF(colNames: String*)
//val df: DataFrame = rdd.toDF()// 了解
val df : DataFrame = rdd . toDF ( "id" ,
"name" , "age" )
//7. 输出结构信息
df . printSchema ()
//8. 输出 df 中的数据
/**show(numRows: Int, truncate: Boolean)
* numRows: 表示输出数据的行数 , 默认是 20 行 .
* truncate: 表示输出时是否对列的值进行截取
* false: 表示不截取
* true: 表示截取,保留 20 个字符
*/
//df.show()
//df.show(2,false)
df . show ( 10 , false )
//3. 关闭 spark
spark . stop ()
}
}
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
19 SparkSQL_toDF 使用样例类创建 DF
实际开发中,一般通过样例类将 RDD 转换为 DataFrame
在 IDEA 中开发程序时,如果需要 RDD 与 DF 或者 DS 之间互相转
换操作,那么需要引入
import spark.implicits._
定义样例类 Student :
root
|-- id: integer (nullable = false)
|-- name: string (nullable = true)
|-- age: integer (nullable = false)
+---+-----+---+
| id| name|age|
+---+-----+---+
| 1| tom| 22|
| 2| lucy| 21|
| 3|peter| 23|
| 4| john| 25|
+---+-----+---+
![](https://i-blog.csdnimg.cn/direct/fb9b9c7b75014db88483a15905e811be.png)
106.SPARKSQL_toDF使用样例创建DF
107.SPARKSQL_DataFrame转换RDD
108.SPARKSQL_创建DATASET
109.SPARKSQL_DATASET和RDD转换
110.SPARKSQL_DATASET和DATAFRAME转换
111.SPARKSQL_读写parquet文件
https://spark.apache.org/docs/latest/sql-data-sources.html
![](https://i-blog.csdnimg.cn/direct/4aaf7afa0dde4bbc97f709e363ffa64a.png)