如何理解spark中RDD和DataFrame的结构?

2024-08-27 12:08

本文主要是介绍如何理解spark中RDD和DataFrame的结构?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

RDD中可以存储任何的单机类型的数据,但是,直接使用RDD在字段需求明显时,存在算子难以复用的缺点。

例如,现在RDD存的数据是一个Person类型的数据,现在要求所有每个年龄段(10年一个年龄段)的人中最高的身高与最大的体重。

使用RDD接口,因为RDD不了解其中存储的数据的具体结构,数据的结构对它而言是黑盒,于是这就需要用户自己去写一个很特化的聚合的函数来完成这样的功能。

而有了DataFrame,则框架会去了解RDD中的数据是什么样的结构的,用户可以说清楚自己对每一列进行什么样的操作,这样就有可能可以实现一个算子,用在多个列上,比较容易进行算子的复用。甚至,未来又要同时求出每个年龄段内不同的姓氏有多少个,则使用RDD接口,之前的函数需要改动很大才能满足需求,而使用DataFrame接口,则只需要添加对这一个列的处理,原来的max/min的相关列处理都可保持不变。

总而言之,DataFrame相关接口就是RDD的一个扩展,让RDD了解了RDD中存储的数据包含哪些列,并可以在列上进行操作。

另外,DataFrame基本上快要被Dataset接口取代了,你可以再去了解下Dataset接口。


作者:张云聪
链接:https://www.zhihu.com/question/48684460/answer/112346482
来源:知乎

著作权归作者所有,转载请联系作者获得授权。


作者:CyannyLiang
链接:https://www.zhihu.com/question/48684460/answer/123355450
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

旅行中无意看到这个问题,最近的项目和spark dataframe相关,也来谈谈自己的理解啦
Spark RDD是分布式弹性数据集,一个比较核心的是粗粒度的分布式计算,粗粒度是指用户不用关心太多的分布式细节,用声明式的API就能完成分布式计算,比如Word Count用一行就能写完。RDD易用性很好,那Spark为啥还要有Dataframe呢?
DataFrame的从API上借鉴了R和pandas的DataFRame的概念,是业界标准结化数据处理API。DataFrame的数据抽象是命名元组,代码里是Row类型,Dataframe结合了过程化编程和声名式的API,让用户能用过程化编程的方法处理结构化数据。
Dataframe比RDD多了限制,带来了更多的优化,基于Spark Catalyst优化器,提供如列裁剪,谓词下推,map join等优化。同时,采用code generation ,动态编译表达式,提升性能,比用rdd的自定义函数性能高5倍左右。
举个例子,
rdd.map(lambda line: line.split("\t")).map(lambda items: (items[0], items[1], items[2], items[3])).filter(lambda items: int(items[2]) >= 19).select(lambda items: (items[0], items[1]))
sqlContext.table("people").filter(col("age") >= 19).select("id", "name")
用rdd读结构化文本要用map函数,需要按位置获取数据,没有schema,性能和可读性都不好。
而用dataframe可以直接通过sede读取结构化数据,性能比RDD高2到3倍左右,比MR高5倍左右,同时,具有结构化的数据,可读性更好。
DataFrame具有很好的易用性,支持多种语言,在一个上下文可以写udf,具有部署一致性,以前写HQL Transform的用户可以试试Dataframe,在复杂统计分析中,有dataframe可以过程化编程,模块化会更好,可读性强。
Dataframe可以用df.rdd等方式转化为RDD,处理更多灵活的操作。

Spark2.0推出DataSet,是更加强类型的API,用了scala的泛型,能在编译是发现更多的编译问题DataFrame是DataSet〈Row〉类型,DS在接口上和DataFrame很相似。感觉是为了和structured streaming 统一做铺垫。

另外,看到Apache Beam这个google的开源项目正在用flume java的API统一google cloud api ,spark和flink这个和bigflow很像。

从用过dataframe的同事反馈,dataframe的易用性、性能都挺好。

这篇关于如何理解spark中RDD和DataFrame的结构?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111627

相关文章

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Python中DataFrame转列表的最全指南

《Python中DataFrame转列表的最全指南》在Python数据分析中,Pandas的DataFrame是最常用的数据结构之一,本文将为你详解5种主流DataFrame转换为列表的方法,大家可以... 目录引言一、基础转换方法解析1. tolist()直接转换法2. values.tolist()矩阵

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危