RDD、DataFrame与DataSet|Spark常用算子

Apache Spark的常用算子和函数 将 RDD 的所有元素收集到 Driver 端,慎用(可能导致 OOM)。去重,返回元素唯一的 RDD(可能触发 Shuffle)。对 DStream 的每个 RDD 应用转换函数。对两个 KV 格式的 RDD 进行内连接。对 RDD 中的每个元素应用函数。对 RDD 的每个元素执行函数。条件的元素,返回新的 RDD。将 RDD 保存为文本文件。,再将结果展平,常用于分词。合并两个 RDD,不去重。返回 RDD 的元素个数。聚合 RDD 中的元素。(常用于输出到外部系统)。窗口内按 key 聚合。 阅读详情


  DataFrame是spark1.3.0版本提出来的,spark1.6.0版本又引入了DateSet的。DataFrame、DataSet是基于RDD的,三者之间可以通过简单的API调用进行无缝切换。

RDD、DataFrame与DataSet区别

RDD

  RDD弹性分布式数据集。与DataFrame,DataSet不同,RDD不支持Spark SQL。

DataFrame

  在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。与RDD和Dataset不同,DataFrame每一行的类型固定为Row,只有通过解析才能获取各个字段的值,每一列的值没法直接访问。DataFrame与Dataset均支持SparkSQL操作,比如select、groupby等

testDF.foreach{
  line =>
    val col1=line.getAs[String]("col1")
    val col2=line.getAs[String]("col2")
}

DataFrame与RDD的主要区别:DataFrame带有schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。

DataSet

  Dataset是一个由特定领域的对象组成强类型(typedrel)集合,可以使用函数(DSL)或关系运算(SQL)进行并行的转换操作。 每个Dataset 还有一个称为“DataFrame”的无类型(untypedrel)视图,它是[[Row]]的数据集。

RDD和Dataset
区别:
  Dataset不使用Java序列化或Kryo,而是使用专用的Encoder编码器来序列化对象以便通过网络进行处理或传输。虽然Encoder编码器和标准序列化都负责将对象转换为字节,但Encoder编码器是动态生成的代码,并使用一种格式,允许Spark执行许多操作,如过滤,排序和散列,而无需将字节反序列化为对象

Dataset和DataFrame
区别:
  Dataset是强类型typedrel的,会在编译的时候进行类型检测;而DataFrame是弱类型untypedrel的,在执行的时候进行类型检测;Dataset是通过Encoder进行序列化,支持动态的生成代码,直接在bytes的层面进行排序,过滤等的操作;而DataFrame是采用可选的java的标准序列化或是kyro进行序列化

联系:
  DataFrame是Dataset中每一个元素为Row类型的特殊情况。DataFrame和Dataset实质上都是一个逻辑计划,并且是懒加载的,都包含着scahema信息,只有到数据要读取的时候,才会将逻辑计划进行分析和优化,并最终转化为RDD。

RDD、DataFrame与DataSet转化

DataFrame/Dataset转RDD:

val rdd1=testDF.rdd
val rdd2=testDS.rdd

RDD转DataFrame:

import spark.implicits._
val testDF = rdd.map {line=>
      (line._1,line._2)
    }.toDF("col1","col2")

一般用元组把一行的数据写在一起,然后在toDF中指定字段名

RDD转Dataset:

import spark.implicits._
case class Coltest(col1:String,col2:Int)extends Serializable //定义字段名和类型
val testDS = rdd.map {line=>
      Coltest(line._1,line._2)
    }.toDS

可以注意到,定义每一行的类型(case class)时,已经给出了字段名和类型,后面只要往case class里面添加值即可

Dataset转DataFrame:

//把case class封装成Row
import spark.implicits._
val testDF = testDS.toDF

DataFrame转Dataset:

import spark.implicits._
case class Coltest(col1:String,col2:Int)extends Serializable //定义字段名和类型
val testDS = testDF.as[Coltest]

这种方法就是在给出每一列的类型后,使用as方法,转成Dataset,这在数据类型是DataFrame又需要针对各个字段处理时极为方便

Spark常用算子比较

map与flatmap

  • map算子会对每一条输入进行指定的操作,然后为每一条输入返回一个对象
  • flatMap算子是将RDD里的每一个元素执行自定义函数f,这时这个元素的结果转换成iterator,最后将这些再拼接成一个新的RDD

mapPartition与map

  map是对rdd中的每一个元素进行操作。mapPartitions则是对rdd中的每个分区的迭代器进行操作,这个分区的数据处理完后,原RDD中分区的数据才能释放,可能导致OOM。
  当内存空间较大的时候建议使用mapPartition,以提高处理效率。如果在map过程中需要频繁创建额外的对象(例如将rdd中的数据通过jdbc写入数据库,map需要为每个元素创建一个链接而mapPartition为每个partition创建一个链接),则mapPartitions效率比map高的多。

reduce、reduceByKey与groupByKey

  reduceByKey是transformation算子;reduce是action算子,聚合RDD中的所有元素。
  reduceByKey用于对每个key对应的多个value进行merge操作,最重要的是它能够在本地先进行merge操作,并且merge操作可以通过函数自定义。groupByKey也是对每个key进行操作,但只生成一个sequence,groupByKey本身不能自定义操作函数。如果需要对sequence进行aggregation操作,那么选择reduceByKey更好。这是因为groupByKey不能自定义函数,需要先用groupByKey生成RDD,然后才能对此RDD通过map进行自定义函数操作。
  reduceByKey默认在map端进行合并,即在shuffle前进行合并,如果合并了一些数据,那在shuffle时进行溢写则减少了磁盘IO,所以reduceByKey会快一些。当采用groupByKey时,由于它不接收函数,spark只能先将所有的键值对(key-value pair)都移动,这样的后果是集群节点之间的开销很大,导致传输延时。在对大数据进行复杂计算时,reduceByKey优于groupByKey。

join

  join 对两个需要连接的 RDD操作。leftOutJoin(左外连接)和rightOutJoin(右外连接)相当于在join的基础上先判断一侧的RDD元素是否为空,如果为空,则填充为空。 如果不为空,则将数据进行连接运算,并返回结果。

补充:join时何时产生shuffle,何时不产生shuffle?
  Spark中产生宽窄依赖的依据是shuffle,当发生shuffle时,会产生宽依赖,基本上shuffle算子都会产生宽依赖,但是join除外,在执行join算子之前如果先执行groupByKey,执行groupByKey之后,会把相同的key分到同一个分区,再执行join算子,join算子是把key相同的进行join,父RDD的分区只对应一个子RDD的分区,不一定会产生shuffle。

distinct

distinct算子将RDD中的元素进行去重操作,是宽依赖。

combineByKey

groupByKey/reduceByKey底层是由combineByKey实现的。

def combineByKey[C](
      createCombiner: V => C,
      mergeValue: (C, V) => C,
      mergeCombiners: (C, C) => C,
      partitioner: Partitioner,
      mapSideCombine: Boolean = true,
      serializer: Serializer = null)
  • createCombiner当第一次遇到key时,调用这个函数,将key对应的V转换成C(初始化操作)
  • mergeValue不是第一次遇到key时,调用这个函数,将key对应的元素V合并到之前的元素C(createCombiner)上 (对这个分区中相同的key的进一步操作)
  • -mergeCombiners该函数将相同Key的C合并成一个C(这个操作在不同分区间进行)

除此之外,还包含三个默认参数:
partitioner:分区函数,默认为HashPartitioner
mapSideCombine:是否需要在Map端进行combine操作,类似于MapReduce中的combine,默认为true
serializer:序列化,用于数据存储和传输

aggregateByKey

  函数对PairRDD中相同Key的值进行聚合操作。因为aggregateByKey是对相同Key中的值进行聚合操作,所以aggregateByKey函数最终返回的类型还是Pair RDD,对应的结果是Key和聚合好的值;而aggregate函数直接是返回非RDD的结果,这点需要注意。
  aggregateByKey()()存在两个参数列表,使用了函数柯里化:
zeroValue:表示分区内计算时的初始值,类型U要注意,最终返回的类型也必须是这个类型U

seqOp(U,Int):表示分区内计算规则,这个方法主要是做相同key在同一个partition的聚合操作,两个参数(U,int)第一个参数是开始初始值U,第二个类型是数据的value的类型,返回类型为定义的zeroValue的类型

combOp:表示分区间计算规则,根据key 对不同分区的数据进行一个聚合操作(也就是对seqOp的结果做合并操作),这个参数(U,U)这两个的类型都是seqOp返回类型

  性能调优中有个方案, 使用 aggregateBykey 代替 groupbykey。因为aggregateByKey,使用map-side预聚合的shuffle操作, 相当于在Map端进行了聚合的操作,相当于MapReduce 中进行combiner

repartition和coalesce

repartition(numPartitions:Int)和coalesce(numPartitions:Int,shuffle:Boolean=false)
作用:对RDD的分区进行重新划分,repartition内部调用了coalesce,参数shuffle为true。coalesce只能减少分区,而repartition可以减少和增加。
  对于coalesce:如果是生成一个窄依赖的结果,那么不会发生shuffle。比如:1000个分区被重新设置成10个分区,这样不会发生shuffle。即窄依赖:父RDD的多个分区对应一个子RDD分区。当把父RDD的分区数量增大时,比如RDD的分区是100,设置成1000,如果shuffle为false,并不会起作用。这时候就需要设置shuffle为true了,那么RDD将在shuffle之后返回一个1000个分区的RDD,数据分区方式默认是采用 hash partitioner。对于repartition:无论分区数是增加还是减少都会执行shuffle操作。

foreach与foreachPartition

  foreach是对RDD中的每一个元素执行指定的函数,foreachPartition是对RDD中的每一个Partition执行指定的函数。

/**
* Applies a function f to all elements of  this RDD.
*/
def foreach(f: T => Unit): Unit =  withScope {
  val cleanF = sc.clean(f)
  sc.runJob(this, (iter: Iterator[T]) =>  iter.foreach(cleanF))
}
/**
* Applies a function f to each partition of  this RDD.
*/
def foreachPartition(f: Iterator[T]  => Unit): Unit = withScope {
  val cleanF = sc.clean(f)
  sc.runJob(this, (iter: Iterator[T]) =>  cleanF(iter))
}

  可以看到方法通过clean操作(清理闭包,为序列化和网络传输做准备)进行了一层匿名函数的封装。针对foreach方法,是我们的方法被传入了迭代器的foreach(每个元素遍历执行一次函数),而对于foreachpartiton方法是迭代器被传入了我们的方法(每个分区执行一次函数。
  假如我们的Function中有数据库,网络TCP等IO链接,文件流等等的创建关闭操作,采用foreachPatition方法,针对每个分区集合进行计算,更能提高我们的性能。

union与union all

  union属于窄依赖,无shuffle。union all不去重,union会去重。union进行默认规则的排序,union all不进行排序。

collect

Spark的collect收集的数据在Driver JVM内存中

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

相关推荐

论RDD、DataSet、DataFrame关系及优劣

前面已经给大家深入的讲解过RDD、DataSet、DataFrame的概念已经用法,那么到底这三者有什么关联呢?各自都有什么优劣?带着这这样的问题,今天小编就给大家详细的概述下。 在spark中,基本每次都会用到这三个类型,因为这是spark最常用的数据类型。 相同点 1、RDD、DataFrame、Dataset全都是spark平台下的分布式弹性数据集,为处理超大型数据提供便利 2、三者都有惰性机制,在进行创建、转换,如map方法时,不会立即执行,只有在遇到Action算子如foreach时,三者才会开始

zp17834994071的博客 4432

Spark与Pandas中DataFrame的详细对比

Pandas Spark 工作方式 单机single machine tool,没有并行机制parallelism 不支持Hadoop,处理大量数据有瓶颈 分布式并行计算框架,内建并行机制parallelism,所有的数据和操作自动并行分布在各个集群结点上。以处理in-memory数据的方式处理distributed数据。 支持Hadoop,能处理大量数据 延迟机制 not lazy-evaluat

bitcarmanlee的博客 2万+

spark sql Dataset&Dataframe算子大全

目录 Dataset&Dataframe RDD,Dataset,Dataframe互相转换 Dataset&Dataframe算子 show() na() 返回包含null值的行 stat() sortWithinPartitions() sort()&order by() hint() selectExpr() filter&w...

zhaolq1024的博客 5682

Spark 与 DataFrame

在 Spark 中,除了 RDD 这种数据容器外,还有一种更容易操作的一个分布式数据容器 DateFrame,它更像传统关系型数据库的二维表,除了包括数据自身以外还包括数据的结构信息(Schema),这就可以利用类似 SQL 的语言来进行数据访问。...

Lamours的博客 740

RPA 财务共享中心与RPA赋能

在和集团财务官交流的时候,客户经常会提到FSSC,其中有准备建立FSSC,正在建立FSSC,以及已建成FSSC正使用的,当中会有些对FSSC的疑虑和问题,所以花费些时间对FSSC进行了深入调研,从而也有幸拜读了王兴山、陈剑、梅震、钱自严等专业人士写的几本关于FSSC的书,对FSSC的前因后果有了更深入的认识,同时结合自己在FSSC的一些项目经验,故做了本次分享。 本文章主要分享财务共享中心以及R...

weixin_40244959的博客 2756

Windows下构建ImGui.Net

工具 Visual Studio 2017 操作 下载项目 git clone https://github.com/mellinoe/ImGui.NET.git 编译 右键以下两个项目并调试: ImGui.NET.SampleProgram ImGui.NET.SampleProgram.XNA Error fix 中间遇到一些问题: SDK版本不对 去微软官网下载安装对应版本 由于设置了代理被远程服务器拒绝连接 关闭代理(也许在环境变量中) nuget源无对应资源,404 NOT FOUN

jojozym的博客 1487

Spark与Pandas中DataFrame对比(详细)

Spark与Pandas中DataFrame对比

me_to_007的博客 1841

激光雷达与相机融合(四)----基于激光雷达与相机的碰撞检测

在这一部分,基于前面的各个部分内容,将利用激光雷达和相机实现目标的检测分类及单目标跟踪,并对车辆前方的车辆目标计算相应的碰撞时间TTC。计算方法分别利用相机和雷达实现。 1.系统的总体架构: 2.TTC计算 简单介绍一下通过激光雷达和相机计算碰撞时间的原理: 利用激光雷达点计算碰撞时间:首先根据检测框聚类出前车目标的点,并过滤掉这些点中的离群点,然后找出这些点中相对于本车最近的点,基于前后两帧以及数据采集频率就可以求解出相对速度,然后用当前帧的距离除以速度得出当前的TTC。但该方法对最近点的选取稳定性不是

张飞飞的博客 3985

Spark中判断DataFrame是否为空

没有找到直接判断DataFrame是否为空的方法,这里转换成数组后判断数组是否为空 def isEmpty(df: DataFrame): Boolean = { df.collect().isEmpty } 如果有更好的方法,欢迎交流学习。

MH_Tan的博客 5360

SRv6项目实践(三):P4Runtime基础以及交换机控制

在正式介绍P4runtime基础之前,先说一说P4的编译和实现的过程该文件包含了各个表和操作,它们的id用一个索引值来表示,比如a表用b操作,不会直接说用名字为B的操作,而是说用索引为xxx的操作,然后锁定到b上执行相关的功能,其次,用了一个bitwith来描述,要访问的数据的比特长度是多长。p4c编译器将p4编译成两份文件,其中一份是,另一份是,将这两个文件再整合起来,作为配置,放到交换机中。

a1164520408的博客 3411

如何将一个向量投影到一个平面上_线性代数19——投影矩阵和最小二乘

一维空间的投影矩阵  先来看一维空间内向量的投影:  向量p是b在a上的投影,也称为b在a上的分量,可以用b乘以a方向的单位向量来计算,现在,我们打算尝试用更“贴近”线性代数的方式表达。  因为p趴在a上,所以p实际上是a的一个子空间,可以将它看作a放缩x倍,因此向量p可以用p = xa来表示,只要找出x就可以了。因为a⊥e,所以二者的点积为0:  我们希望化简这个式子从而得出x:  x是一个实数...

weixin_39741101的博客 5230

SparkDataFrame简单介绍带你轻松入门

1 SparkDataFrame 1 DataFrame简介 在Spark语义中,DataFrame是一个分布式的行集合,可以想象为一个关系型数据库的表,或者一个带有列名的Excel表格。它和RDD一样,有这样一些特点: Immuatable:一旦RDD、DataFrame被创建,就不能更改,只能通过transformation生成新的RDD、DataFrame Lazy Evaluations:只有action才会触发Transformation的执行 Distributed:DataFrame和RDD

qq_33390476的博客 1016

WPS JS宏实战:批量调整200个Word表格格式的避坑指南(附完整代码)

本文提供了一份详尽的WPS JS宏实战指南,针对批量调整大量Word表格格式的需求。文章深入解析了如何利用JS宏自动化设置字体、行距和边框,并重点解决了常见的“首行访问报错”等核心难题,附有可直接使用的完整代码,帮助用户显著提升文档处理效率。

weixin_29280219的博客 430

数据挖掘中,关于spark rdd常用算子转dataset

数据挖掘中,关于spark rdd常用算子转dataset 这篇的文章的内容很简单,就是总结一下自己在数据挖掘过程中用到的一些算子,然后将原来项目中使用rdd转换为dataset。理论上来说有结构的rdd都可以转为dataframe或者dataset,因为项目里面读取的是seq,原本是用的rdd,所以理论上是可行的,最开始我有尝试转为datafrme,但是有些算子在转换过程中又会转为rdd,所以后来又尝试走dataset。目前来说,项目里用到的算子都能转为dataset,这里了只是做一些总结,用到的算子都是

weixin_44540503的博客 321

解决Office 365 SMTP问题:C#邮件发送详解

本文介绍了如何在C#中使用Office 365 SMTP服务发送邮件。重点讲解了正确配置SMTP客户端的关键参数:必须使用587端口并启用TLS加密(EnableSsl=true),同时通过NetworkCredential进行身份验证。虽然SmtpClient已不推荐用于新项目,但本文提供的代码示例仍适用于临时项目或系统维护,并建议未来可考虑使用MailKit等现代邮件库。文章还包含了错误处理机制,确保程序健壮性。

2501_90323865的博客 141

一次搞定 SAP IDoc 失败重处理与安全清理:BD87 实战指南

本文介绍了SAP IDoc错误处理的BD87实战指南。主要内容包括: BD87的核心功能:监控IDoc处理状态并支持人工重处理或标记删除,适用于入站/出站IDoc故障处理。 重处理前的关键步骤: 区分技术错误与业务错误 检查是否允许重复处理 确认日期范围设置正确 标准操作流程:通过BD87选择错误IDoc节点执行重处理,特别适用于状态51的应用错误。 标记删除操作:将无用IDoc标记为可清理状态,后续可通过WE11物理删除或归档处理。 常见问题解决方案:包括权限控制、批量处理优化建议以及自动化定位工具的开发

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 452

Spark必会点总结

如果是通过读取外部数据textFile创建,如果未指定就是默认分区和2取最小值,如果指定分区了指定的值就为分区数的最小值,具体的分区规则可根据HDFS的分片规则来。spark-submit的作用是:将写好的代码,提交到spark,让spark运行,spark有可能是本地环境,也有可能是集群环境。Spark Core:Spark最核心的模块,可以基于多种语言实现代码类的离线开发 【类似于MR】:Local:一般用于做测试,验证代码逻辑,不是分布式运行,只会启动1个进程来运行所有任务。

2301_79362607的博客 638

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

spark 查看yarn日志_2020年最新Spark企业级面试题【上】

前言 现在距离2021年还有不到一个月的时间了,是不是有的小伙明年不知该怎么复习spark,以及不知道该备战企业中会问到那些问题。好今天他来了总结了20个企业中经常被问到的面题以及会附带一些笔试题哦,编写不易建议收藏。一、 Spark 有几种部署方式?spark 中的部署模式分为三种 Standalone, Apache Mesos, Hadoop YARN,那他们分别有...

weixin_34792402的博客 125

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spark 入门学习

RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,代表一个不可变、可分区、里面的元素可并行计算的集合。Dataset:一个数据集合,用于存放数据的。Distributed:RDD中的数据是分布式存储的,可用于分布式计算。Resilient:RDD中的数据可以存储在内存中或者磁盘中,其分区可以动态的增加或减少。不可变(只读):RDD 是只读的,创建后不可修改,只能通过转换操作(mapjoin等)生成新的 RDD。

weixin_44361163的博客 1496

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Spark

Spark 文章目录Sparkdemo1WordCountdemo2WCSubmitRDD五大特性转换算子demo3Map(常用)demo4MapPartitiondemo5Filter(常用)FlatMap(常用)demo7SampleGroupBy(常用)demo9ReduceByKeydemo10Uniondemo11Join(常用)demo12MapValuesdemo13Sort(常用)demo14ActiondemoPIdemopartiton缓存demo1Cachedemo2Checkpoin

m0_57356943的博客 92

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

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

大数据 7893

Spark中RDD、DataFrame、DataSet的生成与互相转换(非常重要)

目录一、RDD的生成二、DataFrame的生成三、DataSet的生成四、RDD和DataFrame的转换(1)RDD转DataFrame方案一:直接将字段名称传入toDF中方案二:通过反射的方式方案三:构造Schema的方式(2)DataFrame转RDD五、RDD和DataSet的转换(1)RDD转DataSet方案一:使用toDS()算子方案二:使用spark.createDataset(rdd)(2)DataSet转RDD六、DataFrame与DataSet的转换(1)DataFrame转Dat

蔡政洁的博客 2871

Spark 的结构化 APIs——RDD,DataFrame, Dataset, SparkSQL 使用和原理总结

在本文中,我们将探索 Spark 的结构化 APIs(DataFrames and Datasets)。我们还将看下 Spark SQL 引擎是如何支撑高级的结构化 APIs 的。当Spark SQL在早期的Spark 1.x 中首次引入时, 随后是DataFrames继承了Spark 1.3中SchemaRDDs,此时我们第一次看到了Spark中的结构化 API。

奔跑的蜗牛的博客 2101

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系列:Spark SQL 之 RDD、DataFrame 和 Dataset 如何选择

在什么时候该选用 RDD、DataFrame 或 Dataset 看起来好像挺明显。前者可以提供底层的功能和控制,后者支持定制的视图和结构,可以提供高级和特定领域的操作,节约空间并快速运行。DataFrame 和 Dataset,或 RDD API,按你的实际需要和场景选一个来用吧!

兴趣是最好的老师 901

Spark中的RDD、DataFrame、DataSet简单总结

三者概念 RDD(Resilient Distributed DataSet) 弹性分布式数据集,是Spark中最基本的数据处理模型。在代码中是抽象类,代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。 弹性 存储的弹性:内存与磁盘的自动切换; 容错的弹性:数据丢失可以自动恢复; 计算的弹性:计算出错重试机制; 分片的弹性:可按需重新分片 不可变 RDD封装了计算逻辑不可改变,只能通过产生新的RDD并在新的RDD里面封装计算逻辑以此来改变 数据抽象 是一个抽象类,需要子类具体

Airy的博客 2745
上一篇: 八皇后问题(回溯问题)
下一篇: Spark 的工作流程
K. Bob
博客等级 码龄8年 82粉丝 294原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值