SparkCore

文章目录

RDD详解

为什么需要RDD

分布式计算需要:

  • 分区控制
  • shuffle控制(不同分区进行数据传输)
  • 数据存储、序列化、发送
  • 数据计算API
  • 其他一系列功能

这些功能不能简单地通过python内置的本地集合对象(list、dict等)来实现,在分布式框架中,需要有一个统一的数据抽象对象,来实现上述分布式计算所需功能。

上述抽象对象:RDD

什么是RDD

Resilient Distributed Dataset,弹性分布式数据集,spark中最基本的数据抽象,代表一个不可变、可分区、里面元素可并行计算的集合

Resilient:数据可存放在内存或磁盘中

Distributed:数据是分布式存储的,可用于分布式计算(数据跨机器存储、跨进程存储;本地集合:数据全部在一个进程内部)

Dataset:数据集合,用来存放数据

RDD 5大特性

RDD数据结构内部有5大特性,前3个特性每个RDD都具备,后2个特性可选

  1. RDD有分区
  2. 计算方法作用到每一个分区(分片)之上
  3. RDD之间相互依赖
  4. KV型RDD可以有分区器
  5. RDD分区数据的读取尽量靠近数据所在地(数据不动,数据在哪,就在哪个机器上计算)

RDD有分区

分区是RDD数据存储的最小单位

一份RDD数据,本质上是分隔成了多个分区

RDD方法会作用在所有分区上

map方法体现在了每一个分区上

glom方法,将一个分区的数据转换为相同类别的内存数组进行处理,分区不变

RDD之间有依赖关系



KV型RDD可以有分区器

KV型RDD:RDD内存储的数据是二元元组,如("hadoop",3)

默认分区器:Hash分区规则,可以通过rdd.partitionBy方法手动设置一个分区器

这个特性只是可能的,因为并不是所有RDD都是KV型

RDD分区尽量靠近数据所在服务器

初始RDD(读取数据的时候)规划的时候,分区尽量规划到存储数据所在的服务器上

因此,尽量走本地读取,避免网络读取

本地读取:Executor所在服务器,也是一个DataNode,同时这个DataNode上有它要读的数据,因此可以直接读取硬盘,而不需要走网络

网络读取:读取数据时,需要经历网络传输才能读取到

因此,spark会在确保并行计算能力的前提下,尽量本地读取(非100%)

wordCount中RDD


总结

如何正确理解RDD

弹性分布式数据集,分布式计算的实现载体(数据抽象)

RDD 5大特性

  1. 可分区
  2. 方法应用到每一个分区
  3. RDD相互依赖
  4. KV型RDD可以有分区器
  5. RDD构建尽量靠近数据

RDD编程入门

程序执行入口--SparkContext对象

Spark RDD编程的程序入口对象是SparkContext对象(不论何种语言)

只有构建出SparkContext,基于sc才能执行后续的API调用和计算

本质上sc对编程来说,主要功能就是创建出第一个RDD出来

RDD创建

RDD创建的两种方式:

  1. 通过并行化集合创建(本地对象 转 分布式RDD)
  2. 读取外部数据源(读取文件)

并行化创建

读取文件创建

通过textFile API 读取本地数据或hdfs数据
sc.textFile(para1, para2)

para1必填,文件路径

para2可选,最小分区数(spark有自己的判断,允许范围内,para2有效,允许范围外,para2无效)

wholeTextFile

读取文件的API,适用于读取一堆小文件

RDD算子

算子

分布式集合对象上的API,称为算子

本地对象的API叫方法、函数

算子分类

  • Transformation:转换算子
  • Action:动作(行动)算子
transformation转换算子

定义:返回值仍然是一个RDD,称为转换算子

特性:lazy懒加载,如果没有action算子,则transformation算子不工作

action动作算子

定义:返回值不是RDD的就是action算子

区分

transformation转换算子相当于构建执行计划,action动作算子相当于执行计划

常用transformation转换算子

map算子

将RDD的数据一条一条处理(处理逻辑:基于map算子中接受的处理函数),返回新的RDD

python 复制代码
rdd.map((func)
# func: f(T)->U

flatMap算子

对RDD执行map操作,然后进行解除嵌套操作

python 复制代码
# 嵌套list
lst = [[1,2,3],[4,5,6],[7,8,9]]

# 解除嵌套
lst = [1,2,3,4,5,6,7,8,9]

flatMap传入参数和map一致,就是给map逻辑用的,在map逻辑上解除嵌套

reduceByKey算子

针对KV型RDD,自动按照key分组,根据提供的聚合逻辑,完成组内数据(value)的聚合操作

python 复制代码
rdd.reducebyKey(func)
# func: (V,V)->V
# 接受两个类型一致的传入参数,返回值类型也和传入一致

key相同的分为一组,再根据value聚合

mapValues算子

针对二元元组RDD,对其元组内部的value执行map操作

python 复制代码
rdd.mapValues(func)
# func: (V)->V
# 只针对value进行处理

groupBy算子

对RDD数据进行分组

python 复制代码
rdd.groupBy(func)
# func: (T)->K
# 拿到返回值后,将相同返回值放入一个组中
# 分组完成后,每个组是一个二元元组,key是返回值,同组的数据放入迭代器中作为value


[('b',[('b',1), ('b', 1), ('b',1)])('a',[('a',1),('a',1)])]

key是返回值,value是同组的数据

filter算子

过滤想要的数据,进行保留

python 复制代码
rdd.filter(func)
# func: (T)->bool 
# 传入的参数任意类型,返回值必须是布尔型(真True、假False)

distinct算子

对RDD进行去重,返回新RDD
rdd.distinct(参数) # 参数为去重分区数量,按几个分区进行去重,一般不传

union算子

将2个RDD合并为1个RDD并返回
rdd.union(other_rdd)

只合并(不同类型的RDD也可以合并),不去重

join算子

对2个RDD进行join(可实现SQL的内、外连接)
join算子只能用于二元元组

python 复制代码
rdd.join(other_rdd) # 内连接
rdd.leftOuterJoin(other_rdd) # 左外连接
rdd.rightOuterJoin(other_rdd) # 右外连接
相关推荐
老蒋新思维31 分钟前
创客匠人 2025 万人峰会核心:AI 驱动知识产品变现革新
大数据·人工智能·网络协议·tcp/ip·创始人ip·创客匠人·知识变现
expect7g32 分钟前
Paimon源码解读 -- FULL_COMPACTION_DELTA_COMMITS
大数据·后端·flink
老蒋新思维2 小时前
创客匠人峰会新视角:AI 时代知识变现的 “组织化转型”—— 从个人 IP 到 “AI+IP” 组织的增长革命
大数据·人工智能·网络协议·tcp/ip·创始人ip·创客匠人·知识变现
TMO Group 探谋网络科技2 小时前
AI Agent工作原理:如何连接数据、决策与行动,助力企业数字化转型?
大数据·人工智能·ai
Chasing Aurora3 小时前
Git 工程指引(命令+问题)
大数据·git·elasticsearch·团队开发·互联网大厂
TG:@yunlaoda360 云老大4 小时前
阿里云国际站代理商RPA跨境服务的适用场景有哪些?
大数据·阿里云·rpa
微盛企微增长小知识4 小时前
2025企业微信服务商测评:头部服务商微盛AI·企微管家技术实力与落地效果解析
大数据·人工智能·企业微信
TMO Group 探谋网络科技4 小时前
AI电商的应用:Magento 使用 Adobe 生成式 AI改造7大业务场景
大数据·人工智能·adobe·ai
UI设计兰亭妙微5 小时前
理性数据,温柔体验:北京兰亭妙微解码 Hydra Corps. 企业管理界面的 “松弛感设计”
大数据·人工智能·用户体验设计
慎独4135 小时前
家家有:从单向支出到价值循环,绿色积分如何 重构商业逻辑?
大数据·人工智能