SparkCore,2024年最新真的醉了

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

rdd.map((func)
# func: f(T)->U

image.png

flatMap算子

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

# 嵌套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)的聚合操作

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

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

mapValues算子

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

rdd.mapValues(func)
# func: (V)->V
# 只针对value进行处理

groupBy算子

对RDD数据进行分组

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

image.png
[('b',[('b',1), ('b', 1), ('b',1)])('a',[('a',1),('a',1)])]
key是返回值,value是同组的数据

filter算子

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

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

image.png

distinct算子

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

union算子

将2个RDD合并为1个RDD并返回
rdd.union(other_rdd)
只合并(不同类型的RDD也可以合并),不去重
image.png

join算子

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

rdd.join(other_rdd) # 内连接
rdd.leftOuterJoin(other_rdd) # 左外连接
rdd.rightOuterJoin(other_rdd) # 右外连接

image.png

intersection算子

求2个RDD的交集,返回新RDD
rdd.intersection(other_rdd)
image.png

glom算子

将RDD数据加上嵌套,嵌套按分区进行
rdd.glom()
image.png
[[1,2,3,4],[5,6,7,8,9]]

groupByKey算子

针对KV型RDD,自动按照key分组
rdd.groupByKey()
分组后只保留同组的value

sortBy算子

对RDD数据进行排序,基于指定的排序依据

rdd.sortBy(func, ascending = False, numPartitions=1)
# func: (T)->U:按RDD中哪个数据进行排序,如lambda x:x[1]表示按照RDD中第二列元素进行排序
# ascending = True 按升序排序,False 按降序排序
# numPartitions 用多少分区排序

image.png
image.png

sortByKey算子

针对KV型RDD,按key进行排序
sortByKey(ascending=True,numPartitions=None,keyfunc=<function RDD.<lambda>>)

常用算子案例

将案例提交到YARN集群中运行

pycharm中直接执行
import os
os.environ["HADOOP\_CONF\_DIR"]="/export/server/hadoop/etc/hadoop"

rdd = sc.textFile("hdfs://node1:8020/input/order.text") # 集群中文件须使用hdfs文件

# 如果运行的文件依赖其他py文件,可以通过设置属性来指定依赖代码
conf.set("spark.submit.pyFiles","defs.py") # conf.set(key,value)

通过服务器上spark-submit提交到集群运行

–py-files可以指定以来的其他py代码,支持单py文件或zip压缩包
/export/server/spark/bin/spark-submit --master yarn --py-Files ./defs.py ./main.py

常用action算子

countByKey算子

统计key出现的次数,一般适用于KV型RDD
image.png

collect算子

将RDD各个分区内的数据统一到driver中,形成一个list对象
rdd.collect()

  1. 将RDD各个分区的数据都拉取到driver
  2. 拉取前应该了解到数据集不大
  3. 太大的数据集会撑爆内存
reduce算子

对RDD数据集按照传入逻辑进行聚合

rdd.reduce(func)
# func : (T,T)->T

rdd.parallelize(range(1,10))
print(rdd.reduce(lambda a,b:a+b))

fold算子[很少用]

和reduce一样,接受传入逻辑进行聚合;聚合带有初始值

  • 分区内聚合
  • 分区间聚合

[[1,2,3], [4,5,6], [7,8,9]]
初始值为10
分区1聚合后得到10+1+2+3 = 16
分区2聚合后得到10+4+5+6 = 25
分区3聚合后得到10+7+8+9 = 34

rdd = sc.parallelize(range(1,10),3)
print(rdd.fold(10,lambda a,b:a+b))

最终聚合结果为10 + 16 +25 +34 =85

first算子

取出RDD的第一个元素
rdd.parallelize([3,2,1]).first()
3

take算子

取RDD的前N个元素,组成list返回
rdd.parallelize([1,2,3,4,5,6,7,8,9]).take(5)
[1,2,3,4,5]

top算子

对RDD数据集进行降序排序,取前N个
rdd.parallelize([1,2,3,4,5,6,7,8,9]).top(5)
[9,8,7,6,5]

count算子

计算RDD有多少条数据,返回值是一个数字
rdd.parallelize([1,2,3,4,5,6]).count()
6

takeSample算子

随机抽样RDD的数据
takeSample(bool,takeSampleNum,seed)

  • bool为真:允许取同一个数据;bool为假,不允许取同一个数据
  • 采样(抽样)数量
  • 随机种子(一般不给,spark会自动给随即种子)
rdd = sc.parallelize([1,1,1,1,1,1,1,1],1)
print(rdd.takeSample(True,8))

takeOrdered算子

对RDD排序取前N个

rdd.takeOrdered(para1, para2)
# para1 取N个数据
# para2 对排序数据进行更改(不更改数据本身,只修改到临时排序的数值)
# 默认升序,需要到倒序可以使用para2重排序

image.png

foreach算子

对RDD的每一个元素,执行提供的逻辑操作(同map),不过没有返回值
rdd.foreach(func)
image.png

saveAsTextFile算子

将RDD数据接入到文本文件中
支持本地写出hdfs等文件系统
image.png

小注意

action算子中:

  • foreach
  • saveAsTextFile

这两个算子是分区(Executor)直接执行,跳过Driver
其余action算子都会将结果发送给Driver

mapPartitions算子

map算子每次处理一个元素
mapPartitions算子一次处理一个分区的数据,作为一个迭代器(一次性list)对象传入过来(一次处理一个迭代器)
image.png
image.png

foreachPartition算子

类似foreach,一次处理一整个分区
foreachPartition就是个没有返回值的mapPartitions
image.png

partitionBy算子

对RDD进行自定义分区操作(默认hash分区)

rdd.partitionBy(para1, para2)
para1 重新分区后的分区数
para2 自定义分区规则,返回值为int,分区编号[0,分区数-1]

image.png

repartition算子

对RDD的分区执行重新分区(仅数量上)
rdd.repartition(N)
image.png
分区须谨慎:一般情况下spark代码中除了全局排序设置为1个分区外,通常所有api中的分区相关代码都不太理会
分区影响:

  1. 影响并行计算(内存迭代的并行管道数量)
  2. 分区的增加极可能导致shuffle

repartition api最好不用,用也是减少分区(方便全局排序)
image.png

groupByKey算子和reduceByKey算子区别

如果对数据执行 分组+聚合 ,reduceByKey性能>>>groupByKey+聚合逻辑
image.png
groupByKey只可以分组;reduceByKey除了可以分组,还可以聚合
使用groupByKey就是先分组,后聚合;reduceByKey先预聚合,再分区,再聚合,减少IO
image.png

总结

RDD创建的几种方式
  1. 并行化集合的方式(本地集合转分布式集合)
  2. 读取数据的方式(TextFile、WholeTextFile)
RDD查看分区数

调用getNumPartitions api查看分区数(返回int)

transformation和action算子的区别

transformation转换算子的返回值还是RDD,action算子的返回值不是RDD
transformation转换算子懒加载,碰到action算子才会执行

哪两个action算子不经过Driver直接执行输出

foreach和saveAsTextFile,直接由executor执行输出

groupByKey和reduceByKey区别

groupByKey算子只有分组功能,没有聚合逻辑,需自行补充聚合逻辑
reduceByKey算子支持分组聚合,先预聚合、再分组、再聚合,效率更高,传输IO小

mapPartitions和foreachPartition的区别

mapPartitions是一个转换算子,有返回值
foreachPartition是一个action算子,没有返回值
两个算子都是一次处理一整个分区的数据

分区操作的注意项

尽量不要增加分区(分区划分好后),可能破坏内存迭代的计算管道

RDD持久化

RDD过程数据

RDD之间进行相互迭代的计算(Transformation转换),执行开始后,新RDD产生,旧RDD消失
RDD的数据是过程数据,处理过程中存在,处理完成则清除
最大化利用资源,没用的RDD就会从内存中被清除,给后续的计算腾出空间

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

65)]
[外链图片转存中…(img-IJVt2VmO-1712988692466)]
[外链图片转存中…(img-yF3mDVLG-1712988692466)]
[外链图片转存中…(img-PBiZsVEA-1712988692467)]
[外链图片转存中…(img-eFL2fJV8-1712988692467)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
[外链图片转存中…(img-PaNdqyp1-1712988692467)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值