先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注go)
正文
RDD:
弹性数据集,其中包含了多个partition,每个子集partition可以分布在不同节点上,在进行处理时分别在不同机器上进行处理;
DStream:
对数据流按时间切分出来的一小批次,每个DStream对应多个RDD,这些RDD是按照时间维度进行划分的,
关系:相当于一整条数据流DStream被切分成了多个RDD,每个DStream对应多个RDD;一个RDD对应多个partition
2、foreach与foreachPartition的区别
foreach:源码:
def foreach(f: T => Unit): Unit = withScope {
val cleanF = sc.clean(f)
sc.runJob(this, (iter: Iterator[T]) => iter.foreach(cleanF))}
获得每个partition中数据iterator 然后在遍历这个迭代器时对其中的每条数据进行入参function操作
foreachPartition:源码:
def foreachPartition(f: Iterator[T] => Unit): Unit = withScope {
val cleanF = sc.clean(f)
sc.runJob(this, (iter: Iterator[T]) => cleanF(iter))}
和foreach一样都是先获取partition中的数据iterator,不同的是在此方法中没有对iterator进行遍历,而是把这个iterator交给了入参function处理
总结:都是对partition中的数据进行操作,foreach是对每条信息,foreachpartition操作的是整个partition的iterator
3、map、mapPartitions和mapPartitionsWithIndex区别
map源码:
def map[U: ClassTag](f: T => U): RDD[U] = withScope {
val cleanF = sc.clean(f)
new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF))}
这个方法的的入参函数的参数是rdd中的具体一条信息,这样操作会不停的创建对象,例如:
如果需要把结果写到Mysql中,哪来一条记录就得生成一个连接
mapPartitions源码:
def mapPartitions[U: ClassTag](
f: Iterator[T] => Iterator[U],
preservesPartitioning: Boolean = false): RDD[U] = withScope {
val cleanedF = sc.clean(f)
new MapPartitionsRDD(
this,
(context: TaskContext, index: Int, iter: Iterator[T]) => cleanedF(iter),
preservesPartitioning)}
这个方法的的入参函数的参数是一个迭代器,对于一个RDD的每个分区进行操作,这样就可以对一个分区只建立一个连接
mapPartitionsWithIndex源码:
def mapPartitionsWithIndex[U: ClassTag](
f: (Int, Iterator[T]) => Iterator[U],
preservesPartitioning: Boolean = false): RDD[U] = withScope {
val cleanedF = sc.clean(f)
new MapPartitionsRDD(
this,
(context: TaskContext, index: Int, iter: Iterator[T]) => cleanedF(index, iter),
preservesPartitioning)}
这个方法与mapPartition类似;只不过入参的函数的参数有两个:一个是分区号,一个是迭代器
4、Spark的高级排序和Spark的高级分区
排序:
spark中的排序是通过隐式转换实现的,源码:
implicit def rddToOrderedRDDFunctions[K : Ordering : ClassTag,
V: ClassTag](rdd: RDD[(K, V)])
: OrderedRDDFunctions[K, V, (K, V)] = {
new OrderedRDDFunctionsK, V, (K, V)}
其中OrderedRDDFunctions是SortByKey所在的类
再看sortBykey源码:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-vAJS8em8-1713415594285)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!