【Spark练习】RDD分区操作

news2024/9/25 13:24:51

练习1:行动(Action)操作算子方法

任务1: reduce

// 1. 数组
val x = sc.parallelize(List(1,2,3,4))
val y = x.reduce( (a,b) => a + b)
// 2. 列表
val rdd = sc.parallelize(List(1,2,3,4))
// 求和,将各个数累加,依次合并  下面两种方式相同
val y = rdd.reduce( (x,y) => x + y)
val y = rdd.reduce(_+_)

在这里插入图片描述

任务2: saveAsTextFile

val x = sc.parallelize(Array(2,4,1))
x.saveAsTextFile("file:///F:/04Spark/dataset/hello_new.txt")
// 再将文件中内容读出来
val y = sc.textFile("file:///F:/04Spark/dataset/hello_new.txt")
y.collect.mkString(",")

在这里插入图片描述

练习2:RDD的分区操作、分区个数查看

任务1: textFile、parallelize

2.1 textFile

  • 对于textFile而言,如果没有在方法中指定分区数,则sc.defaultMinPartitions默认为min(defaultParallelism,2),其中,defaultParallelism对应的就是spark.default.parallelism,如果是从HDFS中读取文件,则分区数为文件分片数(比如,128MB/片)
  • rdd的分区数 = max(本地file的分片数, sc.defaultMinPartitions)
// 1. 查看默认分区 (为4)
sc.defaultParallelism
// 2. 查看默认最小分区 (为2)
sc.defaultMinPartitions
//3.  将rdd存为文件
val rdd1 = sc.parallelize(Array(2,4))
rdd1.saveAsTextFile("file:///F:/04Spark/dataset/hello_new2.txt")
// 4. 读取
val rdd2 = sc.textFile("file:///F:/04Spark/dataset/hello_new2.txt")
// 5.查看分区的数量 (为4)
rdd2.partitions.size

在这里插入图片描述

  • 由于rdd的分区数 = max(本地file的分片数, sc.defaultMinPartitions),rdd的分区数为4,sc.defaultMinPartitions为2,所以本地file的分片数为4,检查发现确实分为4个part。

2.2 parallelize

  • 这种方式下,如果在parallelize操作时没有指定分区数,则rdd的分区数 = sc.defaultParallelism
// 1. 没有设置分区数量
val array = Array(1,2,3,4,5)
val rdd = sc.parallelize(array) #没有设置分区数量
// 分区数量为默认分区数量(4)
rdd.partitions.size
// 2. 设置分区数量
val rdd = sc.parallelize(array,2) // 分区数量为2
// 结果分区数量变为2
rdd.partitions.size

在这里插入图片描述

任务2: repartition

  • coalesce方法默认是不触发shuffle的,而repartition方法一定会触发shuffle,他们都可以重新进行分区
  • repartition方法不会改变原来rdd分区数量,而是使返回新的rdd分区数量改变
val array = Array(1,2,3,4,5)
val rdd = sc.parallelize(array,2) // 此时rdd分区数量为2
// repartition不会改变原来rdd,它会返回一个新的rdd
rdd.repartition(1)  // 此时rdd分区数量仍为2
rdd.partitions.size
// 返回一个新的rdd,新的rdd分区数量为1
val rdd1 = rdd.repartition(1) // 此时新的rdd1分区数量为1,rdd分区数量为2
rdd1.partitions.size

在这里插入图片描述

补充

1. countByKey()

  • action算子;根据key的次数来做统计
val x = sc.parallelize(Array(('J',"James"),('F',"Fred"),('A',"Anna"),('J',"John")))
val y = x.countByKey()
println(y) 

在这里插入图片描述

2. foreachPartition

foreachPartition方法是迭代器被传入了我们的方法(每个分区执行一次函数,我们获取迭代器后需要自行进行迭代处理)

//   1. 分区 2个分区
    val rdd = sc.parallelize(1 to 6,2)
    rdd.foreachPartition(x =>{
      println("data")
      println(x)
      while(x.hasNext){println(x.next())}
    })

在这里插入图片描述

3. aggregate 方法

3.1 方法说明

首先对每个分区内的数据基于初始值进行一个首次聚合,然后将每个分区聚合的结果,通过使用给定的聚合函数,再次基于初始值进行分区之间的聚合,并且最终返回结果。该算子为action算子。

3.2 操作步骤
  • 定义两个要给 aggregate 当作输入参数的函数,给初值3
// 乘积
def pfun1(p1: Int, p2: Int): Int = {
    p1 * p2
}
// 和
def pfun2(p3: Int, p4: Int): Int = {
    p3 + p4
}
// 
val array = Array(1,2,3,4,5)
// 指明分区数量为1,否则默认分区数量为4
 val rdd1 = sc.parallelize(array,1)
// 给定初值3,先进行相乘,再将结果进行相加
rdd1.aggregate(3)(pfun1, pfun2)

在这里插入图片描述

3.2 分析

  • 首先用初值 3 作为 pfun1 的参数 p1 ,用 RDD 中的第 1 个值,即 1 作为 pfun1 的参数 p2 。由此我们可以得到第一个计算值为 3 * 1 = 3 。接着这个结果 3 被当成 p1 参数传入,RDD 中的第 2 个值即 2 被当成 p2 传入,由此得到第二个计算结果为 3 * 2 = 6 。以此类推,整个 pfun1 函数执行完成以后3 * 1 * 2 * 3 * 4 * 5 = 360

  • 在 aggregate 方法的第 1 个参数函数 pfun1 执行完毕以后,我们得到了结果值 360 。于是,这个时候就要开始执行第 2 个参数函数 pfun2 了。

  • pfun2 的执行过程与 pfun1 是差不多的,同样会将 zeroValue 作为第一次运算的参数传入,在这里即是将 zeroValue 即 3 当成 p3 参数传入,然后是将 pfun1 的结果 360 当成 p4 参数传入,由此得到计算结果为 363 。因为 pfun1 仅有一个结果值,所以整个 aggregate 过程就计算完毕了,最终的结果值就是 363 。
    注意分区数量的不同导致最后运算的结果也会不同。

3.3 多个分片RDD

val array = Array(1,2,3,4,5,6,7,8,9,10)
val rdd2 = sc.parallelize(array,3)
rdd2.getNumPartitions

rdd2.aggregate(2)(pfun1, pfun2)

在这里插入图片描述

  • 分析:
    2 * 1 * 2 * 3 = 12
    2 * 4 * 5 * 6 = 240
    2 * 7 * 8 * 9 * 10 = 10080
    2 + 12 + 240 + 10080 = 10334

参考链接

  1. aggregate参考
  2. 默认分区数参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/487939.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

读书笔记// 《数据产品经理》

书名:写给数据产品经理新人的工作笔记 出版时间:2020年10月 本书以数据产品经理角色的定位和合作关系为切入点,站在整个数据体系的视角,从工作流程的角度剖析数据需求沟通和判断的过程、指标体系搭建的过程,同时介绍了…

Swift 中的 async/await ——代码实例详解

前言 async-await 是在 WWDC 2021 期间的 Swift 5.5 中的结构化并发变化的一部分。Swift 中的并发性意味着允许多段代码同时运行。这是一个非常简化的描述,但它应该让你知道 Swift 中的并发性对你的应用程序的性能是多么重要。有了新的 async 方法和 await 语句&am…

《人工智能概论》课程重点总结

目录 遗传算法相关参数问题 种群规模、迭代次数、交叉率、变异率对算法的影响 A*算法中open表和close表的作用 为什么A*算法中open表是增长的 启发式函数h(n)取值的影响 A*算法可以找到最优解的条件 模式识别系统的组成 有监督学习和无监督学习的区别 模型评估三大原则…

Baklib推荐:关于建设企业知识管理的有效方法

随着信息化和互联网技术的不断发展,企业面临着海量的信息和知识,如何有效地管理和利用这些信息和知识已经成为了企业发展的关键问题之一。企业知识管理是指企业利用信息技术手段,对企业内部的知识进行系统化、集成化、共享化管理,…

MPSOC(ZU9EG/ZU15EG)PCIE架构高性能数据预处理 FMC载板设计资料

板卡概述 PCIE707 是一款基于 PCIE 总线架构的高性能数据预处理 FMC载板,板卡具有 1 个 FMC(HPC)接口,1 路 PCIe x4 主机接口、 1 个 RJ45 千兆以太网口、2 个 QSFP 40G 光纤接口。板卡采用 Xilinx 的高性能 UltraScale MPSOC 系…

「蓝桥杯」积木大赛

积木大赛 题目描述 春春幼儿园举办了一年一度的"积木大赛"。今年比赛的内容是搭建一座宽度为 n 的大厦,大厦可以看成由 n 块宽度为 1 的积木组成,第 i 块积木的最终高度需要是 h_i 。 在搭建开始之前,没有任何积木(可…

Vue3中双向数据绑定与Pinia实践+JS数据引用的循环修改问题

Vue3 Pinia VUE3虽然出了很久了,但是很少深入研究,目前项目上遇到了一些问题,所以做个Note解决一下疑问: v-bind/v-model怎么与Pinia进行结合Object/Array数据大量处理时,为何有的修改不生效组合API与选项API选择 (…

赛道冠军为AI狂飙:实在智能即将重归福州,亮相第六届数字中国建设峰会

2023年4月26日至30日,第六届数字中国建设峰会将在福建省福州市举行。本届峰会以“加快数字中国建设,推进中国式现代化”为主题,由国家网信办、国家发展改革委、科技部、工业和信息化部、国务院国资委、福建省人民政府共同主办。 作为我国信息…

代码随想录算法训练营第二十五、二十七天 | 细节很多、树枝去重和树层去重的区分是难点、分割

216.组合总和III 文档讲解:代码随想录 (programmercarl.com) 视频讲解:和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III_哔哩哔哩_bilibili 状态:能做出来。和上一题没什么区别。思路直接…

SpringCloud微服务的熔断、限流、降级是怎么回事?

概述: 在开发公司商城项目时,由于采用的是微服务架构,每个模块之间使用OpenFeign组件进行通信,在遇到高并发时,为了保证系统的可用性和 可靠性,我们使用了阿里的Alibaba的Sentinel组件进行降级、限流和熔断…

vue2实现高德地图 JSAPI 2.0轨迹回放组件(MoveAnimation)

vue2实现高德地图 JSAPI 2.0轨迹回放组件(MoveAnimation) 声明: 本人是做java后端的,组件抽取不是很规范请大家见谅 前提: 需要注册高德开放平台,之后创建应用并且开通Web端(JS API)平台,然后拿到securityJsCode和key 实现效果: 1. 基础抽取 注意: 将securityJsCode和key修改为…

OpenGL(四)——纹理

目录 一、前言 二、纹理环绕方式 三、纹理过滤 3.1 邻近过滤 3.2 线性过滤 3.3 多级渐远纹理 四、加载、创建纹理 4.1 数据输入 4.2 生成并加载纹理 4.3 应用纹理坐标 4.4 顶点着色器配置纹理 4.5 片段着色器配置纹理 4.6 显示纹理 五、纹理单元 一、前言 为每个…

云原生技术概谈

云原生技术概谈 说起“云原生技术”,大家可能有点懵,只闻其声,不明其意。但是云原生背后典型的几个公司或者技术产品的名称可能大家经常听到: 比如容器技术的代表公司docker;容器编排技术开源产品kubernetes&#xff0…

推荐算法实战项目:DeepCross 原理以及案例实战(附完整 Python 代码)

本文要介绍的是由斯坦福大学联合Google的研究人员发表的论文《Deep & Cross Network for Ad Click Predictions》中提出的Deep&Cross模型,简称DCN。 DCN模型是Wide&Deep的改进版本,其中Deep部分的设计思路与Wide&Deep没有发生本质的变化…

计算机视觉的应用3-批量图片风格迁移之素描图片生成的应用

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用3-批量图片生成素描图片的应用,将一张图像转换为素描风格的图像的其实是模拟了人类视觉在观察物体时受到的光照条件。素描风格的图像在灰度值上表现出明暗交替的效果,这种效…

【干货】一文说透分布式一致性协议(下)

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"! 作者:大能老师 | 慕课网讲师 前情提示:如需阅读“一文说透分布式一致性协议(上)”&#…

对多个点进行直线拟合操作

在图像处理中,通常会遇到根据给定的点集(比如轮廓)拟合出一条直线的情形。 import numpy as np import matplotlib.pyplot as plt import cv2def Cal_kb_linear_fitline(pointLocs):loc np.array(pointLocs) # loc 必须为矩阵形式&#xff…

二分类结局变量Logistic回归临床模型预测(二)——基线特征及三线表绘制(二)

本节讲的是二分类结局变量的临床模型预测,与之前讲的Cox回归不同,https://lijingxian19961016.blog.csdn.net/article/details/124088364https://lijingxian19961016.blog.csdn.net/article/details/124088364https://lijingxian19961016.blog.csdn.net/article/details/1300…

蓝牙耳机哪款性价比高一些?2023年性价比最高的蓝牙耳机推荐

随着科技的进步,蓝牙耳机已然成为我们生活中的一部分,无论是通勤、追剧、运动或者玩游戏,大都会用到蓝牙耳机。那么,哪款蓝牙耳机的性价比高一些?相信大多数人在选择产品的时候,都会看性价比。接下来&#…

手把手带你写一份优秀的开发求职简历(五)技术能力如何凸显优势

前言 前面的几小节,把个人信息和教育背景的模块做了讲述,这两个模块处于简历的第一屏最顶部,可以说HR会第一眼看见,所以很重要,同时也通过一些讲述告诉求职者从这些方面如何扬长避短,抓住HR的招聘心理。 …