SparkSQL零基础入门第十一课:sparkSQL
没有看前面的同学可以回顾一下:
10.Spark零基础入门第十课:spark数据倾斜后怎么办??
9.Spark性能优化-开发调优
8.SparkCore 调优之内存模型
8.SparkCore 调优之内存模型
7.SparkCore 核心知识复习与核心机制详解
6.Spark共享变量之累加器和广播变量的使用!!!
5.RDD常用算子用法训练(附习题答案)(aggregateByKey与combineByKey)!!!
4.Spark Rdd常用算子和RDD必备知识
3.spark core 核心知识
2.spark 之 wordcount入门
1.spark 入门讲解
1、Spark SQL 概述
1.1、什么是 Spark SQL
Spark SQL 是 Spark 用来处理结构化数据(结构化数据可以来自外部结构化数据源也可以通 过 RDD 获取)的一个模块,它提供了一个编程抽象叫做 DataFrame 并且作为分布式 SQL 查 询引擎的作用。
外部的结构化数据源包括 JSON、Parquet(默认)、RMDBS、Hive 等。当前 Spark SQL 使用 Catalyst 优化器来对 SQL 进行优化,从而得到更加高效的执行方案。并且可以将结果存储到外部系 统。
1.2、为什么要学习 Spark SQL
我们已经学习了 Hive,它是将 Hive SQL 转换成 MapReduce 然后提交到集群上执行,大大简 化了编写 MapReduce 的程序的复杂性,由于 MapReduce 这种计算模型执行效率比较慢。所 以 Spark SQL 就应运而生,它的工作机制是将 Spark SQL 的 SQL 查询转换成 Spark Core 的应 用程序,然后提交到集群执行,执行效率非常快!
sha
Spark SQL 的特点:
1.容易整合
2.统一的数据访问方式
3.兼容Hive
4.标准的数据连接
2、SparkSession
SparkSession 是 Spark-2.0 引如的新概念。SparkSession 为用户提供了统一的切入点,来让用 户学习 Spark 的各项功能。
在 Spark 的早期版本中,SparkContext 是 Spark 的主要切入点,由于 RDD 是主要的 API,我 们通过 sparkContext来创建和操作 RDD。对于每个其他的 API,我们需要使用不同的 context。 例如:
对于 Spark Streaming,我们需要使用 StreamingContext
对于 Spark SQL,使用 SQLContext
对于 Hive,使用 HiveContext
但是随着 DataSet 和 DataFrame 的 API 逐渐成为标准的 API,就需要为他们建立接入点。所 以在 Spark2.0 中,引入 SparkSession 作为 DataSet 和 DataFrame API 的切入点,SparkSession 封装了 SparkConf、SparkContext 和 SQLContext。为了向后兼容,SQLContext 和 HiveContext 也被保存下来。
SparkSession 实质上是 SQLContext 和 HiveContext 的组合,所以在 SQLContext 和 HiveContext 上可用的 API 在 SparkSession 上同样是可以使用的。SparkSession 内部封装了 SparkContext, 所以计算实际上是由 SparkContext 完成的。
特点:
---- 为用户提供一个统一的切入点使用 Spark 各项功能
---- 允许用户通过它调用 DataFrame 和 Dataset 相关 API 来编写程序
---- 减少了用户需要了解的一些概念,可以很容易的与 Spark 进行交互
---- 与 Spark 交互之时不需要显示的创建 SparkConf、SparkContext 以及 SQlContext,这些对 象已经封闭在 SparkSession 中
---- SparkSession 提供对 Hive 特征的内部支持:用 HiveQL 写 SQL 语句,访问 Hive UDFs,从 Hive 表中读取数据。
SparkSession 的创建:
//scala代码:
val spark = SparkSession.builder()
.master("local[2]")
.appName("_02SparkSQLUDFOps")
// .enableHiveSupport()
.getOrCreate()
3、RDD/DataFrame/DataSet
3.1、RDD 的局限性
RDD 仅表示数据集,RDD 没有元数据,也就是说没有字段语义定义 RDD 需要用户自己优化程序,对程序员要求较高
从不同数据源读取数据相对困难,读取到不同格式的数据都必须用户自己定义转换方式 合并多个数据源中的数据也较困难
3.2、什么是 DataFrame
首先回忆一下之前的 SparkCore 的 RDD 编程: Spark Core 编程:
1)首先要找到程序入口(SparkContext)
2)通过程序入口构建一个 RDD(核心的抽象 RDD)
3)对写 RDD 进行 Transformation 或者 Action 的操作
4)对最后的结果进行处理(输出或者存入数据库等)
由于 RDD 的局限性,Spark 产生了 DataFrame。
其中 Schema 是就是元数据,是语义描述信息。 在 Spark1.3 之前,DataFrame 被称为 SchemaRDD。以行为单位构成的分布式数据集合,按 照列赋予不同的名称。对 select、fileter、aggregation 和 sort 等操作符的抽象。
DataFrame = RDD+Schema = SchemaRDD
内部数据无类型,统一为 Row DataFrame 是一种特殊类型的 Dataset,DataSet[Row] = DataFrame DataFrame 自带优化器 Catalyst,可以自动优化程序 DataFrame 提供了一整套的 Data Source API
DataFrame 的官方解释:
http://spark.apache.org/docs/latest/sql-programming-guide.html#datasets-and-dataframes
与 RDD 类似,DataFrame 也是一个分布式数据容器。然而 DataFrame 更像传统数据库的二维 表格,除了数据以外,还记录数据的结构信息,即 Schema。同时,与 Hive 类似,DataFrame 也支持嵌套数据类型(struct、array 和 map)。从 API 易用性的角度上 看,DataFrame API 提供的是一套高层的关系操作,比函数式的 RDD API 要更加友好,门槛更低。由于与 R 和 Pandas 的 DataFrame 类似,Spark DataFrame 很好地继承了传统单机数据分析的开发体验。
DataFrame 特点:
1、Ability to scale from kilobytes of data on a single laptop to petabytes on a large cluster(支持 单机 KB 级到集群 PB 级的数据处理)
2、Support for a wide array of data formats and storage systems(支持多种数据格式和存储系 统)
3、State-of-the-art optimization and code generation through the Spark SQL Catalyst optimizer (通过 Spark SQL Catalyst 优化器可以进行高效的代码生成和优化)
4、Seamless integration with all big data tooling and infrastructure via Spark(能够无缝集成所 有的大数据处理工具)
5、APIs for Python, Java, Scala, and R (in development via SparkR)(提供 Python, Java, Scala, R 语言 API)
Spark SQL 编程:
1)首先要找到程序入口(SQLContext),新版本 Spark-2.x 之后寻找 SparkSession
2)通过程序入口构建一个 DataFrame(核心的抽象 DataFrame)
3)对 DataFrame 做各种操作。最重要就是编写 SQL 语句
4)对得到的结果数据进行处理(打印输出或者存入数据库等
3.3、DataSet 的产生
由于 DataFrame 的数据类型统一是 Row,所以 DataFrame 也是有缺点的。
Row 运行时类型检查,比如 salary 是字符串类型,下面语句也只有运行时才进行类型检查。
dataframe.filter("salary>1000").show()
明显的缺点:
1、Row 不能直接操作 domain 对象
2、函数风格编程,没有面向对象风格的 API
所以,Spark SQL 引入了 Dataset,扩展了 DataFrame API,提供了编译时类型检查,面向对 象风格的 API。
Dataset 可以和 DataFrame、RDD 相互转换。DataFrame=Dataset[Row] 可见 DataFrame 是一种特殊的 Dataset。
3.4、为什么需要 DataFrame 和 Dataset
我们知道 Spark SQL 提供了两种方式操作数据:
1.SQL 查询
2.DataFrame 和 Dataset API
既然 Spark SQL 提供了 SQL 访问方式,那为什么还需要 DataFrame 和 Dataset 的 API 呢? 这是因为 SQL 语句虽然简单,但是 SQL 的表达能力却是有限的(所以 Oracle 数据库提供了 PL/SQL)。 DataFrame 和 Dataset 可以采用更加通用的语言(Scala 或 Python)来表达用户的
查询请求。此外,Dataset 可以更快捕捉错误,因为 SQL 是运行时捕获异常,而 Dataset 是 编译时检查错误。
3.5、Spark SQL 程序基本编写步骤
1.创建SparkSession对象
SparkSession 封装了 Spark SQL 执行环境信息,是所有 Spark SQL 程序唯一的入口。 // 构建 SparkSQL 程序的编程入口对象 SparkSession
val sparkSession:SparkSession = SparkSession.builder()
.appName("MyFirstSparkSQL")
.config("someKey", "someValue")
.master("local")
.getOrCreate()
2、创建 DataFrame 或 Dataset
Spark SQL 支持多种数据源,包括常见的 JSON,JDBC,Parquet,HDFS,提供了读写各种格式 数据的 API
3、在 DataFrame 或 Dataset 之上进行转换和 Action
Spark SQL 提供了多钟转换和 Action 函数
**4、返回结果 **
保存结果到 HDFS 中,或直接打印出来
3.6、创建 DataFrame
1、在本地创建一个文件,有五列,分别是 id、name、sex、age、department,用空格分隔, 然后上传到 HDFS 上
hdfs dfs -put student.txt /student
2、在 spark shell 执行下面命令,读取数据,将每一行的数据使用列分隔符分割
val lineRDD = sc.textFile("hdfs://myha01/student/student.txt").map(_.split(","))
3、定义 case class(相当于表的 schema)
case class Student(id:Int, name:String, sex:String, age:Int, department:String)
4、将 RDD 和 case class 关联
val studentRDD = lineRDD.map(x => Student(x(0).toInt, x(1), x(2), x(3).toInt, x(4)))
5、将 RDD 转换成 DataFrame Spark-2.3 :
val studentDF = spark.createDataFrame(studentRDD) Spark-1.6 : val studentDF = studentRDD.toDF
6、对 DataFrame 进行处理
studentDF.show studentDF.printSchema
7、结果验证 如果使用 Spark-2.3.0 版本:
记得点赞加关注!!! 不迷路 !!!
人活着真累:上车得排队,爱你又受罪,吃饭没香味,喝酒容易醉,挣钱得交税!