第五章总结Spark sql

目录

Spark SQL

一.Spark SQL基本概念

1.Spark SQL的简介

2.Spark SQL架构 

3.Spark SQL工作流程:

二.DataFrame概述 

1.DataFrame简介

2,DataFrame的创建

1.数据准备

2.通过文件直接创建DataFrame

​编辑3.RDD直接转换为DataFrame 

三.DataFrame的常用操作

1. 操作DataFrame

2. SQL风格操作DataFrame

1. 将DataFrame注册成一个临时表

2. 查询年龄最大的前两名人的信息

3. 查询年龄大于25的人的信息 

四.Dataset概述

1.RDD、DataFrame及Dataset的区别

2.Dataset对象的创建 

(1)通过SparkSession中的createDataset来创建Dataset

(2)DataFrame通过“as[ElementType]”方法转换得到Dataset 

四.RDD转换DataFrame

1.反射机制推断Schema


Spark SQL

一.Spark SQL基本概念

1.Spark SQL的简介

Spark SQL主要提供了以下三个功能: Spark SQL可从各种结构化数据源中读取数据,进行数据分析。 Spark SQL包含行业标准的JDBC和ODBC连接方式,因此它不局限于在Spark程序内使用SQL语句进行查询。 Spark SQL可以无缝地将SQL查询与Spark程序进行结合,它能够将结构化数据作为Spark中的分布式数据集(RDD)进行查询。

2.Spark SQL架构 

Spark SQL架构与Hive架构相比,把底层的MapReduce执行引擎更改为Spark,还修改了Catalyst优化器,Spark SQL快速的计算效率得益于Catalyst优化器。从HiveQL被解析成语法抽象树起,执行计划生成和优化的工作全部交给Spark SQL的Catalyst优化器进行负责和管理。 

Spark要想很好地支持SQL,需要完成解析(Parser)、优化(Optimizer)、执行(Execution)三大过程。 

Catalyst优化器在执行计划生成和优化的工作时,离不开内部的五大组件。

SqlParse:完成SQL语法解析功能,目前只提供了一个简单的SQL解析器。 Analyze:主要完成绑定工作,将不同来源的Unresolved LogicalPlan和元数据进行绑定,生成Resolved LogicalPlan。 Optimizer:对Resolved Lo;gicalPlan进行优化,生成OptimizedLogicalPlan。 Planner:将LogicalPlan转换成PhysicalPlan。 CostModel:主要根据过去的性能统计数据,选择最佳的物理执行计划。

3.Spark SQL工作流程:

(1)下在解析SQL语句之前,会创建SparkSession,涉及到表名、字段名称和字段类型的元数据都将保存在SessionCatalog中;

(2)当调用SparkSession的sql()方法时就会使用SparkSqlParser进行解析SQL语句,解析过程中使用的ANTLR进行词法解析和语法解析;

(3)使用Analyzer分析器绑定逻辑计划,在该阶段,Analyzer会使用Analyzer Rules,并结合SessionCatalog,对未绑定的逻辑计划进行解析,生成已绑定的逻辑计划;

(4)使用Optimizer优化器优化逻辑计划,该优化器同样定义了一套规则(Rules),利用这些规则对逻辑计划和语句进行迭代处理;

(5)使用SparkPlanner对优化后的逻辑计划进行转换,生成可以执行的物理计划SparkPlan;

(6)使用QueryExecution执行物理计划,此时则调用SparkPlan的execute()方法,返回RDDs。 

二.DataFrame概述 

1.DataFrame简介

Spark SQL使用的数据抽象并非是RDD,而是DataFrame。 在Spark 1.3.0版本之前,DataFrame被称为SchemaRDD。 DataFrame使Spark具备处理大规模结构化数据的能力。 在Spark中,DataFrame是一种以RDD为基础的分布式数据集。 DataFrame的结构类似传统数据库的二维表格,可以从很多数据源中创建,如结构化文件、外部数据库、Hive表等数据源。

DataFrame可以看作是分布式的Row对象的集合,在二维表数据集的每一列都带有名称和类型,这就是Schema元信息,这使得Spark框架可获取更多数据结构信息,从而对在DataFrame背后的数据源以及作用于DataFrame之上数据变换进行针对性的优化,最终达到提升计算效率。

2,DataFrame的创建

创建DataFrame的两种基本方式: 已存在的RDD调用toDF()方法转换得到DataFrame。 通过Spark读取数据源直接创建DataFrame。

若使用SparkSession方式创建DataFrame,可以使用spark.read从不同类型的文件中加载数据创建DataFrame。spark.read的具体操作,在创建Dataframe之前,为了支持RDD转换成Dataframe及后续的SQL操作,需要导入import.spark.implicits._包启用隐式转换。若使用SparkSession方式创建Dataframe,可以使用spark.read操作,从不同类型的文件中加载数据创建DataFrame,

1.数据准备

在HDFS文件系统中的/spark目录中有一个person.txt文件,内容如下:

1 zhangsan 20 2 lisi 29 3 wangwu 25 4 zhaoliu 30 5 tianqi 35 6 jerry 40 

2.通过文件直接创建DataFrame

scala > val personDF = spark.read.text("/spark/person.txt") personDF: org.apache.spark.sql.DataFrame = [value: String] scala > personDF.printSchema() root  |-- value: String (Nullable = true)

3.RDD直接转换为DataFrame 

scala > val lineRDD = sc.textFile("/spark/person.txt").map(_.split(" ")) lineRDD: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[6] at map at <console>:24 scala > case class Person(id:Int,name:String,age:Int) defined class Person scala > val personRDD = lineRDD.map(x => Person(x(0).toInt, x(1), x(2).toInt)) personRDD: org.apache.spark.rdd.RDD[Person] = MapPartitionsRDD[7] at map at <console>:27 scala > val personDF = personRDD.toDF() personDF: org.apache.spark.sql.DataFrame = [id: int, name: string ... 1 more field]

三.DataFrame的常用操作

1. 操作DataFrame

Dataframe提供了两种谮法风格,即DSL风格语法和SQL风格语法,二者在功能上并无区别,仅仅是根据用户习惯自定义选择操作方式。接下来,我们通过两种语法风格,分讲解Dstaframe操作的具体方法。 一.DSL风格操作 DataFrame提供了一个领域特定语言(DSL)以方便操作结构化数据,下面将针对DSL操作风格,讲解DataFrame 常用操作示例, 1.show():查看DataFrame中的具体内容信息 2.pritSchema0:查看0staFrame的Schema信息 3.select():查看DataFmame中造取部分列的数据, 下面演示查看xixiDF对象的name字段数据,具体代码如下所示

2. SQL风格操作DataFrame

1. 将DataFrame注册成一个临时表

2. 查询年龄最大的前两名人的信息

scala > spark.sql("select * from t_xixi order by age desc limit 2").show() +---+------+---+ | id|  name|age| +---+------+---+ |  6| jerry| 40| |  5|tianqi| 35| +---+------+---+

3. 查询年龄大于25的人的信息 

scala > spark.sql("select * from t_xixi where age > 25").show() +---+-------+---+ | id   |  name |age| +---+-------+---+ |  2   |   lisi     | 29  | |  4   | zhaoliu| 30 | |  5   | tianqi  | 35  | |  6   |  jerry   | 40  | +---+-------+---+

四.Dataset概述

1.RDD、DataFrame及Dataset的区别

RDD数据的表现形式,即序号

(1),此时RDD数据没有数据类型和元数据信息。 DataFrame数据的表现形式,

即序号(2),此时DataFrame数据中添加Schema元数据信息(列名和数据类型,如ID:String),DataFrame每行类型固定为Row类型,每列的值无法直接访问,只有通过解析才能获取各个字段的值。

Dataset数据的表现形式,序号(3)和(4),其中序号(3)是在RDD每行数据的基础之上,添加一个数据类型(value:String)作为Schema元数据信息。而序号(4)每行数据添加People强数据类型,在Dataset[Person]中里存放了3个字段和属性,Dataset每行数据类型可自定义,一旦定义后,就具有错误检查机制。 

2.Dataset对象的创建 

(1)通过SparkSession中的createDataset来创建Dataset

 

(2)DataFrame通过“as[ElementType]”方法转换得到Dataset 

四.RDD转换DataFrame

Spark官方提供了两种方法实现从RDD转换得到DataFrame。 第一种方法是利用反射机制来推断包含特定类型对象的Schema,这种方式适用于对已知数据结构的RDD转换 第二种方法通过编程接口构造一个Schema,并将其应用在已知的RDD数据中。

1.反射机制推断Schema

(1).创建Maven工程。 打开IDEA开发工具,创建名为“spark_chapter04”的Maven工程。

(2)添加依赖。在pom.xml文件中添加Spark SQL依赖。 

(3)定义case class样例类、字段和属性,样例类的参数名会被利用反射机制作为列名。通过sc对象读取文件生成一个RDD,将RDD 与样例类匹配,调用toDF()方法将RDD转换为DataFrame。

1.创建Maven工程。 拉依赖

  • 26
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值