当前位置: 首页 > news >正文

Spark 基础自定义分区器

(一)什么是分区

【复习提问:RDD的定义是什么?】

在 Spark 里,弹性分布式数据集(RDD)是核心的数据抽象,它是不可变的、可分区的、里面的元素并行计算的集合。

在 Spark 中,分区是指将数据集按照一定的规则划分成多个较小的子集,每个子集可以独立地在不同的计算节点上进行处理,这样可以实现数据的并行处理,提高计算效率。

可以将 Spark 中的分区类比为快递公司处理包裹的过程。假设你有一批包裹要从一个城市发送到另一个城市,快递公司会将这些包裹按照一定的规则进行分区,比如按照收件地址的区域划分。每个分区的包裹会被分配到不同的快递员或运输车辆上进行运输,这些快递员或车辆可以同时出发,并行地将包裹送到不同的区域。这就类似于 Spark 中的分区,每个分区的数据可以在不同的计算节点上同时进行处理,从而加快整个数据处理的速度。

(二)默认分区的情况

从集合创建 RDD(使用 parallelize 方法)

当使用 parallelize 方法从一个集合创建 RDD 时,默认分区数通常取决于集群的配置。

在本地模式下,默认分区数等于本地机器的 CPU 核心数;在集群模式下,默认分区数由 spark.default.parallelism 配置项决定。

import org.apache.spark.SparkContext

import org.apache.spark.SparkConf

val conf = new SparkConf().setAppName("DefaultPartitionExample").setMaster("local")

val sc = new SparkContext(conf)

val data = Seq(1, 2, 3, 4, 5)

val rdd = sc.parallelize(data)

println(s"默认分区数: ${rdd.partitions.length}")

sc.stop()

2.从外部存储(如文件)创建 RDD(使用 textFile 方法)

当使用 textFile 方法从外部存储(如 HDFS、本地文件系统等)读取文件创建 RDD 时,默认分区数通常由文件的块大小决定。对于 HDFS 文件,默认分区数等于文件的块数。例如,一个 128MB 的文件在 HDFS 上被分成 2 个 64MB 的块,那么创建的 RDD 默认分区数就是 2。

import org.apache.spark.SparkContext

import org.apache.spark.SparkConf

val conf = new SparkConf().setAppName("DefaultPartitionFileExample").setMaster("local")

val sc = new SparkContext(conf)

// 假设文件存在于本地

val rdd = sc.textFile("path/to/your/file.txt")

println(s"默认分区数: ${rdd.partitions.length}")

sc.stop()

【现场演示,如果文件是一个.gz文件,是一个不可拆分的文件,那么默认分区的数量就会是1】

(三)分区的作用

在 Spark 中,RDD 是数据的集合,它会被划分成多个分区,这些分区可以分布在不同的计算节点上,就像图书馆的书架分布在不同的房间一样。

这样做的好处是什么呢?

并行计算:Spark 能够同时对多个分区的数据进行处理,充分利用集群的计算资源,进而加快作业的执行速度。例如,若一个 RDD 有 10 个分区,且集群有足够的计算资源,Spark 就可以同时处理这 10 个分区的数据。

数据局部性:分区有助于实现数据局部性,也就是让计算尽量在数据所在的节点上进行,减少数据在网络间的传输,从而降低网络开销。

容错性:当某个分区的数据处理失败时,Spark 能够重新计算该分区,而不需要重新计算整个 RDD。

当使用savaAsTextFile做保存操作时,最终生成的文件个数通常和RDD的分区数一致。

object PartitionExample {

  def main(args: Array[String]): Unit = {

    // 创建 SparkConf 对象,设置应用程序名称和运行模式

    val conf = new SparkConf().setAppName("PartitionExample").setMaster("local")

    // 使用 SparkConf 创建 SparkContext 对象

    val sc = new SparkContext(conf)

    // 创建一个包含 10 个元素的 Seq

    val data = Seq(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

    // 使用 parallelize 方法创建 RDD,并设置分区数为 3

    val rdd = sc.parallelize(data, 3)

    // 将 RDD 保存为文本文件,保存路径为 "output"

    rdd.saveAsTextFile("output")

    // 停止 SparkContext,释放资源

    sc.stop()

  }

}  

在运行代码后,output 目录下会生成与 RDD 分区数量相同的文本文件,这里 RDD 分区数设置为 3,所以会生成 3 个文件,文件名通常为 part-00000、part- 00001、part-00002 。

(四)分区器和默认分区器

分区器是 Spark 中用于决定 RDD 数据如何在不同分区之间进行分布的组件。通过定义分区规则,它能够将具有键值对类型的数据(PairRDD)按照一定策略划分到不同分区,以实现数据的合理分布,进而提高并行计算的效率。

在大多数涉及键值对的转换操作中,Spark 默认使用 HashPartitioner。例如,reduceByKey、groupByKey 等操作,如果没有显式指定分区器,就会使用 HashPartitioner。

HashPartitioner 根据键的哈希值来决定数据应该被分配到哪个分区。具体来说,它会对键的哈希值取模,模的结果就是分区的编号。假设分区数为 n,键为 key,则分区编号的计算公式为 hash(key) % n。

对于键值对 RDD,HashPartitioner 是大多数转换操作的默认分区器,而 RangePartitioner 是 sortByKey 操作的默认分区器。你也可以根据具体需求显式指定分区器来控制数据的分区方式。

(五)为什么需要自定义分区

数据倾斜:当数据分布不均匀,某些分区数据量过大,导致计算负载不均衡时,可自定义分区器,按照特定规则重新分配数据,避免数据倾斜影响计算性能。比如电商订单数据中,按地区统计销售额,若某些热门地区订单数远多于其他地区,使用默认分区器会使部分任务计算量过大。通过自定义分区器,可将热门地区进一步细分,让各分区数据量更均衡。

特定业务逻辑:若业务对数据分区有特殊要求,如按时间段将日志数据分区,不同时间段的数据存到不同分区便于后续处理分析;或在社交网络数据中,按用户关系紧密程度分区等,都需自定义分区器实现。

(六)自定义分区器的实现步骤

自定义分区器需要:继承Partitioner抽象类 + 实现其中的两个方法。

numPartitions :返回分区的数量,即整个 RDD 将被划分成多少个分区 。

getPartition(key: Any) :接收一个键值key(对于非键值对类型 RDD,可根据数据特征构造合适的键 ),根据自定义逻辑返回该键值对应的分区索引(从 0 开始,取值范围为 0 到numPartitions - 1 ) 。

(七)案例

假设要对 NBA 球队比赛信息进行分区存储,要求将湖人、火箭两队信息单独存储,其余球队信息存放在一个分区。

("勇士", "info1"),

("掘金", "info2"),

("湖人", "info3"),

("火箭", "info4")

示例代码如下:

import org.apache.spark.{Partitioner, SparkConf, SparkContext}

object CustomPartitionerExample {

  def main(args: Array[String]): Unit = {

    val conf = new SparkConf().setAppName("CustomPartitionerExample").setMaster("local[*]")

    val sc = new SparkContext(conf)

    // 准备数据集,数据为(球队名称, 相关信息)形式的键值对

    val rdd = sc.parallelize(List(

      ("勇士", "info1"),

      ("掘金", "info2"),

      ("湖人", "info3"),

      ("火箭", "info4")

    ))

    // 使用自定义分区器对RDD进行分区

    val partitionedRDD = rdd.partitionBy(new MyPartitioner)

    partitionedRDD.saveAsTextFile("output")

    sc.stop()

  }

}

// 自定义分区器类

class MyPartitioner extends Partitioner {

  // 定义分区数量为3

  override def numPartitions: Int = 3

  // 根据球队名称(键值)确定分区索引

  override def getPartition(key: Any): Int = {

    key match {

      case "湖人" => 0

      case "火箭" => 1

      case _ => 2

    }

  }

}

核心代码解释:

MyPartitioner类继承自Partitioner,实现了numPartitions方法指定分区数量为 3 ,实现getPartition方法,根据球队名称判断分区索引,湖人对应分区 0,火箭对应分区 1,其他球队对应分区 2 。

2.在main方法中,创建包含球队信息的 RDD,然后调用partitionBy方法并传入自定义分区器MyPartitioner,对 RDD 进行分区,最后将分区后的数据保存到指定路径。

相关文章:

Spark 基础自定义分区器

(一)什么是分区 【复习提问:RDD的定义是什么?】 在 Spark 里,弹性分布式数据集(RDD)是核心的数据抽象,它是不可变的、可分区的、里面的元素并行计算的集合。 在 Spark 中&#xf…...

【提高+/省选−】洛谷P1495 —— 【模板】中国剩余定理(CRT)/ 曹冲养猪

见:P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪 - 洛谷 题目描述 自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲满不高兴,于是在工作中马马虎虎&a…...

系统架构设计师考前冲刺笔记-第1章-系统工程与信息系统基础

文章目录 第1章 系统工程与信息系统基础大纲13 DSS5678 BSP910 SCM11 OLAP12 OLAP14 BRP15 集成16 企业门户19 边缘计算 第1章 系统工程与信息系统基础 大纲 1 3 DSS DSS 决策支持系统 Decision Support System 5 6 7 8 BSP 9 10 SCM 注意:生产计划 11 OLAP O…...

Vue环境下数据导出Excel的全面指南

文章目录 1. 前言2. 原生JavaScript实现方案2.1 使用Blob对象和URL.createObjectURL2.2 使用Base64编码实现 3. 常用第三方库方案3.1 使用SheetJS (xlsx)3.2 使用ExcelJS3.3 使用vue-json-excel 4. 服务器端导出方案4.1 前端请求服务器生成Excel4.2 使用Web Worker处理大数据导…...

Linux下 使用 SSH 完成 Git 绑定 GitHub

文章目录 1、检查 SSH2、生成 SSH key3、添加 SSH key4、验证绑定是否成功 1、检查 SSH Git Bash 中输入ssh命令,查看本机是否安装 SSH: 2、生成 SSH key (1)输入 ssh-keygen -t rsa 命令,表示我们指定 RSA 算法生…...

Jsoup库和Apache HttpClient库有什么区别?

Jsoup 和 Apache HttpClient 是两个功能不同的库,它们在 Java 开发中被广泛使用,但用途和功能有明显的区别: Jsoup 用途:Jsoup 是一个用于解析 HTML 文档的库。它提供了非常方便的方法来抓取和解析网页内容,提取和操作…...

安全漏洞频发,如何加强防护措施?

当系统安全漏洞频发时,应从代码安全审查、自动化漏洞扫描、权限控制与访问管理、员工安全意识培训等四个关键维度加强防护。其中,代码安全审查是防止漏洞渗透的第一道防线。企业应将代码安全审查纳入CI/CD流程,实施静态代码分析和依赖包检查机…...

Text models —— BERT,RoBERTa, BERTweet,LLama

BERT 什么是BERT? BERT,全称Bidirectional Encoder Representations from Transformers,BERT是基于Transformer的Encoder(编码器)结构得来的,因此核心与Transformer一致,都是注意力机制。这种…...

CodeBuddy初探

回顾Trae 上一篇博客Trae IDE和VSCode Trae插件初探-CSDN博客,我们进行了TraeIDE和Trae插件初探,给了Trae这样一个任务: 生成一个to do list清单web页面,采用vue实现,可以在页面上进行todolist进行增删改查。 Trae的…...

spark数据处理练习题详解【上】

1. (单选题) scala中属于序列的可变的集合,可以添加,删除元素的是() A.Array B.List C.Tuple D.ListBuffer 答案及解析:D 在Scala中,属于序列的可变集合,可以添加和删除元素的是&#xff…...

sparkSQL读入csv文件写入mysql(2)

(二)创建数据库和表 接下来,我们去创建一个新的数据库,数据表,并插入一条数据。 -- 创建数据库 CREATE DATABASE spark; -- 使用数据库 USE spark;-- 创建表 create table person(id int, name char(20), age int);-- …...

产品周围的几面墙

不能把排序,当单选题做。 2025年的杭州咖啡馆,味道最浓的不是咖啡,是聊各种项目和创业的卷味。 在过去几年,聊项目的也不少,那时候带着更加浓烈的自信和松弛感,不过今年略带几分忐忑和试探的口吻。 看到网…...

【锂电池剩余寿命预测】LSTM长短期记忆神经网络锂电池剩余寿命预测(Pytorch完整源码和数据)

目录 效果一览程序获取程序内容代码分享效果一览 程序获取 获取方式一:文章顶部资源处直接下载:...

螺旋矩阵--LeetCode

题目 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2: 输入:matrix [[…...

湖北理元理律师事务所:债务管理的社会价值探索

债务问题从来不是孤立的经济事件,其背后牵涉家庭稳定、社会信用体系乃至区域经济发展。湖北理元理律师事务所通过五年服务数据发现:科学债务规划可使单个家庭挽回约23%的可支配收入,间接降低离婚率、心理健康问题发生率等社会成本。 债务优化…...

知识图谱(KG)与大语言模型(LLM)

知识图谱(KG)以其结构化的知识表示和推理能力,为大语言模型(LLM)的“幻觉”、知识更新滞后和可解释性不足等问题提供了有力的解决方案。反过来,LLM的强大文本理解和生成能力也为KG的构建、补全、查询和应用…...

LLM大语言模型系列1-token

一,什么是token 1,什么是token: 参考:https://en.wikipedia.org/wiki/Token https://en.wikipedia.org/wiki/Lexical_analysis#Token 我们有很多描述token的解释,建议是汇总在一起进行综合理解: 1️⃣To…...

数据清洗-案例

四)实现代码 在之前的项目的基础之上,重写去写一个包,并创建两个类:WebLogMapper和WebLogDriver类。 (1)编写WebLogMapper类 package com.root.mapreduce.weblog; import java.io.IOException; import…...

项目的部署发布和访问的流程

首先打包项目: npm run build 打包后的文件会生成在dist文件夹中,将dist文件夹需要放到服务器里面,意味着服务有dist静态资源(index.html,css/,js/,img/) 用户在浏览器输入域名&am…...

人工智能、机器学习、深度学习定义与联系

人工智能、机器学习、深度学习定义与联系目录 一、人工智能(Artificial Intelligence, AI)1、定义2、特征:3、关键阶段的概述:1. 萌芽期(1940s–1950s):理论奠基2. 形成期(1950s–19…...

Gartner《如何将生成式人工智能(GenAI)集成到应用架构》学习心得

针对软件架构师、技术专业人士如何更好的把 GenAI 如何融入解决方案,提升用户体验、生产力并带来差异化成果的趋势,Gartner发布了《Integrating GenAI Into Your Application Architecture》研究报告。 报告首先介绍了 GenAI 的发展背景,指出其已成为主流趋势,大型语言模型…...

vscode中Debug c++

在vscode中Debug ros c程序 1 在Debug模式下编译 如果用命令行catkin_make,在输入catkin_make时加上一个参数: catkin_make -DCMAKE_BUILD_TYPEDebug 或者直接修改CMakelist.txt,添加以下代码: SET(CMAKE_BUILD_TYPE "D…...

c++从入门到精通(六)--特殊工具与技术-完结篇

特殊工具与技术-完结篇 控制内存分配 重载new和delete: ​ 如果应用程序希望控制内存分配的过程,则它们需要定义自己的operator new函数和operator delete函数。当自定义了全局的operator new函数和operator delete函数后,我们就担负起了控…...

原型链的详细解释及使用场景

一、原型链的概念 原型链是JavaScript实现继承和属性共享的核心机制。每个对象都有一个内部属性[[Prototype]](可通过proto访问),指向其原型对象。当访问对象的属性时,若对象自身不存在该属性,则会沿着原型链向上查找…...

OpenCL C C++核心对象与属性对比

基础对象对应关系 OpenCL C 对象OpenCL C 对应类型创建函数示例cl::Platformcl_platform_idclGetPlatformIDs(1, &platform, NULL)cl::Devicecl_device_idclGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL)cl::Contextcl_contextclCreateContext(NULL,…...

Azure 机器学习初学者指南

Azure 机器学习初学者指南 在我们的初学者指南中探索Azure机器学习,了解如何设置、部署模型以及在Azure生态系统中使用AutoML & ML Studio。Azure 机器学习 (Azure ML) 是一项全面的云服务,专为机器学习项目生命周期而设计&am…...

一文读懂----Docker 常用命令

Docker 是一个强大的容器化平台,广泛用于开发、测试和生产环境。通过 Docker 命令行工具(CLI),我们可以轻松管理容器、镜像、网络和卷等资源。本文将详细介绍 Docker 的常用命令,带你熟练掌握 Docker 的核心操作命令。…...

React 19 中的useRef得到了进一步加强。

文章目录 前言一 useRef 的核心原理1.1 为什么需要 useRef?1.2 基本语法 二、React 19 中 useRef 的常见用法2.1 访问 DOM 元素2.2 保存跨渲染的数据 三、React 19 中的改进ref 作为一个属性案例演示(触发子组件焦点事件) 注意 总结 前言 在 React 的世界里&#x…...

报错System.BadImageFormatException:“试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)”

this.hWindowControl_Player new HalconDotNet.HWindowControl();报错System.BadImageFormatException:“试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)” System.BadImageFormatException 错误通常是由于平台架构不匹配导致的。它意味着你正在尝试在一个平台上加…...

【图像处理基石】OpenCV中都有哪些图像增强的工具?

OpenCV 图像增强工具系统性介绍 OpenCV 提供了丰富的图像增强工具,主要分为以下几类: 亮度与对比度调整 线性变换(亮度/对比度调整)直方图均衡化自适应直方图均衡化(CLAHE) 滤波与平滑 高斯滤波中值滤波双…...

Nordic 的RTC(Real-time counter)的介绍

目录 概述 1 RTC(Real-time counter)介绍 1.1 框架结构 1.2 时钟源 1.3 分辨率与溢出和precaler 2 寄存器功能介绍 2.1 计数寄存器 2.2 事件控制功能 2.3 比较功能 2.4 读取COUNTER寄存器 概述 本文主要介绍Nordic 的RTC(Real-time…...

【数据结构】2-2-2 顺序表的插入删除查找

数据结构知识点合集 知识点 顺序表的插入 ListInsert(&L,i,e)&#xff1a;插入操作。在表L中的第i个位置上插入指定元素e。 /*在顺序表L的第i个位置插入元素e*/ bool ListInsert(SqList &L,int i,int e) {/*判断i的范围是否有效*/if(i<0||i>L.length)return fals…...

【免杀】C2免杀技术(五)动态API

一、什么是动态API 在C2免杀领域中&#xff0c;“动态API” 主要指的是绕过静态检测的一种技术手段&#xff0c;其本质是运行时动态解析和调用Windows API函数&#xff0c;而不是在程序编译阶段就明确引用这些API。这种方式可以有效躲避静态分析工具和杀软的签名识别。 为什么…...

77.数据大小端赋值的差异与联系

上述赋值a定义为大端模式 a[7] a[6] a[5] a[4] a[3] a[2] a[1] a[0] 上述赋值b定义为小端模式 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] 因为5的二进制数…...

GO语言语法---switch语句

文章目录 基本语法1. 特点1.1 不需要break1.2 表达式可以是任何类型1.3 省略比较表达式1.4 多值匹配1.5 类型switch1.6 case穿透1.7 switch后直接声明变量1.7.1 基本语法1.7.2 带比较表达式1.7.3 不带比较表达式1.7.4 结合类型判断 1.8 switch后的表达式必须与case语句中的表达…...

PH热榜 | 2025-05-16

1. Tolt 标语&#xff1a;专为SaaS初创公司打造的一体化联盟营销软件 介绍&#xff1a;Tolt帮助SaaS初创公司启动和发展联盟计划。它提供自动化的支付、欺诈保护、与多种平台的无缝集成&#xff08;包括Stripe、Paddle和Chargebee&#xff09;&#xff0c;还有一个品牌化的联…...

Java正则表达式:从基础到高级应用全解析

Java正则表达式应用与知识点详解 一、正则表达式基础概念 正则表达式(Regular Expression)是通过特定语法规则描述字符串模式的工具&#xff0c;常用于&#xff1a; 数据格式验证文本搜索与替换字符串分割模式匹配提取 Java通过java.util.regex包提供支持&#xff0c;核心类…...

iOS 初识RunLoop

iOS 初识RunLoop 文章目录 iOS 初识RunLoopRunLoop的概念RunLoop的功能RunLoop和线程的关系RunLoop的结构ModeObserverTimer 和 source小结 RunLoop的核心RunLoop的流程RunLoop的应用AutoreleasePool响应触控事件刷新界面常驻线程网络请求NSTimer 和 CADisplayLinkNSTimerGCDTi…...

备忘录模式

1.意图 备忘录模式是一种行为型设计模式&#xff0c;允许在不破坏封装的特性前提&#xff0c;获取并保存一个对象的内部状态&#xff0c;后续需要时恢复该状态。核心是将对象的状态存储在一个独立的备忘录对象中&#xff0c;并在需要时恢复。 2.模式类型 行为型对象设计模式 …...

UCOS 嵌入式操作系统

UCOS 嵌入式操作系统是一款在嵌入式领域应用广泛且具有重要地位的实时操作系统&#xff0c;以下是对它的详细介绍。 发展历程 初始版本诞生&#xff1a;UCOS 最早由美国嵌入式系统专家 Jean J. Labrosse 于 1991 年开始开发。当时他在项目中需要一个合适的实时操作系统&#…...

redis读写一致问题

title: redis读写一致问题 date: 2025-05-18 11:11:31 tags: redis categories: redis的问题方案 Redis读写一致问题 条件: 数据库此时的数据为10,redis此时的数据也为10 业务流程: 操作数据库使得数据库的数据为20&#xff0c;删除redis里面的数据保证读写一致 先删缓存…...

Redis实现分布式锁的进阶版:Redisson实战指南

一、为什么选择Redisson&#xff1f; 在上一篇文章中&#xff0c;我们通过Redis原生命令实现了分布式锁。但在实际生产环境中&#xff0c;这样的基础方案存在三大痛点&#xff1a; 锁续期难题&#xff1a;业务操作超时导致锁提前释放不可重入限制&#xff1a;同一线程无法重复…...

标准库、HAl库和LL库(PC13初始化)

标准库 (Standard Peripheral Library) c #include "stm32f10x.h"void GPIO_Init_PC13(void) {GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitStruct.GPIO_Pin GPIO_Pin_13;GPIO_InitStruct.GPIO_Mode GPIO_…...

第二章:安卓端启动流程详解与疑难杂症调试手册

想让一个安卓项目跑起来&#xff0c;从表面看无非就是&#xff1a;双击打开、连接真机、点击运行。 但是到了互动娱乐组件项目里&#xff0c;事情就变成了&#xff1a;点击运行→等待→黑屏→白屏→强制退出→LogCat爆炸→你怀疑人生。 本章就来系统性解决几个问题&#xff1…...

备份C#的两个类

GuestIP依赖项&#xff1a; using System.Data.SQLite; //这是第三方依赖项&#xff0c;要从nuget下载 static class GuestIP {public static void ReadLastGuestIP(string constr "Data Sourceguestip_log.db;"){using (var connection new SQLiteConnection(co…...

通过串口设备的VID PID动态获取串口号(C# C++)

摘要 本篇文章主要介绍分别通过C#和C++使用设备VID PID如何动态获取COM口 目录 1 简述 2 VID PID查看方式 3 C#实现通过串口设备的VID PID动态获取串口号 3.1 辅助类实现 3.2 调用实例 4 C++实现通过串口设备的VID PID动态获取串口号 4.1 辅助类实现 4.2 调用实例 1 简…...

C语言指针深入详解(二):const修饰指针、野指针、assert断言、指针的使用和传址调用

目录 一、const修饰指针 &#xff08;一&#xff09;const修饰变量 &#xff08;二&#xff09;const 修饰指针变量 二、野指针 &#xff08;一&#xff09;野指针成因 1、指针未初始化 2、指针越界访问 3、指针指向的空间释放 &#xff08;二&#xff09;如何规避野指…...

《P5283 [十二省联考 2019] 异或粽子》

题目描述 小粽是一个喜欢吃粽子的好孩子。今天她在家里自己做起了粽子。 小粽面前有 n 种互不相同的粽子馅儿&#xff0c;小粽将它们摆放为了一排&#xff0c;并从左至右编号为 1 到 n。第 i 种馅儿具有一个非负整数的属性值 ai​。每种馅儿的数量都足够多&#xff0c;即小粽…...

C#自定义扩展方法 及 EventHandler<TEventArgs> 委托

有自定义官方示例链接&#xff1a; 如何实现和调用自定义扩展方法 - C# | Microsoft Learn 1.静态类 2.静态方法 3.第一参数固定为this 要修改的类型,后面才是自定的参数 AI给出的一个示例&#xff1a;没有自定义参数 、有自定义参数的 using System; using System.Colle…...

oracle 资源管理器的使用

14.8.2资源管理器的使用 资源管理器控制CPU资源使用说明&#xff1a;  第一种分配方法&#xff1a;EMPHASIS CPU 分配方法确定在资源计划中对不同使用者组中的会话的重视程度。CPU占用率的分配级别为从1 到8&#xff0c;级别1 的优先级最高。百分比指定如何将CPU 资源分配给每…...