当前位置: 首页 > news >正文

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 操作

2) DataFrame

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

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

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

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

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

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

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

3) DataSet

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

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

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

 

相关文章:

  • OpenHarmony - 小型系统内核(LiteOS-A)(二)
  • 4.12~4.14【Q】cv homework6
  • 鼎讯信通 短波通信干扰设备的系统概述、功能指标及性能指标总结
  • STM32 BOOT设置,bootloader,死锁使用方法
  • newbee商城购物车模块mapper.xml
  • [1-01-09].第08节:基础语法 - 数组常见算法 + Arrays工具类 + 数组中常见异常
  • 深入探究 GRU 模型:梯度爆炸问题剖析
  • 统计销量前十的订单
  • 前端面试宝典---闭包
  • Spring AOP 学习笔记 之 常用注解
  • 数据库表设计: 批次首件检验单(自定义表单)
  • Activiti(六)- 启动、挂起、激活,查询及删除流程实例
  • Why does Java‘s hashCode() in String use 31 as a multiplier?
  • AT_abc398_e [ABC398E] Tree Game 题解
  • LLM做逻辑推理题 - 三人贴纸条游戏
  • STM32 HAL实现DHT11采集温湿度
  • 大模型面经 | DeepSeek-R1中提到的思维链(Chain of Thought,CoT)是什么?
  • 如何通过Radius认证服务器实现虚拟云桌面安全登录认证:安当ASP身份认证系统解决方案
  • 鼎讯信通 便携式雷达信号模拟器:打造复杂电磁环境的“全能型选手”
  • 突破亚马逊壁垒,Web Unlocker API 助您轻松获取数据
  • 中国围棋协会将不组队参加今年的LG杯世界棋王赛
  • 我国已顺利实施20次航天员出舱活动,达到国际先进水平
  • 国防部发布、中国军号及多家央媒官博发祝福海报:人民海军76岁生日快乐
  • 助力中国足球未来,香港赛马会鼎力支持U15国少选拔队赴英训练
  • 光影连接世界,中国企业出海绘就城市新名片
  • 三江购物:因自身商业需要,第二大股东阿里泽泰拟减持不超3%公司股份