SparkCore,2024年最新大数据开发开发技术总结

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

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

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

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

image.png
map方法体现在了每一个分区上
glom方法,将一个分区的数据转换为相同类别的内存数组进行处理,分区不变

RDD之间有依赖关系

image.png
image.png
image.png

KV型RDD可以有分区器

KV型RDD:RDD内存储的数据是二元元组,如(“hadoop”,3)
默认分区器:Hash分区规则,可以通过rdd.partitionBy方法手动设置一个分区器
这个特性只是可能的,因为并不是所有RDD都是KV型

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

初始RDD(读取数据的时候)规划的时候,分区尽量规划到存储数据所在的服务器上
因此,尽量走本地读取,避免网络读取
本地读取:Executor所在服务器,也是一个DataNode,同时这个DataNode上有它要读的数据,因此可以直接读取硬盘,而不需要走网络
网络读取:读取数据时,需要经历网络传输才能读取到

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

wordCount中RDD

image.png
1708676054434.png

总结

如何正确理解RDD

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

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

RDD编程入门

程序执行入口–SparkContext对象

Spark RDD编程的程序入口对象是SparkContext对象(不论何种语言)
只有构建出SparkContext,基于sc才能执行后续的API调用和计算
本质上sc对编程来说,主要功能就是创建出第一个RDD出来
image.png

RDD创建

RDD创建的两种方式:

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

image.png

读取文件创建

通过textFile API 读取本地数据或hdfs数据
sc.textFile(para1, para2)
para1必填,文件路径
para2可选,最小分区数(spark有自己的判断,允许范围内,para2有效,允许范围外,para2无效)
image.png
wholeTextFile
读取文件的API,适用于读取一堆小文件
image.png

RDD算子

算子

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

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

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

定义:返回值仍然是一个RDD,称为转换算子
特性:lazy懒加载,如果没有action算子,则transformation算子不工作

action动作算子

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

区分

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

常用transformation转换算子

map算子

将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

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
img

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

ge.png](https://i-blog.csdnimg.cn/blog_migrate/6e6785634eec661761579f26d495c947.png)

foreach算子

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

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
[外链图片转存中…(img-uH6Hcik9-1713153469476)]

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

  • 27
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值