RDD:

优点:

1.   编译时类型安全 
编译时就能检查出类型错误

2.   面向对象的编程风格 
直接通过类名点的方式来操作数据

缺点:

1.   序列化和反序列化的性能开销 
无论是集群间的通信, 还是IO操作都需要对对象的结构和数据进行序列化和反序列化.

2.   GC的性能开销 
频繁的创建和销毁对象,势必会增加GC

importorg.apache.spark.sql.SQLContext

importorg.apache.spark.{SparkConf, SparkContext}

object Run {

defmain(args: Array[String]) {

val conf = new SparkConf().setAppName("test").setMaster("local")

valsc = new SparkContext(conf)

sc.setLogLevel("WARN")

valsqlContext = new SQLContext(sc)

/**

* id     age

* 1      30

* 2      29

* 3      21

*/

case class Person(id: Int, age: Int)

validAgeRDDPerson = 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

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也不是面向对象风格的.

importorg.apache.spark.sql.types.{DataTypes, StructField, StructType}

importorg.apache.spark.sql.{Row, SQLContext}

importorg.apache.spark.{SparkConf, SparkContext}

object Run {

defmain(args: Array[String]) {

val conf = new SparkConf().setAppName("test").setMaster("local")

valsc = new SparkContext(conf)

sc.setLogLevel("WARN")

valsqlContext = 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)))

validAgeDF = sqlContext.createDataFrame(idAgeRDDRow, schema)

// API不是面向对象的

idAgeDF.filter(idAgeDF.col("age") > 25)

//不会报错, DataFrame不是编译时类型安全的

idAgeDF.filter(idAgeDF.col("age") > "")

}

}

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)

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

//sqlContext.createDataFrame(idAgeRDDRow, schema)方法的实现, 返回值依然是DataFrame

def createDataFrame(rowRDD: RDD[Row], schema:StructType): DataFrame = {

sparkSession.createDataFrame(rowRDD,schema)

}

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

package object sql{

// ...省略了不相关的代码

type DataFrame = Dataset[Row]

}

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

下面是一段DataSet的示例代码

importorg.apache.spark.sql.types.{DataTypes, StructField, StructType}

importorg.apache.spark.sql.{Row, SQLContext}

importorg.apache.spark.{SparkConf, SparkContext}

object Test {

defmain(args: Array[String]) {

val conf = new SparkConf().setAppName("test").setMaster("local")//调试的时候一定不要用local[*]

valsc = 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]

validAgeDS = 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()

}

}

参考

Introducing ApacheSpark Datasets 
APACHE SPARK: RDD,DATAFRAME OR DATASET? 
http://www.jianshu.com/p/c0181667daa0
Spark2.0.0-preview官方文档

Spark RDD、DataFrame和DataSet的区别相关推荐

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

    一.RDD.DataFrame和DataSet的定义 在开始Spark RDD与DataFrame与Dataset之间的比较之前,先让我们看一下Spark中的RDD,DataFrame和Dataset ...

  2. RDD, DataFrame or Dataset

    RDD, DataFrame or Dataset @(SPARK)[spark] 文章主要内容来自: https://databricks.com/blog/2016/05/11/apache-sp ...

  3. DataFrame与Dataset 的区别

    DataFrame与Dataset 的关系 DataFrame与Dataset一般与spark ml同时使用 DataFrame与Dataset均支持sparksql的操作,比如select,grou ...

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

    1.概述 这是一个面试题 在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似传统数据库中的二维表格 DataFrame与RDD的主要区别在于,前者带有schema元数据信息,既 ...

  5. spark RDD 的map与flatmap区别说明(转)

    转载前备注: 下面的实验全部在spark-shell中运行即可 #------------------------------------------------------------------- ...

  6. 【大数据开发】SparkSQL——RDD、DataFrame、DataSet相互转换、DSL常用方法、SQL风格语法、Spark读写操作、获取Column对象的方式

    take,takeAsList是Action操作 limit⽅法获取指定DataFrame的前n⾏记录,得到⼀个新的DataFrame对象.和take与head不同的是,limit⽅法不是Action ...

  7. spark sql定义RDD、DataFrame与DataSet

    RDD 优点: 编译时类型安全 编译时就能检查出类型错误 面向对象的编程风格 直接通过类名点的方式来操作数据 缺点: 序列化和反序列化的性能开销 无论是集群间的通信, 还是IO操作都需要对对象的结构和 ...

  8. 专业工程师看过来~ | RDD、DataFrame和DataSet的细致区别

    作者:苏小宝,现任华为工程师. RDD.DataFrame和DataSet是容易产生混淆的概念,必须对其相互之间对比,才可以知道其中异同. RDD和DataFrame 上图直观地体现了DataFram ...

  9. spark基础之RDD和DataFrame和Dataset比较

    一 SparkSQL简介 Spark SQL是一个能够利用Spark进行结构化数据的存储和操作的组件,结构化数据可以来自外部结构化数据源也可以通过RDD获取. 外部的结构化数据源包括Hive,JSON ...

  10. 大数据入门:Spark RDD、DataFrame、DataSet

    在Spark的学习当中,RDD.DataFrame.DataSet可以说都是需要着重理解的专业名词概念.尤其是在涉及到数据结构的部分,理解清楚这三者的共性与区别,非常有必要.今天的大数据入门分享,我们 ...

最新文章

  1. mysql和mongodb配合_MongoDB和Mysql怎样结合
  2. TikTok英国市场你不能不知道的10大数据
  3. python开发的前景_python开发前景怎么样
  4. SAP Hybris: 中国B2B电商转型势在必行
  5. 8K 星!这可能是最适合你的 TensorFlow 教程
  6. css hot loader,解决安装react-hot-loader后修改css/less文件不会热更新问题
  7. transport request 实现原理
  8. 云专网和云专线的区别_传统IDC行业与云计算的区别?
  9. 优步杭州推出顺路接单功能,不久将向全国开放!
  10. Ugly Number leetcode java
  11. Office 2016 for mac 打开闪退/出现问题,提示发送错误报告
  12. USDA土壤粒径分布图及韦恩图在线绘制-USDA_Soil_Texture_Calculator soil textual triangle
  13. oracel vm 安装windows server 2012报错Error 0x000000C4
  14. srt格式导入pr乱码_PR软件导入字幕文件后显示乱码如何解决
  15. 快速搭建接口自动化平台
  16. 解决LaTeX中的\pdfendlink ended up in different nesting level than \pdfstartlink.问题
  17. 搭建asp会议签到系统 第四章 会议统计
  18. PLC 变频器、触摸屏综合实训平台
  19. KeyError: ‘label‘
  20. php 实现信息采集(网页内容抓取)程序代码

热门文章

  1. 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表't_ArticleFiles'中的标识列指定显式值。...
  2. 从 AVFrame 中取出帧(YUV)保存为 Mat 格式
  3. MySQL连接localhost失败
  4. Grasshopper 2.0 MP Color FireWire 1394b (Sony ICX274)
  5. jQuery源码学习之六 (jQUery中扩展方法)
  6. Winform 类似于WINDOWS的选择文件夹对话框
  7. LOJ2336 JOI2017 绳 贪心、构造
  8. nodejs之querystring模块
  9. Three.js 学习笔记(1)--坐标体系和旋转
  10. Remove Untagged Images From Docker