RDD,DataFrame,DataSet区别

RDD和DataFrame和DataSet三者间的区别 RDD vs DataFrames vs DataSet 在SparkSQL中Spark为我们提供了两个新的抽象,分别是DataFrame和DataSet。他们和RDD有什么区别呢?首先从版本的产生上来看: RDD (Spark1.0) —> Dataframe(Spark1.3) —> Dataset(Spark1.6) 如果同样的数据都给到这三个数据结构,他们分别计算之后,... 阅读详情

RDD

优点:

  • 1.编译时类型安全
    编译时就能检查出类型错误 (_.age > “”) 能检测”” 空字符串
  • 2.面向对象的编程风格 ( _.age )
    直接通过类名点的方式来操作数据

缺点:

  • 1.序列化和反序列化的性能开销
    无论是集群间的通讯,还是IO操作都需要对对象的结构和数据进行序列化和反序列化
  • 2.GC的性能开销
    频繁的创建和销毁对象,势必会增加GC
package rdddataframadataset

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext

/**
  * Created by Administrator on 2017/3/15.
  */
object RddTest {
  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对象
  }

}

DataFrame

优点:

  • 1.只需要序列化数据,不需要序列化结构
  • 2.不受GC影响

缺点:

  • 1.不是面对对象风格 ( _.age )
  • 2.运行时检查错误 ( idAgeDF.col(“aage”) ) 没有aage这个列

DataFrame引入了schema和off-heap

  • schema : RDD每一行的数据,结构都是一样的,这个结构就存储在schema中.Spark通过schema就能够读懂 数据,因此在通讯和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也不是面向对象风格的.
package rdddataframadataset

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

/**
  * Created by Administrator on 2017/3/15.
  */

object DataFrameTest {
  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).show()
    // 不会报错, DataFrame不是编译时类型安全的
    idAgeDF.filter(idAgeDF.col("age") > "").show()
  }

}

DataSet

ps:DataSet 1.6.0 版本才有

优点:

  • 1.DataSet可以在编译时检查类型
  • 2.并且是面向对象的编程接口
  • 3.只需要序列化数据,不需要序列化结构
  • 4.不受GC影响

DataSet结合了RDD和DataFrame的优点, 并带来的一个新的概念Encoder当序列化数据时, Encoder产生字节码与off-heap进行交互, 能够达到按需访问数据的效果,而不用反序列化整个对象. Spark还没有提供自定义Encoder的API, 但是未来会加入.

package rdddataframadataset

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

/**
  * Created by Administrator on 2017/3/15.
  */
//定义的class 必须放在类的外面,填坑,不知道为什么
case class Persons(name: String, age: Long)

object DataSetTest {


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

    import sqlContext.implicits._

    // 目前支持String, Integer, Long等类型直接创建Dataset
    //Creating Datasets

    //第一种
    Seq(1, 2, 3).toDS().show()

    //第二种
    val ds = Seq(Persons("Andy", 32)).toDS()
    ds.show()

    //第三种
    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)
    idAgeDS.show()

    //第四种
    import sqlContext.implicits._    //隐式函数
  /*  1.序列化
      2. 序列化成对象,调用对象属性*/
    val PersionDF = sqlContext.read.json("d://SparkProject//demo1//testdata//person.json").as[Persons]
    PersionDF.show()
    //第五种
    sqlContext.createDataset(sc.parallelize(Array(1, 2, 3))).show()
  }


}

总结:
1、RDD支持面向java、scala对象,编译时强类型检查。缺点,序列化非常消耗时间(集群分发和磁盘存储),不能充分利用系统的高级优化能力(如off-heap),垃圾回收对象开销大。

2、DataFrame支持数据集的模式表示(即数据列的概念),所以集群分发数据时并不需要序列化,能充分利用系统高级优化能力(off-heap),引入查询计划提高性能。缺点,DataFrame的列类型,在编译时无法判断类型,会产生运行时错误。

3、Dataset即支持数据集的模式表示,又支持java、scala对象的类型检查能力。两者通过引入一种编码、解码机制来实现。

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

相关推荐

RDD DataSet 和 Dataframe 的 区别

** RDD DataSet 和 Dataframe 的 区别 ** 首先从版本产生的来看 RDD(Spark1.0)—> Dataframe(Spark 1.3)—>DataSet(Spark 1.6) 同样的数据都给到这三个数据结构,他们分别计算之后,都会给出相同的结果 不同的是他们的执行效率和执行方式 下面我们先来了解一下这三个数据结构 1 RDD RDD 是一个lazy的不可变的可以支持函数调用的并行数据集合 RDD 的最大的好处就是简单, API的人性化程度高 RDD 劣势是性

weixin_52346735的博客 233

RDD、DataFrame和DataSet的区别

参考文章:RDD、DataFrame和DataSet的区别 SparkSQL_Dataset和DataFrame简介 一、Spark SQL简介 Spark SQL 是 Spark 中的一个子模块,主要用于操作结构化数据。它具有以下特点: 能够将 SQL 查询与 Spark 程序无缝混合,允许您使用 SQL 或 DataFrame API 对结构化数据进行查询; 支持多种开发语言; 支持多达上百种的外部数据源,包括 Hive,Avro,Parquet,ORC,JSON 和 JDBC 等; 支持

justlpf的专栏 5672

WPF实战:HelixToolkit 3D图形开发入门指南

本文详细介绍了如何使用HelixToolkit在WPF中进行3D图形开发,从环境搭建到创建第一个3D程序(如彩色立方体),再到进阶技巧和常见问题排查。通过实战案例和性能优化建议,帮助开发者快速掌握3D场景构建和模型导入技术,提升开发效率。

weixin_29197051的博客 761

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

RDD代表弹性分布式数据集。它是记录的只读分区集合。RDD是Spark的基本数据结构。它允许程序员以容错方式在大型集群上执行内存计算。与RDD不同,数据以列的形式组织起来,类似于关系数据库中的表。它是一个不可变的分布式数据集合。Spark中的DataFrame允许开发人员将数据结构(类型)加到分布式数据集合上,从而实现更高级别的抽象。ApacheSpark中的Dataset是DataFrameAPI的扩展,它提供了类型安全(type-safe),面向对象(object-oriented)的编程接口。...

大数据 7893

浮点数运算的陷阱与启示:FP16加法器/乘法器开发中的常见误区

本文深入探讨FP16加法器和乘法器开发中的常见误区,包括FP16格式解析、阶码对齐陷阱、尾数运算风险及规格化处理。通过Verilog实战代码展示防御性编程技巧,帮助开发者避免边界条件处理和异常状态管理中的错误,提升硬件设计的可靠性和效率。

dell8的博客 250

GT-suite v2016的下载和安装

1 写在前面 GT-suite 是一款用来做内燃机仿真的软件。在安装过程中遇到很多问题,网上的安装教程也大都抄来抄去,试着安装了几遍都没有成功。最终在贴吧一个老哥的帖子里找到了解决办法,但是老哥的帖子也不是很详细,所以做了这个详细版本的教程。 GT-suite v2016安装包: 链接:https://pan.baidu.com/s/1JZPgJ8_-J-L8rV84-eHedQ 提取码:uj...

kisssshot的博客 3万+

RDD, DataFrame,DataSet区别与相互转化

它提供了特定领域内专用的 API 来处理你的分布式数据,并让更多的人可以更方便地使用 Spark,而不仅限于专业的数据工程师。从根本上来说,一个 RDD 就是你的数据的一个不可变的分布式元素集合,在集群中跨节点分布,可以通过若干提供了转换和处理的底层 API 进行并行处理。3.如果你想在编译时就有高度的类型安全,想要有类型的 JVM 对象,用上 Catalyst 优化,并得益于 Tungsten 生成的高效代码,那就使用 Dataset;1.你希望可以对你的数据集进行最基本的转换、处理和控制;

bitcarmanlee的博客 1567

2026年03月CCF-GESP编程能力等级认证Scratch图形化编程一级真题解析

本文收录于《,订阅后可阅读专栏内所有文章。

人生就是一个不断学习的过程 238

RDD、DataFrame、DataSet的概念、区别联系、相互转换操作

这使得 Spark SQL 得以洞察更多的结构信息,从而对藏于 DataFrame 背后的数据源以及作用于 DataFrame 之上的变换进行了针对性的优化,最终达到大幅提升运行时效率的目标。RDD(Resilient Distributed Datasets) ,弹性分布式数据集, 是分布式内存的一个抽象概念,RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,只能通过在其他RDD执行确定的转换操作(如map、join和group by)而创建,然而这些限制使得实现容错的开销很低。

weixin_60343288的博客 1844

RNA-seq分析:Step8(富集分析)

RNA-seq富集分析是一种用于分析基因表达数据中特定基因或通路是否富集的分析方法。其基本思想是比较不同基因对应的转录本/基因之间的表达差异及其对应的基因注释信息,通过统计学方法评估差异的显著性,从而确定是否存在某些特定的功能通路或基因集合富集的情况。常用的RNA-seq富集分析工具包括GOseq、KEGG(KEGG enrichment analysis)、DAVID(Database for Annotation, Visualization and Integrated Discovery)等。这

沉香best的博客 3633

做cellchat画图时自环的角度颠倒,如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 463

Spark RDD、DataFrame和DataSet的区别

在比较这三者的区别之前,先看看他们各自的定义是什么。RDD是一种弹性分布式数据集,是一种只读分区数据。它是spark的基础数据结构,具有内存计算能力、数据容错性以及数据不可修改特性。Dataframe也是一种不可修改的分布式数据集合,它可以按列查询数据,类似于关系数据库里面的表结构。可以对数据指定数据模式(schema)。Dataset是DataFrame的扩展,它提供了类型安全,面向对象的编程接口。也就是说DataFrame是Dataset的一种特殊形式。

6万+

最新2026年《网络数据安全风险评估办法》条款解读

大型企业集团IT变革下的零信任安全体系建设方案(55页).pptx。以数据安全为核心的安全立体防御体系解决方案(41页).pptx。让数据安全合规地创造价值(15页 PPT).pptx。大型集团数据安全应急预案(57页).docx。数据安全治理与评估服务业务介绍.pptx。数据安全管理实践(17页).pptx。大数据安全架构设计方案.pptx。大数据安全规划总体方案.pptx。数据库安全综合治理方案.pptx。医疗数据安全建设方案.pptx。数据安全框架规划图.pptx。数据安全治理方案.pptx。

cdfunlove的博客 47

Rdd,DataFrame和DataSet的区别

这三个都是分布式数据集。但有一点不同,Rdd可以存放用户自定义的数据对象,DataFrame只能存放Row类型的数据和一些Schema信息,而DataSet既可以存放用户自定义的 数据类型,又可以存放一些该数据类型的Schema信息。可以说,DataSet结合了Rdd和DataFrame的优点。 Rdd提供了强大的算子操作,但是对于一些结构化数据类型的信息查询并不方便,比如如果我们要查

SummerMangoZz的博客 932

Android 17为什么会重写MessageQueue

DeliQueue 通过消除 MessageQueue 中的锁,提升了系统和应用的性能。合成基准测试: 得益于并发能力的提升(Treiber 栈)和更快的插入速度(最小堆),向繁忙队列进行多线程插入的速度比传统 MessageQueue 快了高达 5000 倍。Perfetto 追踪分析: 在从内部测试人员处获取的 Perfetto 追踪记录中,我们看到应用主线程在锁竞争上消耗的时间减少了 15%。

xiangzhihong8的专栏 270

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

top8488.top大数据 1943

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

spark中RDD,DataSet,DataFrame的区别

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

Galaxy_songypd的博客 536

RDD,DataFrame,DataSet介绍,及区别

RDD全称Resilient Distributed Dataset,弹性分布式数据集,它是记录的只读分区集合,是Spark的基本数据结构,见名释义: 弹性,表现在两个方面,一是当计算过程中内存不足时可刷写到磁盘等外存上,可与外存做灵活的数据交换;二是RDD使用了一种“血统”的容错机制,在结构更新和丢失后可随时根据血统进行数据模型的重建; 分布式,可分布在多台机器上进行并行计算; ...

索JM以后是大牛的博客 588

RDD,DataFrame与DataSet区别

1.RDD与DataFrame的区别 下面的图直观地体现了DataFrame和RDD的区别。左侧的RDD[Person]虽然以Person为类型参数,但Spark框架本身不了解Person类的内部结构。而右侧的DataFrame却提供了详细的结构信息,使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。DataFrame多了数据的结构信息,即schema。RDD是分

bitcarmanlee的博客 4965

RDD、DataFrame、DataSet的区别

●结构图解 RDD[Person]以Person为类型参数,但Spark框架本身不了解 Person类的内部结构。 DataFrame提供了详细的结构信息schema,使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。这样看起来就像一张表了 DataSet[Person]中不光有schema信息,还有类型信息 ●数据图解 1.假设RDD中...

MannerXu的博客 325

RDD、DataFrame、和DataSet三者的区别

在 SparkSQL 中 Spark 为我们提供了两个新的抽象,分别是DataFrame和DataSet。他们和RDD有什么区别呢?首先从版本的产生上来看: RDD (Spark1.0) —> Dataframe(Spark1.3) —> Dataset(Spark1.6) 如果同样的数据都给到这三个数据结构,他们分别计算之后,都会给出相同的结果。不同是的他们的执行效率和执行方式。 在...

sghuu的博客 501
上一篇: HBase RowKey散列和预分区
下一篇: 二叉树的镜像
yjgithub
博客等级 码龄11年 53粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值