1. DataFrame概念

DataFrame的前身是SchemaRDD,从Spark 1.3.0开始SchemaRDD更名为DataFrame。与SchemaRDD的主要区别是:DataFrame不再直接继承自RDD,而是自己实现了RDD的绝大多数功能。你仍旧可以在DataFrame上调用rdd方法将其转换为一个RDD。

在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库的二维表格,DataFrame带有Schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型,但底层做了更多的优化。DataFrame可以从很多数据源构建,比如:已经存在的RDD、结构化文件、外部数据库、Hive表。

2. DataFrame与RDD的区别

RDD可看作是分布式的对象的集合,Spark并不知道对象的详细模式信息,DataFrame可看作是分布式的Row对象的集合,其提供了由列组成的详细模式信息,使得Spark SQL可以进行某些形式的执行优化。

DataFrame和普通的RDD的逻辑框架区别如下所示:

左侧的RDD[Person]虽然以Person为类型参数,但Spark框架本身不了解 Person类的内部结构。

而右侧的DataFrame却提供了详细的结构信息,使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。DataFrame多了数据的结构信息,即schema。这样看起来就像一张表了,DataFrame还配套了新的操作数据的方法,DataFrame API(如df.select())和SQL(select id, name from xx_table where …)。

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

RDD是分布式的Java对象的集合。DataFrame是分布式的Row对象的集合。DataFrame除了提供了比RDD更丰富的算子以外,更重要的特点是提升执行效率、减少数据读取以及执行计划的优化。

有了DataFrame这个高一层的抽象后,我们处理数据更加简单了,甚至可以用SQL来处理数据了,对开发者来说,易用性有了很大的提升。

不仅如此,通过DataFrame API或SQL处理数据,会自动经过Spark 优化器(Catalyst)的优化,即使你写的程序或SQL不高效,也可以运行的很快。

3. DataFrame与RDD的优缺点

RDD的优缺点: 
优点:

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

缺点:

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

DataFrame通过引入schema和off-heap(不在堆里面的内存,指的是除了不在堆的内存,使用操作系统上的内存),解决了RDD的缺点, Spark通过schame就能够读懂数据, 因此在通信和IO时就只需要序列化和反序列化数据, 而结构的部分就可以省略了;通过off-heap引入,可以快速的操作数据,避免大量的GC。但是却丢了RDD的优点,DataFrame不是类型安全的, API也不是面向对象风格的。

Spark RDD与DataFrame相关推荐

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

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

  2. Spark RDD与DataFrame相互转换

    @羲凡--只为了更好的活着 Spark RDD与DataFrame相互转换 Q:Spark中RDD转成DataFrame用什么算子 A:.rdd Q:Spark中DataFrame转成RDD用什么算子 ...

  3. Spark RDD、DataFrame原理及操作详解

    RDD是什么? RDD (resilientdistributed dataset),指的是一个只读的,可分区的分布式数据集,这个数据集的全部或部分可以缓存在内存中,在多次计算间重用. RDD内部可以 ...

  4. Spark —— RDD、DataFrame 与 Dataset

    0. DataFrame 的成员函数及操作 DataFrame 需要有属性列名,比如某 df有两个属性列,user/artist: df.agg(min("user"), max( ...

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

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

  6. spark与python关系_spark: RDD与DataFrame之间的相互转换方法

    DataFrame是一个组织成命名列的数据集.它在概念上等同于关系数据库中的表或R/Python中的数据框架,但其经过了优化.DataFrames可以从各种各样的源构建,例如:结构化数据文件,Hive ...

  7. scala写入mysql_spark rdd转dataframe 写入mysql的实例讲解

    dataframe是在spark1.3.0中推出的新的api,这让spark具备了处理大规模结构化数据的能力,在比原有的RDD转化方式易用的前提下,据说计算性能更还快了两倍.spark在离线批处理或者 ...

  8. python print rdd_spark: RDD与DataFrame之间的相互转换方法

    DataFrame是一个组织成命名列的数据集.它在概念上等同于关系数据库中的表或R/Python中的数据框架,但其经过了优化.DataFrames可以从各种各样的源构建,例如:结构化数据文件,Hive ...

  9. Spark SQL之RDD转DataFrame

    准备文件 首先准备好测试文件info.txt,内容如下: 1,vincent,20 2,sarah,19 3,sofia,29 4,monica,26 将RDD转成DataFrame 方式一:反射 可 ...

最新文章

  1. 【救援过程】升级openssl导致libcrypto.so.1.1动态库不可用
  2. usr share里没有mysql_无法在ubuntu 12.04上安装mysql,找不到消息文件’/usr/share/mysql/errmsg.sys’...
  3. 解决 Python shell 中 Delete/Backspace 键乱码问题
  4. js自定义类,混合的构造函数/原型方式
  5. Java多线程初学者指南(5):join方法的使用
  6. commons-lang3:DateUtils
  7. Android 获取ROOT权限原理解析
  8. 2014_shanghai_visit
  9. 判断语句_如何学好C语言判断语句?攻略if语句是第一步
  10. SpringBoot 精通系列-创建SpringBoot的入门项目
  11. hp虚拟服务器,源自基础设施灵活多变的终极自由 惠普(HP)虚拟连接技术(Virtual Connect)...
  12. composition java_阿里P7架构师通过源码浅析Java中的资源加载
  13. 基于NSString处理文件的高级类
  14. C# 数组、ArrayList、List、Dictionary的用法与区别
  15. mysql for mac
  16. Discuz 群组 新加入 活跃成员 成员列表 会员数量问题!
  17. 【181023】有意思的屏幕画笔,基于VC++实现
  18. binary 和 varbinary 用法全解
  19. nginx源码准备 - Linux C++网络编程(五)
  20. 开源协议及应用 (BSD/GPL/LGPL/Apache/MIT)

热门文章

  1. spring 扫描所有_从Spring的几个阶段理解其工作过程
  2. mysql执行动态批处理,使用BAT批处理执行sql语句的代码
  3. 区位码\机器码\内码关系
  4. task文件服务器无法输入,Win10系统无法启动task scheduler服务的解决方法
  5. horizon服务主要模块_OpenStack组件——Horizon Web界面管理服务
  6. 2021年东港二中高考成绩查询,辽宁省东港二中2021届英语高考模拟试卷1(新课改原创2020版,供2021年课改省份考生使用)...
  7. java 定时器delay_技术贴-java 定时器
  8. switch语句可以被代替吗_大空间建筑内的消防水炮可以代替喷淋装置吗
  9. python open 相对路径_第十四篇:Python中文件读写
  10. python使用近似公式计算e_python如何算自然底数e(方法二)