spark-SOL简介

Spark-SQL 简介

一.Spark-SQL是什么

Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块

二.Hive and SparkSQL

SparkSQL 的前身是 Shark,Shark是给熟悉 RDBMS 但又不理解 MapReduce 的技术人员提供的快速上手的工具

Shark 的出现,使得 SQL-on-Hadoop 的性能比 Hive 有了 10-100 倍的提高

三.Spark-SQL 特点

易整合。无缝的整合了 SQL 查询和 Spark 编程

统一的数据访问。使用相同的方式连接不同的数据源

兼容 Hive。在已有的仓库上直接运行 SQL 或者 HQL

标准数据连接。通过 JDBC 或者 ODBC 来连接

四.DataFrame 是什么

左侧的 RDD[Person]虽然以 Person 为类型参数,但 Spark 框架本身不了解 Person 类的内 部结构。而右侧的 DataFrame 却提供了详细的结构信息,使得 Spark SQL 可以清楚地知道 该数据集中包含哪些列,每列的名称和类型各是什么。 DataFrame 是为数据提供了 Schema 的视图。可以把它当做数据库中的一张表来对待 DataFrame 也是懒执行的,但性能上比 RDD 要高,主要原因:优化的执行计划,即查询计 划通过 Spark catalyst optimiser 进行优化

五.DataSet 是什么

DataSet 是 DataFrame API 的一个扩展,是 SparkSQL 最新的数据抽象

用户友好的 API 风格,既具有类型安全检查也具有 DataFrame 的查询优化特性;

用样例类来对 DataSet 中定义数据的结构信息,样例类中每个属性的名称直接映射到 DataSet 中的字段名称;

DataSet 是强类型的。比如可以有 DataSet[Car],DataSet[Person]。

DataFrame 是 DataSet 的特列,DataFrame=DataSet[Row] ,所以可以通过 as 方法将 DataFrame 转换为 DataSet。Row 是一个类型,跟 Car、Person 这些的类型一样,所有的表结构信息都用 Row 来表示。获取数据时需要指定顺序

Spark-SQL 核心编程(一)

一.创建 DataFrame

在 spark 的 bin/data 目录中创建 user.json 文件

{"username":"zhangsan","age":20}

{"username":"lisi","age":17}

SQL 语法

SQL 语法风格是指我们查询数据的时候使用 SQL 语句来查询,这种风格的查询必须要有临时视图或者全局视图来辅助

读取 JSON 文件创建 DataFrame

对 DataFrame 创建一个临时表

通过 SQL 语句实现查询全表

结果展示

DSL 语法

创建一个 DataFrame

查看 DataFrame 的 Schema 信息

只查看"username"列数据

查看"username"列数据以及"age+1"数据

查看"age"大于"18"的数据

按照"age"分组,查看数据条数

RDD 转换为 DataFrame

在 IDEA 中开发程序时,如果需要 RDD 与 DF 或者 DS 之间互相操作,那么需要引入 import spark.implicits._ 这里的 spark 不是 Scala 中的包名,而是创建的 sparkSession 对象的变量名称,所以必 须先创建 SparkSession 对象再导入。这里的 spark 对象不能使用 var 声明,因为 Scala 只支持 val 修饰的对象的引入。

spark-shell 中无需导入,自动完成此操作。

实际开发中,一般通过样例类将 RDD 转换为 DataFrame

sc.makeRDD(List(("zhangsan",30), ("lisi",40))).map(t=>User(t._1, t._2)).toDF.show

DataFrame 转换为 RDD

DataFrame 其实就是对 RDD 的封装,所以可以直接获取内部的 RDD

创建 DataSet

使用样例类序列创建 DataSet

使用基本类型的序列创建 DataSet

RDD 转换为 DataSet

SparkSQL 能够自动将包含有 case 类的 RDD 转换成 DataSet,case 类定义了 table 的结 构,case 类属性通过反射变成了表的列名。Case 类可以包含诸如 Seq 或者 Array 等复杂的结构。

DataFrame 和 DataSet 转换

DataSet 转换为 DataFrame

RDD 、DataFrame、DataSet 三者的关系

Spark1.0 => RDD

Spark1.3 => DataFrame

Spark1.6 => Dataset

三者的共性

RDD、DataFrame、DataSet 全都是 spark 平台下的分布式弹性数据集,为处理超大型数

据提供便利;

三者都有惰性机制,在进行创建、转换,如 map 方法时,不会立即执行,只有在遇到

Action 如 foreach 时,三者才会开始遍历运算;

三者有许多共同的函数,如 filter,排序等;

在对 DataFrame 和 Dataset 进行操作许多操作都需要这个包:

import spark.implicits._(在创建好 SparkSession 对象后尽量直接导入)

三者都会根据 Spark 的内存情况自动缓存运算,这样即使数据量很大,也不用担心会

内存溢出

三者都有分区(partition)的概念

DataFrame 和 DataSet 均可使用模式匹配获取各个字段的值和类型

三者的区别

RDD

RDD 一般和 spark mllib 同时使用

RDD 不支持 sparksql 操作

  1. DataFrame

与 RDD 和 Dataset 不同,DataFrame 每一行的类型固定为Row,每一列的值没法直

访问,只有通过解析才能获取各个字段的值

DataFrame 与 DataSet 一般不与 spark mllib 同时使用

DataFrame 与 DataSet 均支持 SparkSQL 的操作,比如 select,groupby 之类,还能

注册临时表/视窗,进行 sql 语句操作

DataFrame 与 DataSet 支持一些特别方便的保存方式,比如保存成 csv,可以带上表

头,这样每一列的字段名一目了然

  1. DataSet

Dataset 和 DataFrame 拥有完全相同的成员函数,区别只是每一行的数据类型不同。

DataFrame 其实就是 DataSet 的一个特例 type DataFrame = Dataset[Row]

DataFrame 也可以叫 Dataset[Row],每一行的类型是 Row

相关推荐
Elastic 中国社区官方博客1 分钟前
Elasticsearch:AI 助理 - 从通才到专才
大数据·数据库·人工智能·神经网络·elasticsearch·搜索引擎·全文检索
CopyLower1 小时前
Elasticsearch 查询优化:从原理到实践的全面指南
大数据·elasticsearch·搜索引擎
Gvemis⁹1 小时前
Spark-SQL
大数据·sql·spark
计算机视觉小刘2 小时前
DISTRIBUTED PRIORITIZED EXPERIENCE REPLAY(分布式优先级体验回放)论文阅读
论文阅读·分布式·强化学习
掘金-我是哪吒2 小时前
分布式微服务系统架构第107集:Netty开发,模拟报文生成器代码
分布式·微服务·云原生·架构
落寞的魚丶5 小时前
2022年全国职业院校技能大赛 高职组 “大数据技术与应用” 赛项赛卷(3卷)任务书
大数据·高职组·2022全国职业技能大赛·大数据技术与应用
神奇的黄豆7 小时前
spark-sql学习内容总结
大数据·sql·spark
程序猿阿伟8 小时前
《分布式软总线牵手云服务,拓展应用新维度》
分布式
恒拓高科WorkPlus8 小时前
BeeWorks:打造安全可控的企业内网即时通讯平台
大数据·人工智能·安全
恒拓高科WorkPlus10 小时前
一款安全好用的企业即时通讯平台,支持统一门户
大数据·人工智能·安全