sqoop 详解

news2024/11/16 4:46:24

1 sqoop原理

1.1 sqoop介绍#

Sqoop是Apache旗下的一款“hadoop和关系型数据库服务器之间传送数据”的工具。
  导入数据:MySQL、Oracle导入数据到hadoop的hdfs、hive、hbase等数据存储系统。
  导出数据:从hadoop的文件系统中导出数据到关系型数据库中。

1.2 sqoop架构#

  • 导入流程
    1. 首先通过jdbc读取关系型数据库元数据信息,获取到表结构。
    2. 根据元数据信息生成Java类。
    3. 启动import程序,通过jdbc读取关系型数据库数据,并通过上一步的Java类进行序列化。
    4. MapReduce并行写数据到Hadoop中,并使用Java类进行反序列化。
      • 导出流程
    5. sqoop通过jdbc读取关系型数据库元数据,获取到表结构信息,生成Java类。
    6. MapReduce并行读取hdfs数据,并且通过Java类进行序列化。
    7. export程序启动,通过Java类反序列化,同时启动多个map,通过jdbc将数据写入到关系型数据库中。

2 安装sqoop

选择已经安装好hive镜像,里面以及安装过mysql,hadoop ,zookeeper,hive。根据自己资源情况调整cpu和内存的资源。

镜像地址:http://cloud.hainiubl.com/#/privateImageDetail?id=2953&imageType=private。选择添加到实验配置

1 将sqoop安装包解压到/usr/local目录下

tar -zxvf /public/software/bigdata/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /usr/local/

2 创建软链接

ln -s sqoop-1.4.7.bin__hadoop-2.6.0/ sqoop

3 修改sqoop安装目录的所有者和属组

 chown -R  hadoop:hadoop sqoop-1.4.7.bin__hadoop-2.6.0/

4 修改sqoop环境变量

#添加到/etc/profile文件中
export SQOOP_HOME=/usr/local/sqoop
export PATH=$PATH:$SQOOP_HOME/bin
#让环境变量立即生效
source /etc/profile

5 测试sqoop

# shell 里执行 sqoop 命令
sqoop help

6 导入mysql驱动包到sqooplib目录下

cp /usr/local/hive/lib/mysql-connector-java-5.1.49.jar  /usr/local/sqoop/lib/

3 sqoop常用参数

  • 常用命令
命令名称对应类命令说明
importImportTool将关系型数据库数据导入到HDFS、HIVE、HBASE
exportExportTool将HDFS上的数据导出到关系型数据库
codegenCodeGenTool获取数据库中某张表数据生成Java并打成Jar包
create-hive-tableCreateHiveTableTool创建hive的表
evalEvalSqlTool查看SQL的执行结果
list-databasesListDatabasesTool列出所有数据库
list-tablesListTablesTool列出某个数据库下的所有表
helpHelpTool打印sqoop帮助信息
versionVersionTool打印sqoop版本信息
  • 连接参数列表
ArgumentDescription
--connect <jdbc-uri>Specify JDBC connect string 指定JDBC连接字符串
--connection-manager <class-name>Specify connection manager class to use 指定要使用的连接管理器类
--driver <class-name>Manually specify JDBC driver class to use 指定要使用的JDBC驱动类
--hadoop-mapred-home <dir>Override $HADOOP_MAPRED_HOME 指定$HADOOP_MAPRED_HOME路径
--helpPrint usage instructions 帮助信息
--password-fileSet path for a file containing the authentication password 设置用于存放认证的密码信息文件的路径
-PRead password from console 从控制台读取输入的密码
--password <password>Set authentication password 设置认证密码
--username <username>Set authentication username 设置认证用户名
--verbosePrint more information while working 打印运行信息
--connection-param-file <filename>Optional properties file that provides connection parameters 指定存储数据库连接参数的属性文件
  • 连接MySQL示例
# 查询数据库列表 对标show databases
sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password 12345678

# 查询指定库下面所有表 对标show tables in cm
sqoop list-tables --connect jdbc:mysql://localhost:3306/hive_meta --username root --password 12345678

4 sqoop应用

4.1 准备测试数据#

应用场景:

​ 使用sqoop上传字典表数据到hive中与我们的数据进行关联查询。

以 商品表 为例:

-- 创建sqoop_db 数据库
create database sqoop_db default charset utf8 collate utf8_general_ci;

-- 导入SQL文件
mysql -uroot  -p sqoop_db < /public/data/goods_table.sql

4.2 eval 查看 sql 查询结果#

# 没有where条件
sqoop eval \
--connect jdbc:mysql://nn1:3306/sqoop_db \
--username root \
--password 12345678 \
--query "select * from goods_table limit 10"

4.3 create-hive-table创建hive表#

先启动hadoop集群

# 基于MySQL表创建hive表

sqoop create-hive-table \
--connect jdbc:mysql://nn1:3306/sqoop_db \
--username root \
--password 12345678 \
--table goods_table \
--hive-table hainiu.goods_table

报错:

修改sqoop配置文件

mv sqoop-env-template.sh  sqoop-env.sh

添加hadoop,hive,hbase等环境信息

export ZOOKEEPER_HOME=/usr/local/zookeeper
export HADOOP_HOME=/usr/local/hadoop
export HIVE_HOME=/usr/local/hive
export HIVE_CONF_DIR=/usr/local/hive/conf

将hive-common-3.1.3.jar拷贝到sqoop的lib目录下

cp /usr/local/hive/lib/hive-common-3.1.3.jar  /usr/local/sqoop/lib

测试:

查看hive表是否创建成功

4.4 多map条件查询导入HDFS#

语法 :

sqoop import \
--connect 数据库连接字符串 \
--username 数据库用户名 \
--password 数据库密码 \
--target-dir HDFS位置 \
--delete-target-dir \
--fields-terminated-by "\t" \
--num-mappers 3 \
--split-by 切分数据依据 \
--query 'select SQL where 查询条件 and $CONDITIONS'

参数解释 :

--query或--e 将查询结果的数据导入,使用时必须伴随参--target-dir,--hive-table,如果查询中有where条件,则条件后必须加上$CONDITIONS关键字

当sqoop使用--query+sql执行多个maptask并行运行导入数据时,每个maptask将执行一部分数据的导入,原始数据需要使用'--split-by 某个字段'来切分数据,不同的数据交给不同的maptask去处理。maptask执行sql副本时,需要在where条件中添加$CONDITIONS条件,这个是linux系统的变量,可以根据sqoop对边界条件的判断,来替换成不同的值,这就是说若split-by id,则sqoop会判断id的最小值和最大值判断id的整体区间,然后根据maptask的个数来进行区间拆分,每个maptask执行一定id区间范围的数值导入任务,如下为示意图。

4.3.1 导入文本文件#

#用hainiu认证

sqoop import \
--connect jdbc:mysql://nn1:3306/sqoop_db"?useUnicode=true&characterEncoding=UTF-8" \
--username root \
--password 12345678 \
--target-dir /user/hainiu/sqoop/data/goods_1 \
--delete-target-dir \
--fields-terminated-by "\001" \
--num-mappers 4 \
--split-by id \
--query 'select * from goods_table where id < 10 and $CONDITIONS'

# 注意:
# --split-by: 一般都是数值型。
# -Dorg.apache.sqoop.splitter.allow_text_splitter=true: --split-by的是字符串也可以

查询结果 :

4.3.2 导入其他格式文件#

# 导入不同格式,支持格式as-avrodatafile、as-parquetfile、as-sequencefile、as-textfile(默认格式)
# 多次导入时会报jar包已存在错误,请忽略,原因为sqoop读取源数据的schema文件创建的jar在前几次任务中已经创建了。

sqoop import \
--connect jdbc:mysql://nn1:3306/sqoop_db"?useUnicode=true&characterEncoding=UTF-8" \
--username root \
--password 12345678 \
--target-dir /user/hainiu/sqoop/data/goods_2_parquet \
--delete-target-dir \
--as-parquetfile \
--num-mappers 4 \
--split-by id \
--query 'select * from goods_table where id < 10 and $CONDITIONS'

结果:

4.5 全量导入hive表#

4.5.1 导入文本表#

# 导入命令
sqoop import \
--connect jdbc:mysql://nn1:3306/sqoop_db"?useUnicode=true&characterEncoding=UTF-8" \
--username root \
--password 12345678 \
--table goods_table \
--num-mappers 1 \
--delete-target-dir \
--hive-import \
--fields-terminated-by "\001" \
--hive-overwrite \
--hive-table hainiu.goods_table

上面过程分为两步:

​ 1)第一步将数据导入到HDFS,默认的临时目录是/user/当前操作用户/mysql表名;

​ 2)第二步将导入到HDFS的数据迁移到Hive表,如果hive表不存在,sqoop会自动创建内部表;(我们的是在/user/hainiu/goods_table,通过查看job的configuration的outputdir属性得知)

结果:

查询数据:

4.6 增量数据导入#

现在我们已经实现了 hive的数据导入方式,那么我们怎么实现hive的增量数据导入呢?

1、append方式

2、lastmodified方式,必须要加--append(追加)或者--merge-key(合并,一般填主键)

我们先建新表进行增量数据的演示

CREATE TABLE `goods_update_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `goods_sn` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '商品的唯一编号、货号',
  `goods_cname` varchar(100) COLLATE utf8_bin NOT NULL COMMENT '商品名称(中文)',
  `goods_ename` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '商品名称(英文)',
  `goods_price` double NOT NULL COMMENT '商品价格',
  `last_update_time` datetime NOT NULL DEFAULT now()COMMENT '最近一次更新商品配置的时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- 添加数据
INSERT INTO `goods_update_table` (goods_sn,goods_cname,goods_ename,goods_price,last_update_time) 
VALUES ('111111', '漂亮的高跟鞋1', '', 888, '2020-10-10 11:00:00');

4.6.1 全量导入#

sqoop import \
--connect jdbc:mysql://nn1:3306/sqoop_db"?useUnicode=true&characterEncoding=UTF-8" \
--username root \
--password 12345678 \
--table goods_update_table \
--num-mappers 1 \
--delete-target-dir \
--hive-import \
--fields-terminated-by "\001" \
--hive-overwrite \
--hive-table hainiu.goods_update_table

由于 --hive import 与 incremental 冲突, 所以增量导入不能直接导入到hive表中,但可以导入到hive表对应的hdfs目录里

4.6.2 按照id增量导入#

incremental append 用法

-- MySQL添加一条新的数据
INSERT INTO `goods_update_table` (goods_sn,goods_cname,goods_ename,goods_price,last_update_time) VALUES 
('222222', '漂亮的长筒靴1', '', 999, '2020-10-10 12:00:00');

-- 按照id增量导入
sqoop import \
--connect jdbc:mysql://nn1:3306/sqoop_db"?useUnicode=true&characterEncoding=UTF-8" \
--username root \
--password 12345678 \
--table goods_update_table \
--num-mappers 1 \
--target-dir /hive/warehouse/hainiu.db/goods_update_table \
--fields-terminated-by "\001" \
--incremental append \
--check-column id \
--last-value 1

-- 参数解释:
-- 1)incremental <mode> : append或lastmodified,使用lastmodified方式导入数据要指定增量数据是要--append(追加)还是要--merge-key(合并) 
-- 2)check-column <字段> : 作为增量导入判断的列名
-- 3)last-value val :  指定某一个值,用于标记增量导入的位置,这个值的数据不会被导入到表中,只用于标记当前表中最后的值。

4.6.3 按照时间增量导入#

--incremental lastmodified --append 用法

如果按照时间增量进行数据导入可以使用 --incremental lastmodified --append 这种方式进行数据导入,lastmodified 用于更新的日期列

INSERT INTO `goods_update_table` (goods_sn,goods_cname,goods_ename,goods_price,last_update_time) VALUES 
('333333', '漂亮的长筒靴2', '', 999, '2020-10-10 13:00:00');

sqoop import \
--connect jdbc:mysql://nn1:3306/sqoop_db"?useUnicode=true&characterEncoding=UTF-8" \
--username root \
--password 12345678 \
--table goods_update_table \
--num-mappers 1 \
--target-dir /hive/warehouse/hainiu.db/goods_update_table \
--fields-terminated-by "\001" \
--incremental lastmodified \
--check-column last_update_time \
--last-value '2020-10-10 13:00:00' \
--append

-- 注意:last-value 的设置是把包括 2020-10-10 13:00:00 时间的数据做增量导入。

结果:id=3的数据成功导入

4.6.3 按照时间增量并按照主键合并导入#

--incremental lastmodified --merge-key 用法

如果之前的数据有修改的话可以使用--incremental lastmodified --merge-key进行数据合并执行修改的SQL

-- 更改商品价格
update goods_update_table set goods_price=666 where id=3;

进行合并导入

sqoop import \
--connect jdbc:mysql://nn1:3306/sqoop_db"?useUnicode=true&characterEncoding=UTF-8" \
--username root \
--password 12345678 \
--table goods_update_table \
--num-mappers 1 \
--target-dir /hive/warehouse/hainiu.db/goods_update_table \
--fields-terminated-by "\001" \
--incremental lastmodified \
--check-column last_update_time \
--last-value '2020-10-10 13:00:00' \
--merge-key id

-- --incremental lastmodified  --merge-key的作用:修改过的数据和新增的数据(前提是满足last-value的条件)都会导入进来,并且重复的数据(不需要满足last-value的条件)都会进行合并 

4.7 import to hbase#

在nn1上安装hbase组件
解压hbase安装包到/usr/local目录下

 tar -zxvf /public/software/bigdata/hbase-2.4.13-bin.tar.gz -C /usr/local/

创建软连接

ln -s hbase-2.4.13/ hbase

修改hbase安装目录的所有者和属组为hadoop用户hadoop用户组

chown -R hadoop:hadoop /usr/local/hbase-2.4.13

修改conf目录下的hbase-env.sh配置文件

#添加以下内容
export JAVA_HOME=/usr/java/default
export HBASE_MANAGES_ZK=false

修改conf目录下的hbase-site.xml配置文件

<property>
    <name>hbase.rootdir</name>
    <value>hdfs://ns1/hbase</value>
</property>
<property>
  <name>hbase.tmp.dir</name>
  <value>/usr/local/hbase/tmp</value>
 </property>
<property>
    <name>hbase.zookeeper.property.clientPort</name>
    <value>2181</value>
</property>
<!-- zookeeper的端口号 -->
<property>
    <name>hbase.zookeeper.quorum</name>
    <value>nn1</value>
</property>
 <property>
  <name>hbase.cluster.distributed</name>
  <value>true</value>
 </property>

将准备好的hbasejar包导入到sqoop的lib目录下

tar -zxvf /public/software/other/hbasejars.tar.gz /usr/local/sqoop/lib

进入hbase客户端并创建hainiu名称空间

#连接hbase客户端
hbase shell
#创建hainiu的名称空间
create_namespace 'hainiu'

# sqoop导入hbase
sqoop import \
--connect jdbc:mysql://nn1:3306/sqoop_db"?useUnicode=true&characterEncoding=UTF-8" \
--username root \
--password 12345678 \
--table goods_table \
--hbase-create-table \
--hbase-table hainiu:goods_table \
--column-family cf \
--hbase-row-key id

# --hbase-row-key: 要求MySQL表必须有主键,将主键作为rowkey,标识一行 

导入后,查看:

scan 'hainiu:goods_table'

4.8 export 数据导出#

4.8.1 hdfs数据导出到MySQL中#

hdfs准备如下数据,放到/data/xinniu目录下

101|bob|manager|50000|yanfa
102|jerry|java |40000|yanfa
103|rose|php|30000|yanfa
104|jim|php|30000|yanfa
105|tom|bigdata|50000|yanfa
hadoop fs -put student /data/xinniu/

sqoop将hdfs数据导入到mysql表中,不会自动创建表,所以需要我们在mysql中,根据hdfs文件中的数据,创建对应的表

CREATE TABLE emp ( 
   id INT NOT NULL PRIMARY KEY, 
   name VARCHAR(20), 
   deg VARCHAR(20),
   salary INT,
   dept VARCHAR(10));

以下命令用于hdfs数据(位于HDFS上的/data/xinniu/的文件)导出到mysql中sqoop_db库下的emp表

sqoop export \
--connect jdbc:mysql://nn1:3306/sqoop_db"?useUnicode=true&characterEncoding=UTF-8" \
--username root \
--password 12345678 \
--export-dir /data/xinniu/data.txt \
--table emp \
--num-mappers 1 \
--input-fields-terminated-by '|'

验证

select * from emp;

4.8.2 hive表数据导出到mysql中#

sqoop的export命令支持 insert、update到关系型数据库,但是不支持merge;

hive表导入mysql数据库insert案例

查看hive中hainiu.student表数据

将数据导出到mysql中

CREATE TABLE student ( 
   id INT NOT NULL PRIMARY KEY, 
   name VARCHAR(20), 
   age INT);
sqoop export \
--connect  jdbc:mysql://nn1:3306/sqoop_db"?useUnicode=true&characterEncoding=UTF-8" \
--username root \
--password 12345678 \
--table student \
--export-dir /hive/warehouse/hainiu.db/student \
--num-mappers 1 \
--fields-terminated-by '\t'

结果:

hive表导入mysql数据库update案例

更新hive的数据

重新将hive表中的数据导入到mysql中并按照id进行更新

sqoop export \
--connect jdbc:mysql://nn1:3306/sqoop_db"?useUnicode=true&characterEncoding=UTF-8" \
--username root \
--password 12345678 \
--table student \
--export-dir /hive/warehouse/hainiu.db/student \
--update-key id \
--num-mappers 1 \
--fields-terminated-by '\t'

查看结果:

6 应用实例

需求:

编写一个脚本

将sqoop_db中的goods_table表每天抽取所有数据并导入到hdfs:/user/hainiu/goods_table目录下。并按照每天的日期生成对应的目录保存表数据。以shell脚本的方式运行每天定时运行。

vim goods_op.sh

batch_date=$1

sqoop import \
--connect jdbc:mysql://nn1:3306/sqoop_db \
--username root \
--password 12345678 \
--target-dir /user/hainiu/goods_table/${batch_date}/ \
--delete-target-dir \
--fields-terminated-by "\t" \
--split-by Id \
--query 'select * from goods_table where $CONDITIONS'

res=$?
if [ ${res} != 0 ];then
echo 'extract goods_table error! '`date` >> /data/hainiu/extract/goods_table.log
exit 1
else
echo 'extract goods_table successful '`date` >> /data/hainiu/extract/goods_table.log
fi

执行时,需要从外界将日期传递过来

# 给脚本添加执行权
chmod a+x goods_op.sh

# 执行脚本
sh -x goods_op.sh 20230305

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

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

相关文章

Mysql数据库——表操作的练习

题目一 &#xff08;1&#xff09; mysql> create database Market; &#xff08;2&#xff09; mysql> use Market; Database changed mysql> create table customers(->c_num INT(11) primary key auto_increment,->c_name varchar(50),->c_contact varcha…

chatGPT之100个例子-从体验到精通

简介 本博文演示了100个chatGPT在各行各业的使用例子,全部看完有助于培养chatGPT解决问题的思维。 在人工智能时代,智能软件并不会淘汰人类,淘汰人类的是会使用人工智能的人! 我们直接使用openAI官方chatGPT,生动演示了chatGPT的一些妙用! 请仔细看完,一定会有收获! 每…

Python 之 基本概述

这里写目录标题 一、Python 简介1. 历史背景2. 特点3. 优缺点4. 应用领域 二、Python 解释器1. 解释器是什么&#xff1f;2. 解释器的构成及其各部分功能3. 解释器的执行过程 三、Python 环境安装四、第一个 Python 程序1. 实际操作2. 常见问题 五、Python 开发环境 一、Python…

Ubuntu 22.04.2 LTS 安装搜狗输入法后,修改区域格式Regional Format crash 崩溃 ,改用bash 指令修改

故障 系统已经升级到最新 基于Ubuntu 20.04 LTS apt upgrade升级而来。 yeqiangyeqiang-MS-7B23:~$ cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.2 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04.2 LTS (Jammy Jellyfish)"…

【LangChain】Document篇

概述 这些是处理文档的核心链。它们对于总结文档、回答文档问题、从文档中提取信息等很有用。 这些链都实现了一个通用接口&#xff1a; class BaseCombineDocumentsChain(Chain, ABC):"""Base interface for chains combining documents."""a…

Vue:Elemenu-Plus递归型菜单组件封装

前端开发中&#xff0c;经常遇到需要与后端配置&#xff0c;前端动态渲染菜单的应用场景&#xff0c;而究其本质&#xff0c;就是菜单组件的应用&#xff0c;只是在不确定菜单级数的情况下&#xff0c;我们需要对组件做一个递归处理&#xff0c;让它能够适应大多数应用场景。 递…

9.17UEC++代码段、编码和字符串

1. 编码定义&#xff1a; 自行转码&#xff1a; 字符串&#xff1a; FName&#xff1a;名称&#xff0c;访问快&#xff0c;用FName做键值。&#xff08;键值容器&#xff09;资产名称基本都是FName。 FText&#xff1a;一般是和UI有关&#xff0c;专门对接UI&#xff0c;也是…

IDEA动态调试WebLogic

IDEA动态调试WebLogic 环境&#xff1a;Windows 10 Windows7(192.168.52.181) Idea WebLogic12.2.1.4 Java8102 0x01 安装weblogic 安装成功后&#xff0c;在domains下的bin目录下有个startWebLogic.cmd文件 0x02 配置被调试端 0x0201 添加调试参数 2.1.1 方式一 在…

基于单片机智能衣柜 智能衣橱 换气除湿制系统紫外线消毒的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;液晶显示当前衣柜温湿度和柜门开启关闭状态&#xff1b;按键设置当前衣柜湿度上限值、衣柜门打开和关闭&#xff0c;杀菌消毒&#xff1b;当湿度超过设置上限&#xff0c;继电器闭合开启风扇进行除湿&#xff1b;进行杀菌消毒时&am…

7.5 cloneGitHub项目到服务器端/wget/print/spikes_max

在机器学习和深度学习中&#xff0c;位量化&#xff08;Bit Quantization&#xff09;是一种将模型参数或激活值表示为较低精度的二进制数的技术。通常情况下&#xff0c;模型的参数和激活值是以浮点数形式存储和计算的&#xff0c;占用较大的存储空间和计算资源。位量化通过减…

找不到vcruntime140.dll无法继续执行代码的解决方法

计算机提示找不到vcruntime140.dll无法继续执行代码是什么原因呢&#xff1f;在我们运行photoshop&#xff0c;数据库的时候&#xff0c;电脑提示找不到vcruntime140.dll是由于电脑系统中的Microsoft Visual C Redistributable包损坏&#xff0c;vcruntime140.dll是Microsoft V…

(8)基础强化:内存流,压缩流,序列化,资料管理器,编码,File类,文件流,文本流

一、内存流 1、为什么要有内存流&#xff1f; 答&#xff1a;内存流(MemoryStream)是一个特殊的流&#xff0c;它将数据存储在内存中而不是磁盘或网络。 使用内存流的主要原因和使用场景包括&#xff1a; 内存操作&#xff1a; …

故障:启动修复无法修复你的电脑

有台笔记本很久没用了无法开机了&#xff0c;还是用的win7的系统&#xff0c;开机后提示我使用启动修复&#xff0c;但是失败了&#xff0c;提示我启动修复无法修复你的电脑 启动修复无法修复你电脑怎么办_自动修复电脑未正确启动的解决方法&#xff0d;win7之家 1、上网查了下…

Go语言程序设计(十七)并发编程

一、操作系统提供的并发基础 1、进程 进程是在并发环境下,程序的一次动态执行过程。它由进程控制块(PCB)、程序和数据三部分组成&#xff0c;进程在它的生命周期内可能处于执行、就绪、阻塞三种基本状态。 在多任务操作系统中,多个进程可以并发执行,而且进程是系统资源…

<数据结构>NO9.选择类排序|直接选择排序|堆排序

文章目录 选择排序1.直接选择排序优化直接选择排序 2. 堆排序 选择排序 基本思想 选组排序是从待排序数据中选出最大/最小的元素放入到序列的起始位置&#xff0c;直到待排序数据全部有序。 直接选择排序和堆排序的基本思想均符合选择排序。 1.直接选择排序 假设数据按升序…

Codeforces Round 883 (Div. 3)

A. Rudolph and Cut the Rope 只需要按照钉子距离的高度a_{i}和绳子的长度b_{i}的差值进行排序即可 代码 int n; pii a[N]; bool cmp(pii a,pii b) {return a.x-a.y<b.x-b.y; }void solve() {cin>>n;for(int i1;i<n;i)cin>>a[i].x>>a[i].y;sort(a1,…

36.RocketMQ之Broker如何实现磁盘文件高性能读写

highlight: arduino-light Broker读写磁盘文件的核心技术:mmap Broker中大量的使用mmap技术去实现CommitLog这种大磁盘文件的高性能读写优化的。 通过之前的学习&#xff0c;我们知道了一点&#xff0c;就是Broker对磁盘文件的写入主要是借助直接写入os cache来实现性能优化的&…

如何判断开发的商城系统是不是O2O平台?

纵观如今各大电商模式&#xff0c;数O2O发展最为火热&#xff0c;毫不夸张的说&#xff0c;O2O模式已经渗透到了很多行业中&#xff0c;那么哪些平台属于O2O呢?小编收集了一些资料&#xff0c;并将当下O2O平台分为以下这4种类型&#xff0c;下面小编就来带大家一起去了解了解!…

多模态系列论文--CoCa 详细解析

论文地址&#xff1a;CoCa: Contrastive Captioners are Image-Text Foundation Models 代码地址&#xff1a;CoCa CoCa 1 摘要2 网络结构3 损失函数4 实验结果5 总结 1 摘要 CoCa代表Contrastive Captioners的缩写&#xff0c;代表模型用两个目标函数训练出来的&#xff0c;一…

回溯法解决地图填色问题

目录 回溯法 最大度优先 最少可选颜色优先 向前探测 随机产生不同规模的图&#xff0c;分析算法效率与图规模的关系&#xff08;四色&#xff09; 回溯法 回溯法的基本思想是采用递归和深度优先搜索的方法&#xff0c;尝试在一组可能的解中搜索出符合要求的解&#xff0c…