Spark RDD、DataFrame和DataSet的区别

spark中dataset、dataframe、和RDD的区别 DataFrame DataFrame的前身是SchemaRDD,从Spark 1.3.0开始SchemaRDD更名为DataFrame。与SchemaRDD的主要区别是:DataFrame不再直接继承自RDD,而是自己实现了RDD的绝大多数功能。你仍旧可以在DataFrame上调用rdd方法将其转换为一个RDD。 在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似于传统数... 阅读详情

转载请标明出处:小帆的帆的专栏

RDD

优点:

  1. 编译时类型安全 
    编译时就能检查出类型错误
  2. 面向对象的编程风格 
    直接通过类名点的方式来操作数据

缺点:

  1. 序列化和反序列化的性能开销 
    无论是集群间的通信, 还是IO操作都需要对对象的结构和数据进行序列化和反序列化.
  2. GC的性能开销 
    频繁的创建和销毁对象, 势必会增加GC
import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkConf, SparkContext}

object Run {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("test").setMaster("local")
    val sc = new SparkContext(conf)
    sc.setLogLevel("WARN")
    val sqlContext = new SQLContext(sc)

    /**
      * id      age
      * 1       30
      * 2       29
      * 3       21
      */
    case class Person(id: Int, age: Int)
    val idAgeRDDPerson = sc.parallelize(Array(Person(1, 30), Person(2, 29), Person(3, 21)))

    // 优点1
    // idAge.filter(_.age > "") // 编译时报错, int不能跟String比

    // 优点2
    idAgeRDDPerson.filter(_.age > 25) // 直接操作一个个的person对象
  }
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

DataFrame

DataFrame引入了schema和off-heap

  • schema : RDD每一行的数据, 结构都是一样的. 这个结构就存储在schema中. Spark通过schame就能够读懂数据, 因此在通信和IO时就只需要序列化和反序列化数据, 而结构的部分就可以省略了.

  • off-heap : 意味着JVM堆以外的内存, 这些内存直接受操作系统管理(而不是JVM)。Spark能够以二进制的形式序列化数据(不包括结构)到off-heap中, 当要操作数据时, 就直接操作off-heap内存. 由于Spark理解schema, 所以知道该如何操作.

off-heap就像地盘, schema就像地图, Spark有地图又有自己地盘了, 就可以自己说了算了, 不再受JVM的限制, 也就不再收GC的困扰了.

通过schema和off-heap, DataFrame解决了RDD的缺点, 但是却丢了RDD的优点. DataFrame不是类型安全的, API也不是面向对象风格的.

import org.apache.spark.sql.types.{DataTypes, StructField, StructType}
import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.{SparkConf, SparkContext}

object Run {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("test").setMaster("local")
    val sc = new SparkContext(conf)
    sc.setLogLevel("WARN")
    val sqlContext = new SQLContext(sc)
    /**
      * id      age
      * 1       30
      * 2       29
      * 3       21
      */
    val idAgeRDDRow = sc.parallelize(Array(Row(1, 30), Row(2, 29), Row(4, 21)))

    val schema = StructType(Array(StructField("id", DataTypes.IntegerType), StructField("age", DataTypes.IntegerType)))

    val idAgeDF = sqlContext.createDataFrame(idAgeRDDRow, schema)
    // API不是面向对象的
    idAgeDF.filter(idAgeDF.col("age") > 25) 
    // 不会报错, DataFrame不是编译时类型安全的
    idAgeDF.filter(idAgeDF.col("age") > "") 
  }
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

DataSet

DataSet结合了RDD和DataFrame的优点, 并带来的一个新的概念Encoder

当序列化数据时, Encoder产生字节码与off-heap进行交互, 能够达到按需访问数据的效果, 而不用反序列化整个对象. Spark还没有提供自定义Encoder的API, 但是未来会加入.

下面看DataFrame和DataSet在2.0.0-preview中的实现

下面这段代码, 在1.6.x中创建的是DataFrame

// 上文DataFrame示例中提取出来的
val idAgeRDDRow = sc.parallelize(Array(Row(1, 30), Row(2, 29), Row(4, 21)))

val schema = StructType(Array(StructField("id", DataTypes.IntegerType), StructField("age", DataTypes.IntegerType)))

val idAgeDF = sqlContext.createDataFrame(idAgeRDDRow, schema)
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

但是同样的代码在2.0.0-preview中, 创建的虽然还叫DataFrame

// sqlContext.createDataFrame(idAgeRDDRow, schema) 方法的实现, 返回值依然是DataFrame
def createDataFrame(rowRDD: RDD[Row], schema: StructType): DataFrame = {
sparkSession.createDataFrame(rowRDD, schema)
}
 
  • 1
  • 2
  • 3
  • 4

但是其实却是DataSet, 因为DataFrame被声明为Dataset[Row]

package object sql {
  // ...省略了不相关的代码

  type DataFrame = Dataset[Row]
}
 
  • 1
  • 2
  • 3
  • 4
  • 5

因此当我们从1.6.x迁移到2.0.0的时候, 无需任何修改就直接用上了DataSet.

下面是一段DataSet的示例代码

import org.apache.spark.sql.types.{DataTypes, StructField, StructType}
import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.{SparkConf, SparkContext}

object Test {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("test").setMaster("local") // 调试的时候一定不要用local[*]
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)
    import sqlContext.implicits._

    val idAgeRDDRow = sc.parallelize(Array(Row(1, 30), Row(2, 29), Row(4, 21)))

    val schema = StructType(Array(StructField("id", DataTypes.IntegerType), StructField("age", DataTypes.IntegerType)))

    // 在2.0.0-preview中这行代码创建出的DataFrame, 其实是DataSet[Row]
    val idAgeDS = sqlContext.createDataFrame(idAgeRDDRow, schema)

    // 在2.0.0-preview中, 还不支持自定的Encoder, Row类型不行, 自定义的bean也不行
    // 官方文档也有写通过bean创建Dataset的例子,但是我运行时并不能成功
    // 所以目前需要用创建DataFrame的方法, 来创建DataSet[Row]
    // sqlContext.createDataset(idAgeRDDRow)

    // 目前支持String, Integer, Long等类型直接创建Dataset
    Seq(1, 2, 3).toDS().show()
    sqlContext.createDataset(sc.parallelize(Array(1, 2, 3))).show()
  }
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

参考

Introducing Apache Spark Datasets 
APACHE SPARK: RDD, DATAFRAME OR DATASET? 
RDD、DataFrame和DataSet的区别 
Spark 2.0.0-preview 官方文档

基于spark的Scala编程—RDD、DataFrame和DataSet的区别 本文主要介绍RDD、DataFrame和DataSet这三者到底有什么区别,主要介绍以下几个方面: 分别出现在spark的哪些版本? 各自的优缺点是什么? 应该如何选择使用哪个类别? 分别出现在spark的哪些版本? RDD是spark一开始就提出的概念,DataFrame是spark1.3.0版本提出来的,spark1.6.0版本又引入了DateSet的,但是在spark2.0版本中,Dat... 阅读详情

相关推荐

Spark中RDD与DataFrame与DataSet的区别与联系

1.概述 这是一个面试题 在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似传统数据库中的二维表格 DataFrame与RDD的主要区别在于,前者带有schema元数据信息,既DataFram所表示的二维数据集的每一列都带有名称和类型。 而RDD,由于无从得知所存储数据元素的具体内部结构,Spark Core只能在stage层面进行简单,通用的流水线优化。 2...

九师兄 8697

SparkSql API,Spark DataSet 和DataFrame使用

1.SparkSession SparkSession就是设计出来合并SparkContext和SQLContext的。我建议能用SparkSession就尽量用。如果发现有些API不在SparkSession中,你还是可以通过SparkSession来拿到SparkContext和SQLContex的。 val context: SparkContext = sparkSession.spark...

weixin_46235157的博客 397

Xilinx ERNIC RoCEv2 FPGA实现与QP队列深度解析

本文深入解析Xilinx ERNIC RoCEv2在FPGA上的实现,重点剖析QP队列对的管理机制与深度优化策略。通过Verilog代码示例和工程实战,详细介绍了如何实现高吞吐量、低延迟的RDMA硬件卸载方案,为金融交易和数据中心应用提供性能优化指导。

solidity8miner的博客 877

RDD、DataFrame和DataSet的区别

RDD、DataFrame和DataSet的区别 字数1561 阅读2277 评论9 喜欢10 RDD、DataFrame和DataSet是容易产生混淆的概念,必须对其相互之间对比,才可以知道其中异同。 RDD和DataFrame RDD-DataFrame 上图直观地体现了DataFrame和RDD的区别。左侧的RDD[Person]虽然以P

qiezikuaichuan的专栏 1092

STM32控制舵机SG-5010转动,HAL库

首先设置时钟为72Mhz,预分频系数为72-1,自动重装载计数器的值为5000-1,这样的话就可以得到一个5ms的脉冲宽度,5000的计数值可以让舵机的旋转角度变得更加易控且相对精准,计算旋转角度的时候也可以更加精确。所以我们5ms脉宽,period是5000脉宽-------------角度----------pulse0.5ms-------------0度----------500;1.0ms------------45度---------1000;

qq_73783264的博客 1293

Verilog单周期CPU设计(超详细)

实验 单周期CPU一、设计目的与目标实验内容实验要求二、课程设计器材硬件平台软件平台三、 CPU逻辑设计总体方案指令模块MIPS指令格式指令处理流程数据通路总体结构图设计流程逻辑图四、模块详细设计PCAdd4PCINSTMEMDATAMEMSHIFTER32_L2SHIFTER_COMBINATIONMUX4X32MUX2X5EXT16T32MUX2X32CONUNITREGFILEALUSing...

Ace Cheney的博客 9万+

spark Rdd,DataSet,DataFrame三个互转

object Rdd2DataFrame { System.setProperty("hadoop.home.dir","D:\\hadoop\\hadoop-2.9.2") def main(args: Array[String]): Unit = { val spark = SparkSession.builder().master("local").appName("rdd2dataframe").getOrCreate() val lineRdd = spark.spark.

qq_41458071的博客 258

nRF开发环境搭建全攻略:VS Code + nRF Connect SDK + Zephyr实战

嵌入式开发中,环境配置往往是新手入门的第一道障碍,尤其面对基于Zephyr RTOS的Nordic nRF平台时,工具链的复杂度常让人望而却步。理解构建系统、SDK版本管理和调试工具之间的协作关系,是高效开发的前提。Zephyr作为开源实时操作系统,通过设备树和Kconfig实现硬件描述与功能配置,而nRF Connect SDK(NCS)则是Nordic基于Zephyr的增强发行版,两者结合为物联网开发提供了强大支持。基于VS Code搭建开发环境,配合west工具管理多仓库、CMake/Ninja执行构

weixin_29188997的博客 227

Spark中的DataFrame和DataSet

在SparkSql中要求被操作的数据必须是结构化的,所以引入了俩种数据类型,DataFrame和DataSet。DataFrame是spark1.3之后引入的分布式集合,DataSet是spark1.6之后引入的分布式集合。在spark2.0之后,DataFrame和DataSet的API统一了,DataFrame是DataSet的子集,DataSet是DataFrame的扩展。 (type DataFrame = org.apache.spark.sql.Dataset[org.apache.spark

qq_42456324的博客 2559

Python爬虫实战:研究Pandas,构建车质网各车型数据采集和分析系统

研究结果表明,通过网络爬虫技术可以有效地获取公开的汽车投诉数据,这些数据经过适当的清洗和处理后,可以揭示出丰富的汽车质量信息。)作为国内专业的汽车质量投诉受理平台,自 2010 年成立以来,已累计接收消费者投诉信息超过 200 万条,这些数据包含了车型、投诉时间、投诉问题、处理状态等多维度信息,具有极高的分析价值。:通过对车质网数据的分析,能够挖掘出有价值的汽车质量信息,为消费者购车提供参考,为汽车厂商改进产品质量和服务提供依据,同时也能为相关监管部门提供数据支持。

ylfhpy的博客 938

【FF-A】第二章 Introduction

Armv8.4 架构引入了在安全状态下的虚拟化扩展。Arm® SMMU v3.2 架构[1]为安全流添加了对第2阶段翻译的支持,以补充在 Armv8.4 处理器状态下的安全 EL2 翻译制度。这些架构特性使得在安全状态下,彼此不信任的软件组件能够相互隔离。关于在安全状态下引入虚拟化扩展以及固件框架目标的更多理念可在名为《在安全世界使用虚拟化进行隔离》的白皮书[3]中找到。软件组件只能访问物理地址空间和系统资源的区域,例如 GIC 中对其正确运行必要的中断。

baron-周贺贺-代码改变世界ctw 528

Spark中RDD、DataFrame和DataSet的区别与联系

目录一、RDD、DataFrame和DataSet的定义二、RDD、DataFrame和DataSet的比较(1)Spark版本(2)数据表示形式(3)数据格式(4)编译时类型安全(5)序列化(6)垃圾回收(7)效率/内存使用(8)编程语言支持(9)聚合操作(Aggregation)(10)结论 一、RDD、DataFrame和DataSet的定义 在开始Spark RDD与DataFrame与Dataset之间的比较之前,先让我们看一下Spark中的RDD,DataFrame和Datasets的定义:

蔡政洁的博客 3752

YOLOv11的流形学习压缩:局部线性嵌入(LLE)引导的特征降维,实现在CSP模块中嵌入流形结构保持约束

摘要 本文探讨了流形学习在YOLOv11目标检测模型中的应用,重点研究局部线性嵌入(LLE)方法对CSP模块的特征压缩优化。针对深度学习模型的高维特征冗余问题,LLE通过三个关键步骤实现非线性降维:寻找k近邻、计算重构权重和低维嵌入,相比传统PCA方法能更好地保持数据的局部结构。文章详细分析了LLE的数学原理和参数选择策略,并提出在YOLOv11的CSP模块中嵌入流形约束的创新设计。通过特征分割前、处理过程和融合阶段引入流形一致性损失函数,该方法能在降低特征维度的同时保持原始流形结构,从而提升模型的计算效率

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1380

Spark——Spark RDD、Dataset、DataFrame及区别

文章目录RDD1. 不可变性2. 分区性3. 并行操作4. RDD内部结构5. RDD宽依赖、窄依赖1. 窄依赖2. 宽依赖6. RDD的重用DatasetDataFrame参考 RDD RDD(Resilient Distributed Dataset,弹性分布式数据集)是Spark中的基本抽象。RDD代表一种可并行操作的不可变的分区元素集合,它有3个特性: RDD是不可变的 RDD是分区的 RDD是可以并行操作的 1. 不可变性 RDD是不可变的,只能在其他的RDD上通过Transformation

aof 826

《QGIS快速入门与应用基础》009:国内镜像源(清华大学/阿里云)下载技巧

针对国内用户下载QGIS速度慢、易中断的问题,推荐使用清华大学和阿里云两大国内镜像源,提供3-10MB/s的极速下载方案。详细解析镜像源核心优势、分步骤下载指南及校验方法,对比清华(同步快、北方优选)与阿里云(南方节点多)的特点。针对常见问题如版本延迟、404错误等提供解决方案,并介绍搭配IDM等工具实现多线程加速的进阶技巧。通过镜像源+下载工具组合,用户可高效获取QGIS安装包,为后续系统安装奠定基础。

LuckyHanMo的博客 1738

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

spark中 RDD、DataFrame、Dataset的关系及区别

谈谈RDD、DataFrame、Dataset的区别和各自的优势 在spark中,RDD、DataFrame、Dataset是最常用的数据类型 共性: 1、RDD、DataFrame、Dataset全都是spark平台下的分布式弹性数据集,为处理超大型数据提供便利 2、三者都有惰性机制,在进行创建、转换,如map方法时,不会立即执行,只有在遇到Action如foreach时,三者才会...

top8488.top大数据 1943

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

spark中RDD,DataSet,DataFrame的区别

接触到spark不可避免的会接触spark的Api;           rdd,DataFrame,DataSet, 接下来就大致说一下他们的有点以及各自的区别; 首先DataFrame,DataSet是基于RDD之上的,而且可以通过简单的api调用进行无缝切换。 RDD的优点; 1;相对比与传统的MapReduce框架,spark的RDD中内置了很多函数操作,map,flatMap,...

Galaxy_songypd的博客 536

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Spark SQL 总结整理(一):RDD、DataFrame和DataSet的区别

RDD、DataFrame和DataSet是容易产生混淆的概念,必须对其相互之间对比,才可以知道其中异同:DataFrame多了数据的结构信息,即schema。RDD是分布式的 Java对象的集合。DataFrame是分布式的Row对象的集合 1. RDD和DataFrame 上图直观地体现了DataFrame和RDD的区别 左侧的 RDD[Person] 虽然以 Person 为类型参数,但S...

super_wj0820的博客 1523

Spark中RDD,DataFrame和DataSet的区别,联系以及相互转换

RDD:RDD (Resilient Distributed Dataset) 叫做弹性分布式数据集,它归属于SpqrkCore模块中,是Spark中最基本的数据抽象,代码中RDD是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。并且RDD表示只读的分区的数据集,对RDD进行改动,只能通过RDD的转换操作来进行。 DataFrame: 归属于SparkSql模块里面,是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。相对于RDD来讲它多了schema元信息,即Dat

mo 1039

Spark中RDD、DataFrame和DataSet三者的区别

Spark中RDD、DataFrame和DataSet三者的关系1.共性:2.区别:1.RDD2.DataFrame3.DataSet3.Spark millb简介:1. Spark包含一个提供常见的机器学习(ML)功能的程序库,叫做MLlib。2.MLlib的设计理念:把数据以RDD的形式表示,然后在分布式数据集上调用各种算法。 1.共性: 1.RDD、 DataFrame、DataSet都是spark平台下的分布式数据集,为处理超大型数据提供便利; 2.三者都有惰性机制,在进行创建、转换时,不会立即执行

不会打球的摄影师不是好程序员 2401

Spark 基础 RDD、DataFrame 和 DataSet 区别与联系

摘要:Spark提供三种核心数据结构:RDD(弹性分布式数据集)是基础抽象,支持并行计算但需手动优化;DataFrame提供结构化数据处理和SQL支持,性能更优;DataSet结合两者优点,支持类型安全和高效编码。对比显示DataFrame/DataSet性能优于RDD(可达10倍),内存占用更少。RDD适用非结构化数据和精细控制,DataFrame适合结构化ETL,DataSet则适合类型敏感场景。开发效率上,DataSet≈DataFrame>RDD,根据场景需求选择合适的数据结构可显著提升处理效

学无止境焉 374

Spark RDD、DStream、DataFrame、DataSet 在窗口操作上的区别

【代码】Spark RDD、DStream、DataFrame、DataSet 在窗口操作上的区别。

z1941563559的博客 917

Spark SQL 快速入门系列(4) | RDD、DataFrame、DataSet三者的共性和区别

  大家好,我是不温卜火,是一名计算机学院大数据专业大二的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只有csdn这一个平台,博客主页:https://buwenbuhuo.blog.youkuaiyun.com/   本片博文为大家带来的是RDD、DataFrame、DataSet.

不温卜火 5924
上一篇: 矩阵分解模型(1):ALS学习算法
下一篇: [Kafka] - Kafka基本操作命令
Next__One
博客等级 码龄9年 14粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值