本文作为Spark SQL的第二篇文章,主要讲述一下RDD、DataFrame/DataSet之间的关系及相互转换。

文章主要从以下几个方面进行阐述:

1、Spark中的模块

2、什么是DataFrame

3、RDD和DataFrame的区别

4、什么是DataSet

5、RDD和Dataset的区别

6、Dataset和DataFrame的区别与联系

7、DataSet的创建

8、RDD转DataFrame原因及方式

9、DataFrame转RDD原因及方式

1、Spark中的模块

上图展示了Spark的模块及各模块之间的关系,底层是Spark-core核心模块,Spark每个模块都有一个核心抽象,Spark-core的核心抽象是RDD,Spark SQL等都基于RDD封装了自己的抽象,在Spark SQL中是DataFrame/DataSet。相对来说RDD是更偏底层的抽象,DataFrame/DataSet是在其上做了一层封装,做了优化,使用起来更加方便。从功能上来说,DataFrame/DataSet能做的事情RDD都能做,RDD能做的事情DataFrame/DataSet不一定能做。

2、什么是DataFrame

在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。

3、RDD和DataFrame的区别

DataFrame与RDD的主要区别在于,DataFrame带有schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。使得Spark SQL得以洞察更多的结构信息,从而对藏于DataFrame背后的数据源以及作用于DataFrame之上的变换进行了针对性的优化,最终达到大幅提升运行时效率的目标。

RDD,由于无从得知所存数据元素的具体内部结构,Spark Core只能在stage层面进行简单、通用的流水线优化。 DataFrame底层是以RDD为基础的分布式数据集,和RDD的主要区别的是:RDD中没有schema信息,而DataFrame中数据每一行都包含schema

DataFrame = RDD[Row] + shcema

4、什么是DataSet

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

5、RDD和Dataset的区别

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

6、Dataset和DataFrame的区别与联系

区别:

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

联系:

  1. 在spark2.x,DataFrame和Dataset的api进行了统一
  2. 在语法角度,DataFrame是Dataset中每一个元素为Row类型的特殊情况
    type DataFrame = Dataset[Row]
  3. DataFrame和Dataset实质上都是一个逻辑计划,并且是懒加载的,都包含着scahema信息,只有到数据要读取的时候,才会将逻辑计划进行分析和优化,并最终转化为RDD
  4. 二者由于api是统一的,所以都可以采用DSL和SQL方式进行开发,都可以通过sparksession对象进行创建或者是通过transform转化操作得到

7、DataSet的创建

DataSet的创建在上一篇文章《Spark SQL入门详解》中已经介绍。更多信息可以参见官方文档:

http://spark.apache.org/docs/2.2.1/sql-programming-guide.html#creating-datasets

8、RDD转DataFrame原因及方式

可以将RDD转成DataFrame之后,借用sparksql和sql以及HQL语句快速方便的使用sql语句统计和查询,比如说分组排名(row_number() over()) 分析函数和窗口函数去实现占比分析。

将RDD转化为DataFrame有两种方式:

方式一:通过反射推断schema 要求:RDD的元素类型必须是case class

方式二、编程指定schema 要求:RDD的元素类型必须是Row 自己编写schema(StructType) 调用SparkSession的createDatafrmame(RDD[Row],schema)

9、DataFrame转RDD原因及方式

  1. 解决一些使用sql难以处理的统计分析
  2. 将数据写入Mysql

a.DataFrame的write.jdbc,仅支持四种模式:append、overwrite、ignore、default

b.使用rdd的话,除了上述以外还支持insert 和 update操作,还支持数据库连接池 (自定 义,第三方:c3p0 hibernate mybatis)方式,批量高效将大量数据写入 Mysql

方式: DataFrame转换为RDD相对来说比较简单,只需要调用DataFrame的RDD算子即可。

dataframe 如何选中某列的一行_Spark中的RDD、DataFrame和DataSet讲解相关推荐

  1. dataframe 如何选中某列的一行_PySpark和SparkSQL基础:如何利用Python编程执行Spark(附代码)

    作者:Pinar Ersoy 翻译:孙韬淳 校对:陈振东 本文约2500字,建议阅读10分钟 本文通过介绍Apache Spark在Python中的应用来讲解如何利用PySpark包执行常用函数来进行 ...

  2. dataframe 如何选中某列的一行_如何用 Python 在笔记本上分析 100GB 数据?

    许多组织都想尽可能多地收集和利用数据,从而改进业务.增加收入和提升影响力.因此,数据科学家们要面对 50GB,甚至 500GB 数据集的场景变得越来越普遍. 目前,这些数据集处理起来有点麻烦.就大小而 ...

  3. dataframe 如何选中某列的一行_带你领略pandas中多表之间如何处理

    但我们在处理Pandas多表数据时,我们需要将多个表之间进行表格的连接与合并,当连接完多表之后我们可能还需要对数据进行多重的索引,方便我们更快的找到数据,以及对数据进行做透视表,更加直观的去观察我们的 ...

  4. dataframe 如何选中某列的一行_快速解释如何使用pandas的inplace参数

    介绍 在操作dataframe时,初学者有时甚至是更高级的数据科学家会对如何在pandas中使用inplace参数感到困惑. 更有趣的是,我看到的解释这个概念的文章或教程并不多.它似乎被假定为知识或自 ...

  5. pandas为dataframe添加新的数据行(rows)、在dataframe后面纵向添加一行数据(数据为列表list形式)、列有不匹配将会使用NA值进行填补

    pandas为dataframe添加新的数据行(rows).在dataframe后面纵向添加一行数据(数据为列表list形式).列有不匹配将会使用NA值进行填补 目录

  6. Excel ,三步 快速实现应用一个公式到一列或一行中

    1.全选一列或一行 2.输入公式 记得在全选中某列或某行后,要手动输入一个字符(等号)哦(目的占位符),然后可以粘贴公式,再删除那个字符(有时或许需要删除) 3. 同时按 Ctrl +Enter re ...

  7. python dataframe 列_python pandas库中DataFrame对行和列的操作实例讲解

    用pandas中的DataFrame时选取行或列: import numpy as np import pandas as pd from pandas import Sereis, DataFram ...

  8. dataframe 一列的不同值_pandas | 详解DataFrame中的apply与applymap方法

    点击上方蓝字,关注并星标,和我一起学技术. 今天是pandas数据处理专题的第5篇文章,我们来聊聊pandas的一些高级运算. 在上一篇文章当中,我们介绍了panads的一些计算方法,比如两个data ...

  9. python dataframe的某一列变为list_Python数据分析系列文章之Pandas(上)

    本篇是[机器学习与数据挖掘]头条号原创首发Python数据分析系列文章的第三篇 Python数据分析系列文章之Python基础篇 Python数据分析系列文章之Numpy Python数据分析系列文章 ...

  10. python怎么选取不连续的列_用pandas中的DataFrame时选取行或列的方法

    如下所示: import numpy as np import pandas as pd from pandas import Sereis, DataFrame ser = Series(np.ar ...

最新文章

  1. “30位新生代数字经济人才”选拔开启!@乌镇·世界互联网大会
  2. matlab求xk符号解,matlab符号运算习题
  3. P2796-Facer的程序【dp】
  4. dvwa安装包linux,dvwa安裝、配置、使用教程(Linux)
  5. ES6的class方法基本用法
  6. 关于通过ServletContext获取数据出现的http500的错误的解决方案
  7. ~~试除法判定质数 (附模板题)
  8. Visual Studio 安装自定义插件
  9. Mybatis一对一和一对多配置
  10. Nginx架构详解:nginx 的安装和配置
  11. Matlab图例legend换行
  12. java pdf打印_Java 打印PDF文档(3种方式)
  13. MySQL索引失效、优化的方法
  14. 原生JS制作网页中的倒计时效果
  15. Linux 添加开机启动项的三种方法
  16. 一个中专生:我在华为面试的真实经历
  17. 小米手机5s获得root权限的经验
  18. 《Understanding and Diagnosing Visual Tracking Systems》论文笔记
  19. python将图片转成灰度图
  20. CSO关注:企业安全遭受攻击的15个迹象

热门文章

  1. 【图像处理】基于matlab颜色恒常性算法水下图像处理【含Matlab源码 474期】
  2. 【光学】基于matlab圆孔衍射动态模拟【含Matlab源码 795期】
  3. 【通信】基于matlab GUI短波通信系统仿真【含Matlab源码 647期】
  4. 【优化调度】基于matlab人工鱼群算法求解梯级水库调度优化问题【含Matlab源码 415期】
  5. 使用Pytorch的LSTM文本分类
  6. 怎样理解电脑评分_电脑可以理解我们的情绪吗?
  7. ubuntu chrome下载地址
  8. php当前工作目录路径,Linux_Linux下使用Shell脚本改变当前工作路径,       She - phpStudy...
  9. 开关电源仿真与设计基于spice 第2版 中译本_亚成微招聘模拟IC设计师、FAE工程师、系统测试工程师...
  10. datatable的数据进行组内排序_极客算法训练笔记(六),十大经典排序之希尔排序,快速排序...