SparkSQL——Dataset

news2025/2/25 16:14:33

Dataset

  • Dataset 是什么?

    @Test
      def dataset1():Unit ={
        // 1. 创建 SparkSession
        val spark = new SparkSession.Builder()
          .master("local[6]")
          .appName("dataset1")
          .getOrCreate()
        // 2. 导入隐式转换
        import spark.implicits._
        // 3. 演示
        val sourceRDD = spark.sparkContext.parallelize(Seq(Person("zhangsan", 10), Person("lisi", 15)))
        val dataset:Dataset[Person] = sourceRDD.toDS()
    
        // DataSet 支持强类型的 API
        dataset.filter(item=> item.age>10).show()
        // Dataset 支持弱类型的API
        dataset.filter('age>10).show()
        dataset.filter($"age">10).show()
        // DataSet 支持 直接写 SQL 表达式
        dataset.filter("age>10").show()
      }
    
    case class Person(name: String, age: Int)
    

    问题1: Person 是什么?

    Person 是一个强类型的类

    问题2: 这个 Dataset 中是结构化的数据吗?

    非常明显是的, 因为 Person 对象中有结构信息, 例如字段名和字段类型

    问题3: 这个 Dataset 能够使用类似 SQL 这样声明式结构化查询语句的形式来查询吗?

    当然可以, 已经演示过了

    问题4: Dataset 是什么?

    Dataset 是一个强类型, 并且类型安全的数据容器, 并且提供了结构化查询 API 和类似 RDD 一样的命令式 API

  • Dataset 底层是什么

    即使使用 Dataset 的命令式 API, 执行计划也依然会被优化

    Dataset 具有 RDD 的方便, 同时也具有 DataFrame 的性能优势, 并且 Dataset 还是强类型的, 能做到类型安全.

    @Test
      def dataset2():Unit = {
        // 1. 创建 SparkSession
        val spark = new SparkSession.Builder()
          .master("local[6]")
          .appName("dataset2")
          .getOrCreate()
        // 2. 导入隐式转换
        import spark.implicits._
        // 3. 演示
        val sourceRDD = spark.sparkContext.parallelize(Seq(Person("zhangsan", 10), Person("lisi", 15)))
        val dataset: Dataset[Person] = sourceRDD.toDS()
        //优化
    		dataset.explain(true) // 查看其逻辑计划和物理计划,运行会直接打印
        
    }
    case class Person(name: String, age: Int)
    

    Dataset 的底层是什么?

    Dataset 最底层处理的是对象的序列化形式, 通过查看 Dataset 生成的物理执行计划, 也就是最终所处理的 RDD, 就可以判定 Dataset 底层处理的是什么形式的数据

    val dataset: Dataset[People] = spark.createDataset(Seq(Person("zhangsan", 10), Person("lisi", 15)))
    val internalRDD: RDD[InternalRow] = dataset.queryExecution.toRdd
    
    case class Person(name: String, age: Int)
    

    dataset.queryExecution.toRdd 这个 API 可以看到 Dataset 底层执行的 RDD, 这个 RDD 中的范型是 InternalRow, InternalRow 又称之为 Catalyst Row, 是 Dataset 底层的数据结构, 也就是说, 无论 Dataset 的范型是什么, 无论是 Dataset[Person] 还是其它的, 其最底层进行处理的数据结构都是 InternalRow
    所以, Dataset 的范型对象在执行之前, 需要通过 Encoder 转换为 InternalRow, 在输入之前, 需要把 InternalRow 通过 Decoder 转换为范型对象

    在这里插入图片描述

    可以获取 Dataset 对应的 RDD 表示

    在 Dataset 中, 可以使用一个属性 rdd 来得到它的 RDD 表示, 例如 Dataset[T] → RDD[T]

    @Test
      def dataset2():Unit = {
        // 1. 创建 SparkSession
        val spark = new SparkSession.Builder()
          .master("local[6]")
          .appName("dataset2")
          .getOrCreate()
        // 2. 导入隐式转换
        import spark.implicits._
        // 3. 演示
    //    val sourceRDD = spark.sparkContext.parallelize(Seq(Person("zhangsan", 10), Person("lisi", 15)))
    //    val dataset: Dataset[Person] = sourceRDD.toDS()
        //优化
    
        val dataset: Dataset[Person] = spark.createDataset(Seq(Person("zhangsan", 10), Person("lisi", 15)))
        //    dataset.explain(true) // 查看其逻辑计划和物理计划,运行会直接打印
        // 无论DataSet 放置的是什么类型对象,最终执行计划中的RDD 上都是InternalRow
        // 直接获取到已经分析和解析过的DataSet的执行计划,从中拿到RDD
        val executionRdd:RDD[InternalRow] = dataset.queryExecution.toRdd // 把生成的计划转为rdd
    
        //通过将DataSet 底层的RDD[InternalRow] 通过Decoder 转成了DataSet一样的类型RDD
        val typeRDD: RDD[Person] = dataset.rdd
    		// (1)
        println(executionRdd.toDebugString)
        /*
        * (2) MapPartitionsRDD[1] at toRdd at Intro.scala:97 []
        *  |  ParallelCollectionRDD[0] at toRdd at Intro.scala:97 []
        * */
        println("-------------------------")
    		// (2)// 这段代码的执行计划为什么多了两个步骤?
        println(typeRDD.toDebugString)
        /*
        * (2) MapPartitionsRDD[5] at rdd at Intro.scala:102 []
        *  |  MapPartitionsRDD[4] at rdd at Intro.scala:102 []
        *  |  MapPartitionsRDD[3] at rdd at Intro.scala:102 []
        *  |  ParallelCollectionRDD[2] at rdd at Intro.scala:102 []
        * */
    
      }
    
    case class Person(name: String, age: Int) // 放在class 外
    

    (1)Dataset 的执行计划底层的 RDD

    (2)使用 Dataset.rdd 将 Dataset 转为 RDD 的形式

    可以看到 (1) 对比 (2) 对了两个步骤, 这两个步骤的本质就是将 Dataset 底层的 InternalRow 转为 RDD 中的对象形式, 这个操作还是会有点重的, 所以慎重使用 rdd 属性来转换 Dataset 为 RDD

总结

  • Dataset 是一个新的 Spark 组件, 其底层还是 RDD
  • Dataset 提供了访问对象中某个特定字段的能力, 不用像 RDD 一样每次都要针对整个对象做操作
  • Dataset 和 RDD 不同, 如果想把 Dataset[T] 转为 RDD[T], 则需要对 Dataset 底层的 InternalRow 做转换, 是一个比价重量级的操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1391296.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单元测试之Stub和Mock

实例 Analyze类会检查filename的长度,如果小于8,我们就会使用一个实现IWebService的类来记录错误. 我们需要给Analyze方法写单元测试。 public class LogAnalyzer {private IWebService service;private IEmailService email;public IWebService Serv…

小程序基础学习(登录)(重点核心)

首先&#xff0c;获取用户获取code&#xff0c;然后带着code向服务器发送请求&#xff0c;并把返回的token存入缓存中 然后&#xff0c;判断token是否过期如果过期则要重新登录 页面代码 <!--pages/me/me.wxml--> <navigation-bar title"牧原" back"{…

计算机网络 网络安全

网络安全 网络安全问题概述 计算机网络面临的女全性威胁 计算机网络的通信而临两大类威胁&#xff0c;即被动攻击和主动攻击 被动攻击是指攻击者从网络上窃听他人的通信内容。通常把这类攻击称为截获。在被动攻击中&#xff0c;攻击者只是观察和分析某一个协议数据单元 PDU…

Unity解决Udp客户端无法接收数据的问题

Unity解决Udp客户端无法接收数据的问题 在我之前做过的项目中&#xff0c;其中不少涉及Udp客户端的项目。在这些项目中&#xff0c;一般只需要实现客户端向服务器端发送数据的功能就可以了&#xff0c;一般都不用接收服务器端发送的数据&#xff0c;但是也有同学使用了我分享的…

接近8000字的SpringSpring常用注解总结!安排

接近8000字的Spring/Spring常用注解总结&#xff01;安排 为什么要写这篇文章&#xff1f; 最近看到网上有一篇关于 SpringBoot 常用注解的文章被转载的比较多&#xff0c;我看了文章内容之后属实觉得质量有点低&#xff0c;并且有点会误导没有太多实际使用经验的人&#xff…

ceph数据分布式存储

单机存储的问题 存储处理能力不足 传统的IDE的IO值是100次/秒&#xff0c;SATA固态磁盘500次/秒&#xff0c;固态硬盘达到2000-4000次/秒。即使磁盘的IO能力再大数十倍&#xff0c;也不够抗住网站访问高峰期数十万、数百万甚至上亿用户的同时访问&#xff0c;这同时还要受到主机…

1、机器学习模型的工作方式

第一步,如果你是机器学习新手。 本课程所需数据集夸克网盘下载链接:https://pan.quark.cn/s/9b4e9a1246b2 提取码:uDzP 文章目录 1、简介2、决策树优化3、继续1、简介 我们将从机器学习模型如何工作以及如何使用它们的概述开始。如果你以前做过统计建模或机器学习,这可能感…

【机器学习】强化学习(二)基于动态规划的算法

值函数可以分为状态价值函数和动作价值函数&#xff0c;分别适用于哪些强化学习问题 二、基于动态规划的算法 2.1 策略迭代算法 示例&#xff1a; (改进的) 策略迭代 代码 首先定义了一些参数&#xff0c;如奖励、折扣因子、最大误差等&#xff0c;然后初始化了一个网格世界的环…

【JVM调优系列】如何导出堆内存文件

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【pgBackRest备份工具使用】

一、工具介绍 pgBackRest是PostgreSQL数据库的一个开源备份工具&#xff0c;支持全量、增量和差异备份。这一点优于PG原生的备份工具pg_basebackup&#xff0c;因为pg_basebackup不支持增量备份&#xff0c;并且支持备份完整性检查等等。pgBackRest v2.49是当前的稳定版本。 项…

新手怎么投稿各大网络媒体网站

在当今信息爆炸的时代&#xff0c;网络媒体已成为人们获取新闻信息的主要渠道之一。无论是企业宣传、个人推广&#xff0c;还是新闻报道&#xff0c;都离不开网络媒体的力量。而要将自己的信息传达到更广大的受众群体&#xff0c;投稿各大网络媒体网站就成为了一个重要的环节。…

ARM day2、day3 汇编

一、汇编学习&#xff1a;可以向上理解软件、向下感知硬件 二、符号&#xff08;注释&#xff09; 注释#注释&#xff08;放在行首表示注释一行&#xff09;/* */注释#数字立即数&#xff1a;一种标号&#xff08;比如main: loop:&#xff09;.text .end换行…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-9 可观测性与分离原理

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-9 可观测性与分离原理

【Java JVM】栈帧

执行引擎是 Java 虚拟机核心的组成部分之一。 在《Java虚拟机规范》中制定了 Java 虚拟机字节码执行引擎的概念模型, 这个概念模型成为各大发行商的 Java 虚拟机执行引擎的统一外观 (Facade)。 不同的虚拟机的实现中, 通常会有 解释执行 (通过解释器执行)编译执行 (通过即时编…

Servlet项目教学(附实例代码)

【员工信息管理】 1.员工信息管理 1.1 介绍 用户进行登录后,可以对员工信息进行管理(增删查改),等操作.如果用户没有登录,不能访问员工操作页面.并且员工操作页面显示当前登录用户信息. 1.2 技术点 使用VueElementUI充当前端界面,使用ServletJDBCMysql提供数据管理控制.后端统…

嵌入式学习-网络编程-Day3

思维导图 多进程并发服务器通信模型如下 void handler(int signo) {while(waitpid()>0); //以非阻塞配合信号完成僵尸进程的回收 } int main() {//将信号与信号处理函数绑定signal(SIGCHLD, handler);socket(); //创建用于连接的套接字bind(); //绑定IP…

Python和Java代码实现:切线法求解一维最优化问题

Python和Java代码实现&#xff1a;切线法求解一维最优化问题 代码实现Python代码Java代码 求解实例 根据概念查询&#xff0c;切线法定义如下&#xff1a; 切线法&#xff08;Tangent Method&#xff09;是一种用于求解非线性方程的数值方法。它也被称为牛顿法&#xff08;Newt…

C++ 程序文档生成器(doxygen)使用说明

程序文档&#xff0c;是每个程序员必看文档&#xff0c;在日常业务开发中&#xff0c;难免会封装一些组件。没有很好的组件文档&#xff0c;再好的组件都是废物&#xff0c;。因此大型业务中&#xff0c;文档和思维导图&#xff0c;两个都是必备&#xff01; 一、注释风格 …

IPv6隧道--GRE隧道

GRE隧道 通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、ATM、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。 GRE提供了将一种协议的报文封装在另一种协议报文中的机制,是一…

各种设备上恢复已删除的文件和文件夹的数据恢复软件清单

最好的数据恢复软件可以简单轻松地恢复计算机、移动设备或存储介质上已删除的文件和文件夹。 询问任何经历过数据丢失的人这是否是一种有趣的经历&#xff0c;他们会告诉您数据丢失&#xff0c;无论是由于硬件或软件故障、意外删除还是网络犯罪&#xff0c;都会带来极大的压力…