HBase高手之路7—HBase之全文检索Phoneix

news2024/12/28 21:46:57

文章目录

  • HBase之全文检索Phoenix
    • 一、全文检索
    • 二、全文检索工具phoenix简介
      • 1. 简介
      • 2. 使用Phoenix是否会影响HBase性能
      • 3. 哪些公司在使用Phoenix
      • 4. 官方性能测试
        • 4.1 Phoenix对标Hive(基于HDFS和HBase)
        • 4.2 Phoenix对标Impala
        • 4.3 关于上述官网两张性能测试的说明
    • 三、OLTP和OLAP
      • 1. OLAP
      • 2. OLTP
    • 四、Phoenix的安装
      • 1.下载
      • 2.上传服务器
      • 3.解压
      • 4.修改HBase的配置文件hbase-site.xml
      • 5.分发HBase的配置文件到其他节点
      • 6.复制依赖包
        • 1)复制phoenix的服务器端jar包到master和worker的hbase的lib文件夹下
        • 2)复制phoenix的客户端jar包到phoenix的客户端也就是hadoop001的phoenix的bin文件夹下
        • 3)将配置后的hbase-site.xml拷贝到phoenix的bin目录
    • 五、启动phoenix客户端
      • 1.启动zookeeper
      • 2.启动hdfs
      • 3.启动hbase
      • 4.启动phoenix
      • 5.查看表
      • 6.查看HBase的web ui
    • 六、Phoenix的基本使用
      • 1.创建表
      • 2.查看表结构
      • 3.删除表
      • 4.列名大小写的问题
      • 5.插入数据
      • 6.查询数据
      • 7.修改数据
      • 8.删除数据
    • 七、HBase的命名空间
      • 1.简介
      • 2.创建命名空间
      • 3.列出命名空间
      • 4.查看命名空间详情
      • 5.删除命名空间
      • 6.在指定的命名空间下创建表
      • 7.添加数据到命名空间表
    • 八、列簇设计
    • 九、版本设计
    • 十、数据压缩
      • 1.压缩算法
      • 2.查看表的压缩算法
      • 3.设置数据压缩
        • 1)创建新表的时候
        • 2)修改已有表的压缩算法
    • 十一、ROWKEY设计原则
      • 1.避免使用递增行键/时序的数据
      • 2.避免rowkey和列的长度过大
      • 3.使用long等类型比String类型更节省空间
      • 4.rowkey唯一性
      • 5.避免数据热点
        • 1)热点
        • 2)预分区
        • 3)start key和end key
        • 4)预分区的个数
        • 5)rowkey避免数据热点设计
    • 十二、设置预分区
      • 1.指定start key和end key来分区
        • 1)创建预分区
        • 2)hbase的web ui查看分区的占用情况
      • 2.指定分区的数量、分区策略
        • 1)创建预分区
        • 2)hbase的web ui查看分区的占用情况
        • 3)分区数量
        • 4)分区策略
    • 十三、Phoenix的视图
      • 1.创建视图
      • 2.查询数据
    • 十四、二级索引
      • 1.索引分类
        • 1)全局索引
        • 2)本地索引
        • 3)覆盖索引
        • 4)函数索引
      • 2.创建索引
      • 3.根据索引查询数据
      • 4.删除索引
      • 5.查看索引

image-20230220084553544

HBase之全文检索Phoenix

一、全文检索

全文数据库是全文检索系统的主要构成部分。所谓全文数据库是将一个完整的信息源的全部内容转化为计算机可以识别、处理的信息单元而形成的数据集合。全文数据库不仅存储了信息,而且还有对全文数据进行词、字、段落等更深层次的编辑、加工的功能,而且所有全文数据库无一不是海量信息数据库。

二、全文检索工具phoenix简介

Phoenix官方网址:http://phoenix.apache.org/

1. 简介

img

image-20230419180604928

  • Phoenix官网:「We put the SQL back in NoSQL」
  • Apache Phoenix让Hadoop中支持低延迟OLTP和业务操作分析。
  • 提供标准的SQL以及完备的ACID事务支持
  • 通过利用HBase作为存储,让NoSQL数据库具备通过有模式的方式读取数据,我们可以使用SQL语句来操作HBase,例如:创建表、以及插入数据、修改数据、删除数据等。
  • Phoenix通过协处理器在服务器端执行操作,最小化客户机/服务器数据传输

Apache Phoenix可以很好地与其他的Hadoop组件整合在一起,例如:Spark、Hive、Flume以及MapReduce。

2. 使用Phoenix是否会影响HBase性能

image-20230419180938076

  • Phoenix不会影响HBase性能,反而会提升HBase性能
  • Phoenix将SQL查询编译为本机HBase扫描
  • 确定scan的key的最佳startKey和endKey
  • 编排scan的并行执行
  • 将WHERE子句中的谓词推送到服务器端
  • 通过协处理器执行聚合查询
  • 用于提高非行键列查询性能的二级索引
  • 统计数据收集,以改进并行化,并指导优化之间的选择
  • 跳过扫描筛选器以优化IN、LIKE和OR查询
  • 行键加盐保证分配均匀,负载均衡

3. 哪些公司在使用Phoenix

链接:https://phoenix.apache.org/who_is_using.html

image-20230419181313307

4. 官方性能测试

链接:https://phoenix.apache.org/performance.html

4.1 Phoenix对标Hive(基于HDFS和HBase)

image-20230419182228456

4.2 Phoenix对标Impala

image-20230419182303819

4.3 关于上述官网两张性能测试的说明

上述两张图是从Phoenix官网拿下来的,这容易引起一个歧义。就是:有了HBase + Phoenix,那是不是意味着,我们将来做数仓(OLAP)就可以不用Hadoop + Hive了?

千万不要这么以为,HBase + Phoenix是否适合做OLAP取决于HBase的定位。Phoenix只是在HBase之上构建了SQL查询引擎(注意:我称为SQL查询引擎,并不是像MapReduce、Spark这种大规模数据计算引擎)。HBase的定位是在高性能随机读写,Phoenix可以使用SQL快插查询HBase中的数据,但数据操作底层是必须符合HBase的存储结构,例如:必须要有ROWKEY、必须要有列蔟。因为有这样的一些限制,绝大多数公司不会选择HBase + Phoenix来作为数据仓库的开发。而是用来快速进行海量数据的随机读写。这方面,HBase + Phoenix有很大的优势。

三、OLTP和OLAP

1. OLAP

在线分析处理系统,hadoop、hbase、hive提供支持

2. OLTP

在线事务处理系统,传统的关系数据库支持

四、Phoenix的安装

1.下载

链接:https://phoenix.apache.org/download.html

从官网上下载与HBase版本对应的Phoenix版本。

image-20230419182630275

image-20230419182719770

2.上传服务器

image-20230419183031804

3.解压

tar -zxvf phoenix-hbase-2.4.0-5.1.3-bin.tar.gz -C ../servers/

解压文件:

image-20230419183210761

查看:

image-20230419183249391

4.修改HBase的配置文件hbase-site.xml

添加内容如下:

</property>
  <!-- 支持HBase命名空间映射 -->
	<property>
		<name>phoenix.schema.isNamespaceMappingEnabled</name>
		<value>true</value>
	</property>
	<property>
		<name>hbase.table.sanity.checks</name>
		<value>false</value>
	</property>
	<property>
		<name>hbase.coprocessor.abortonerror</name>
		<value>false</value>
	</property>
	<!-- 支持hbase的WAL -->
	<property>
	  <name>hbase.regionserver.wal.codec</name>
	  <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
	</property>

image-20230419183847837

5.分发HBase的配置文件到其他节点

scp conf/hbase-site.xml hadoop002:$PWD/conf 
scp conf/hbase-site.xml hadoop003:$PWD/conf 

image-20230419184120357

6.复制依赖包

1)复制phoenix的服务器端jar包到master和worker的hbase的lib文件夹下

hadoop001:

cp phoenix-server-hbase-2.4.0-5.1.3.jar /export/servers/hbase-2.4.10/lib/

image-20230419193212784

hadoop002:

scp phoenix-server-hbase-2.4.0-5.1.3.jar hadoop002:/export/servers/hbase-2.4.10/lib/

image-20230419215005826

hadoop003:

scp phoenix-server-hbase-2.4.0-5.1.3.jar hadoop003:/export/servers/hbase-2.4.10/lib/

image-20230419215159812

2)复制phoenix的客户端jar包到phoenix的客户端也就是hadoop001的phoenix的bin文件夹下

cp phoenix-client-hbase-2.4.0-5.1.3.jar bin/

image-20230419215604004

3)将配置后的hbase-site.xml拷贝到phoenix的bin目录

cp conf/hbase-site.xml ../phoenix-hbase-2.4.0-5.1.3-bin/bin/
cd ../phoenix-hbase-2.4.0-5.1.3-bin/bin/

image-20230419185619182

image-20230419185658226

五、启动phoenix客户端

1.启动zookeeper

2.启动hdfs

3.启动hbase

4.启动phoenix

image-20230419190133059

bin/sqlline.py hadoop001:2181

image-20230419220000744

说明启动成功

5.查看表

image-20230419222646542

6.查看HBase的web ui

image-20230419232837741

六、Phoenix的基本使用

1.创建表

语法:

create table if not exists 表名(
rowkey 名称 类型 primary key,
列簇名.列名 类型,
......;

在实际操作中,先用vscode之类的编辑工具,写好相关的语句,然后再复制到phoenix中运行

-- 创建表ORDER_1
create table if not exists ORDER_1 (
    ID varchar primary key ,
    C1.STATUS varchar ,
    C1.PAY_MONEY float ,
    C1.PAY_WAY integer ,
    C1.USER_ID varchar ,
    C1.OPERATION_DATE varchar ,
    C1.CATEGORY varchar
);

image-20230420092801776

2.查看表结构

语法:

desc 表名

image-20230420093017871

3.删除表

语法:

drop table if exists 表名;
drop table if exists ORDER_1;

image-20230420093222328

4.列名大小写的问题

  • 如果在使用列簇、列名的时候没有添加双引号,Phoenix会自动转换为大写
create table if not exists ORDER_1 (
    ID varchar primary key ,
    C1.Status varchar ,
    C1.PAY_MONEY float ,
    C1.PAY_WAY integer ,
    C1.user_id varchar ,
    C1.OPERATION_DATE varchar ,
    C1.category varchar
);

image-20230420093815032

  • 如果要将列名改为小写,则要用双引号括起来
  • 如果一旦加了双引号,后面任何使用该列的地方都得使用双引号,否则就会报错

5.插入数据

在Phoenix中,插入数据并不是insert,而是upsert,相当于insert和update合起来的缩写,与HBase shell中的put相当于,如果数据存在则修改,如果不存在则插入。

语法:

upsert into 表名(列簇名.列名,...) values(1,...);
upsert into ORDER_1 values ('000001','已完成',2000,1,'494419','2024-04-20 12:00:30','手机');

image-20230420094313769

6.查询数据

与标准的sql一样,在Phoenix中也是用select实现数据的查询

select * from ORDER_1;

image-20230420094420710

7.修改数据

在Phoenix中,修改数据也使用upsert

语法:

upsert into 表名(列簇名.列名,...) values(1,...);
upsert into ORDER_1(ID,C1.STATUS) values('000001','已付款') ;

image-20230420094730250

8.删除数据

在Phoenix中,删除数据与标准的sql一样,也是用delete from实现数据的删除

语法:

delete from 表名 where rowkey列名=;
delete from ORDER_1 where ID = '000001';

image-20230420094936059

七、HBase的命名空间

1.简介

类似与mysql和hive中的数据库,对数据进行分类存放,按照业务域来划分类别,这些不同的业务域就叫做命名空间(namespace)。

  • 在HBase中有一个默认的命名空间叫做default,默认情况下,创建的表都在default命名空间下。
  • 在HBase中还有一个命名空间,叫做hbase,用于存放系统的内建表(namespace,meta)
list_namespace

image-20230420095248098

2.创建命名空间

语法:

create_namespace 命名空间名
create_namespace "network"

image-20230420095417322

3.列出命名空间

语法:

list_namespace

4.查看命名空间详情

describe_namespace 命名空间名
describe_namespace "network"

image-20230420095604461

5.删除命名空间

语法:

drop_namespace 命名空间名
drop_namespace "network"

image-20230420095725995

注意:
删除命名空间时,必须在该命名空间下没有表,否则无法删除

6.在指定的命名空间下创建表

语法:

create “命名空间名:表名”,”列簇名”
create "network:students","info"

image-20230420100117841

在web ui 上查看:

image-20230420100211923

注意:
使用带有命名空间的表,用冒号将命名空间和表名连起来

7.添加数据到命名空间表

语法:

put “命名空间名:表名”,”rowkey”,”列簇名:列名”,值
put "network:students","0001","info:name","张三"                
put "network:students","0001","info:age",20
scan "network:students",{FORMATTER=>'toString'}

image-20230420100616497

八、列簇设计

HBase列蔟的数量应该越少越好,一般情况下,一个表只设计一个列簇

  • 两个及以上的列蔟HBase性能并不是很好
  • 一个列蔟所存储的数据达到flush的阈值时,表中所有列蔟将同时进行flush操作,这将带来不必要的I/O开销,列蔟越多,对性能影响越大

九、版本设计

版本数一般设计为1

一般情况下,如果对数据不做修改,只保留一个版本,可以节省大量的存储空间

describe "network:students"

image-20230420101022906

十、数据压缩

1.压缩算法

在HBase可以使用多种压缩编码,包括LZO、SNAPPY、GZIP。只在硬盘压缩,内存中或者网络传输中没有压缩。

压缩算法压缩后占比压缩解压缩
GZIP13.4%21 MB/s118 MB/s
LZO20.5%135 MB/s410 MB/s
Zippy/Snappy22.2%172 MB/s409 MB/s
  • GZIP的压缩率最高,但是其实CPU密集型的,对CPU的消耗比其他算法要多,压缩和解压速度也慢;
  • LZO的压缩率居中,比GZIP要低一些,但是压缩和解压速度明显要比GZIP快很多,其中解压速度快的更多;
  • Zippy/Snappy的压缩率最低,而压缩和解压速度要稍微比LZO要快一些

根据实际情况,选择合适的压缩算法

2.查看表的压缩算法

HBase中的表默认不适用压缩,进行数据压缩可以节省存储空间

image-20230420101450023

3.设置数据压缩

1)创建新表的时候

语法:

create "命名空间名:表名",{NAME => '列簇名', COMPRESSION => '压缩算法名'}

示例:

create_namespace "shop"
create "shop:orders",{NAME => 'C1',COMPRESSION => 'GZ'}
describe "shop:orders"

image-20230420101950342

2)修改已有表的压缩算法

语法:

alter “命名空间名:表名”,{NAME => ‘列簇名’, COMPRESSION => ‘压缩算法名’}

示例

create "shop:goods","C1"
alter "shop:goods",{NAME => 'C1', COMPRESSION => 'GZ'}

image-20230420102651353

image-20230420102715592

十一、ROWKEY设计原则

1.避免使用递增行键/时序的数据

如果ROWKEY设计的都是按照顺序递增(例如:时间戳),这样会有很多的数据写入时,负载都在一台机器上。我们尽量应当将写入大压力均衡到各个RegionServer

2.避免rowkey和列的长度过大

  • 在HBase中,要访问一个Cell(单元格),需要有ROWKEY、列蔟、列名,如果ROWKEY、列名太大,就会占用较大内存空间。所以ROWKEY和列的长度应该尽量短小
  • ROWKEY的最大长度是64KB,建议越短越好

3.使用long等类型比String类型更节省空间

long类型为8个字节,8个字节可以保存非常大的无符号整数,例如:18446744073709551615。如果是字符串,是按照一个字节一个字符方式保存,需要快3倍的字节数存储。

4.rowkey唯一性

  • 设计ROWKEY时,必须保证RowKey的唯一性
  • 由于在HBase中数据存储是Key-Value形式,若向HBase中同一张表插入相同RowKey的数据,则原先存在的数据会被新的数据覆盖。

5.避免数据热点

1)热点

  • 热点是指大量的客户端(client)直接访问集群的一个或者几个节点(可能是读、也可能是写)
  • 大量地访问量可能会使得某个服务器节点超出承受能力,导致整个RegionServer的性能下降,其他的Region也会受影响

2)预分区

  • 默认情况,一个HBase的表只有一个Region,被托管在一个RegionServer中

image-20230420103647107

image-20230420104059106

3)start key和end key

  • 每个Region有两个重要的属性:Start Key、End Key,表示这个Region维护的ROWKEY范围
  • 如果只有一个Region,那么Start Key、End Key都是空的,没有边界。所有的数据都会放在这个Region中,但当数据越来越大时,会将Region分裂,取一个Mid Key来分裂成两个Region

4)预分区的个数

  • 预分区个数 = 节点的倍数。默认Region的大小为10G,假设我们预估1年下来的大小为10T,则10000G / 10G = 1000个Region,所以,我们可以预设为1000个Region,这样,1000个Region将均衡地分布在各个节点上

5)rowkey避免数据热点设计

1.反转策略

如果设计出的ROWKEY在数据分布上不均匀,但ROWKEY尾部的数据却呈现出了良好的随机性,可以考虑将ROWKEY的翻转,或者直接将尾部的bytes提前到ROWKEY的开头。

示例:

182xxxx7890-->0987xxx281

182xxxx6379-->9736xxx281

182xxxx1355-->5531xxx281

20200911145043-->34054111900202

20200911145058-->85054111900202

20200911145501-->10554111900202

优点:实现简单

缺点:反转策略可以使ROWKEY随机分布,但是牺牲了ROWKEY的有序性;利于Get操作,但不利于Scan操作,因为数据在原ROWKEY上的自然顺序已经被打乱

2.加盐策略
在原来的rowkey的前面加上固定长度的随机数,这个随机数就叫做盐,这样使得rowkey具有随机性

优点:rowkey的随机性能保障数据在所有的regionserver之间的负载均衡
缺点:因为添加的是随机数,基于原来的rowkey查询时无法知道随机数是什么,会影响查询速度,不适合数据的读取

3.哈希策略
基于 ROWKEY的完整或部分数据进行 Hash,而后将Hashing后的值完整替换或部分替换原ROWKEY的前缀部分
这里说的 hash 包含 MD5、sha1、sha256 或 sha512 等算法

优点:同加盐策略

缺点:Hashing 也不利于 Scan,因为打乱了原RowKey的自然顺序

十二、设置预分区

1.指定start key和end key来分区

1)创建预分区

语法:

create_namespace "test"
create "test:t1",'C1',SPLITS=>['10','20','30','40'] 

image-20230420111155384

2)hbase的web ui查看分区的占用情况

image-20230420111302286

点击t1表,查看详情

image-20230420111331919

image-20230420111440500

image-20230420111539447

2.指定分区的数量、分区策略

1)创建预分区

create "test:t2","C1",{NUMREGIONS=>6,SPLITALGO=>'HexStringSplit'}

image-20230420111711588

2)hbase的web ui查看分区的占用情况

image-20230420111814433

点击t2查看详情

image-20230420111854078

3)分区数量

一般按照数据量来预估或者根据节点数的倍数来设定

4)分区策略

  • HexStringSplit:rowkey是采用十六进制字符串作为前缀
  • DecimalStringSplit:rowkey采用十进制数字字符串作为前缀
  • UniformStringSplit:rowkey的前缀是随机的

十三、Phoenix的视图

Phoenix的视图就是对已经创建的HBase表建立映射关系,从而实现对已有表的快速查询。

1.创建视图

语法:

create view if not exists "命名空间名"."表名" (
    "Rowkey名" 类型r primary key,   
    "列簇"."列名" 类型,
"列簇"."列名" 类型
……
);

示例:

create view if not exists "shop"."goods" (
    "id" varchar primary key,
    "C1"."name" varchar,
    "C1"."price" varchar
);

image-20230420112608312

2.查询数据

语法:

select * from "命名空间名"."表名" where 条件;

示例:

添加数据(hbase shell):

put "shop:goods","000001","C1:name","冰箱"
put "shop:goods","000001","C1:price",5800
put "shop:goods","000002","C1:name","洗衣机"
put "shop:goods","000002","C1:price",3500

查询:

select * from "shop"."goods";

image-20230420113204104

十四、二级索引

一般情况下,Hbase会根据rowkey建立索引,来提供查询的速度,这样的索引叫做一级索引。如果根据name进行查询,因为没有根据name建立索引,所以查询效率比较低,这是可以给name来创建二级索引。

1.索引分类

  • 全局索引
  • 本地索引
  • 覆盖索引
  • 函数索引

1)全局索引

  • 全局索引适用于读多写少的业务
  • 全局索引主要的负载发生在写入操作时,比如upsert、delete,Phoenix会拦截数据表的更新,构建索引更新,开销比较大
  • 读取时,Phoenix会选择最快的能够查询出数据的索引。
  • 全局索引一般要跟覆盖索引搭配使用

语法:

create index 索引名称 on 表名(列名1,列名2……);

举例:

添加数据:

upsert into ORDER_1 values ('000001','已完成',2000,1,'494419','2024-04-20 12:00:30','手机');
upsert into ORDER_1 values ('000002','已付款',6666,1,'494420','2024-04-20 12:00:30','电脑');

image-20230420114228524

创建视图:

create index idxname on ORDER_1(CATEGORY);

image-20230420113726459

注意:Phoenix中的索引,其实底层还是Hbase的表结构,这些索引表是专门用来加快查询速度。

image-20230420113829824

image-20230420114342365

2)本地索引

  • 本地索引适合写操作频繁的场景
  • 在本地索引中,索引数据和业务表数据存储在同一个服务器上,加快写入的速度
  • 本地索引的数据是保存在一个影子列簇中

创建语法:

create local index 索引名称 on 表名(列名1,列名2……);

3)覆盖索引

可以不需要在找到索引条目后返回到主表中,可以将关心的数据捆绑在索引行中,从而节省了读取的时间开销。

创建语法:

create index 索引名称 on 表名(列名1,列名2……) include(列名3);

示例:

create index idxcombo on ORDER_1(CATEGORY,STATUS,PAY_MONEY) include(USER_ID);

image-20230420114730953

image-20230420114818875

4)函数索引

适用于高版本的phoenix,可以基于任意表达式(函数)创建索引
语法

create index 索引名称 on 表名(函数名(列名1),列名2……);

2.创建索引

create index idxsuerid on ORDER_1(C1.USER_ID) include(ID,C1.PAY_MONEY);

image-20230420115131985

3.根据索引查询数据

select C1.USER_ID,ID,C1.PAY_MONEY from ORDER_1 where C1.USER_ID='494419';

image-20230420122254811

注意:查询的时候还是得加上列簇。

4.删除索引

drop index 索引名 on 表名

示例:

drop index IDXCOMBO on ORDER_1;

image-20230420122432478

5.查看索引

image-20230420122541717

参考文章:

全文检索

刚搭完HBase集群,Phoenix一启动,HBase就全崩了,是什么原因?

Phoenix映射hbase原表实现

HBase系列(四)、HBase优化之RowKey 设计

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

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

相关文章

python基础案例题:进制转换、字符串加密的实现、猜拳游戏、多种方法计算π

目录 前言1.进制转换2.字符串加密的实现3.猜拳游戏4.多种方法计算π尾语 &#x1f49d; 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 1.进制转换 功能&#xff1a; 获取十进制整数的二进制串&#xff0c;相当于内置函数bin。 算法分析&#xff1a; 对2辗转相除&…

pyecharts从入门到精通-地图专题Map-世界地图和中国城市地图

文章目录 参考安装与查看pyecharts地图实现-Geo数据集查看读取数据生成中文国家名称国家中文和英文名称字典:根据字典&#xff0c;生成国家中文名查看没有转换成功的国家中文有哪些过滤包含中文国家名的数据 可视化人口数据显示中国城市地图数据 拓展-pyecharts中Map源码拓展-p…

开放耳机有什么优缺点,推荐几款不错的开放式耳机

​由于骨传导耳机可以保持耳朵的开放&#xff0c;长时间佩戴不会有闷热感&#xff0c;同时可以在运动中保持安全&#xff0c;因此被越来越多的人接受。在目前市面上骨传导耳机品牌众多&#xff0c;价格从几十元到上千元不等&#xff0c;为了让大家更好地挑选适合自己的骨传导耳…

java获取两个日期之间的所有日期

1、获取日期的过程&#xff1a; 首先创建一个数组&#xff0c;然后在数组的末尾加上一个日期。当我们有两个日期时&#xff0c;可以把这两个日期当做是不同的数组&#xff0c;然后使用 next函数把这两个日期之间的所有时间都获取出来。 2、代码演示&#xff1a; 3、实现效果&am…

bat批处理文件无法执行

执行后弹出cmd窗口&#xff0c;但里面命令未执行 方案一&#xff1a; 1、打开开始菜单——控制面板 2、点击系统和安全——系统 3、点击左上角的“高级系统设置” 4、切换到“高级”选项卡&#xff0c;点击下方的“环境变量” 5、在用户变量下方点击“新建”&#xff0c;…

3.2.3队列的链式实现

队列的链式实现 注意声明队头指针和队尾指针作用 (1)插入节点的时候只要rear指针指向结点的next指针指向的位置&#xff1b; (2)删除只要front指指针指向的头节点next指针指向的位置删除&#xff1b; &#xff08;1&#xff09;初始化&#xff08;带头结点&#xff09; 初试化…

C++:多态的底层实现原理 -- 虚函数表

目录 一. 多态的原理 1.1 虚函数表 1.2 多态的实现原理 1.3 动态绑定与静态绑定 二. 多继承中的虚函数表 2.1 虚函数表的打印 2.2 多继承中虚函数表中的内容存储情况 一. 多态的原理 1.1 虚函数表 对于一个含有虚函数的的类&#xff0c;在实例化出来对象以后&#xff0…

Docker部署SpringBoot+Vue项目

1.项目部署规划 1.后端多模块项目blog以及各模块运行端口&#xff1a; 前台服务模块sangeng-blog->7777&#xff0c;后台服务模块sangeng-admin->8989&#xff0c;公共模块sangeng-framework 2.前端前台Vue项目&#xff1a;sg-blog-vue->80 3.前端后台Vue项目&#x…

如何在AWS EKS上部署安装nginx ingress controller

Ingress Controller Ingress Controller 通常是一个负载均衡器&#xff0c;用于将外部流量路由到您的 Kubernetes 集群&#xff0c;并负责 L4-L7 网络服务 Ingress controller 仅覆盖 L7 流量&#xff0c;而入口重新路由 HTTP 和 HTTPS 流量 Type of Ingress Controllers C…

QT编程集成环境在Ubuntu中如何使用ROS工程?

文章目录 0.引言1.安装Qt Creator&#xff08;带ROS插件&#xff09;2.创建ROS工程3.创建功能包4.创建节点5.添加编译规则6.编译运行 0.引言 在进行ROS开发过程中&#xff0c;会创建许多功能包和源代码文件&#xff0c;这些文件少量时&#xff0c;手动管理还能接受&#xff0c;…

微搭低代码学习之数据收集

低代码和开发之间的关系 低代码平台是一种快速构建应用程序的工具&#xff0c;旨在提高开发效率。它们提供了一种基于图形用户界面的方式来创建应用程序&#xff0c;而无需编写大量的代码。使用低代码平台&#xff0c;开发人员可以更快速地构建和交付应用程序&#xff0c;从而缩…

nginx--HTTPS服务

目录 1.为什么要使用https 2.https协议的实现 1.对称加密 2.非对称加密 3.https加密 3.生成密钥和CA证书需要的依赖 1.查看是否有装openssl 2.查看nginx是否有 --with-http_ssl_module 4.生成密钥和CA证书步骤 步骤一、生成key密钥 步骤二、通过密钥去生成证书签名请求文件…

Java多例Bean的应用场景-easyExcel导入

目录 1. bean注入方式&#xff08;IOC&#xff09;2. 有状态会话bean和无状态会话bean3. 单例模式和多例模式4. 深挖多例模式应用场景&#xff1f; 1. bean注入方式&#xff08;IOC&#xff09; 2. 有状态会话bean和无状态会话bean 有状态会话bean&#xff1a;每个用户有自己特…

2023什么电脑配置适合机器学习和人工智能

机器学习和人工智能应用有多种类型——从传统的回归模型、非神经网络分类器和以 Python SciKitLearn 和 R 语言的功能为代表的统计模型&#xff0c;到使用 PyTorch 和 TensorFlow 等框架的深度学习模型. 在这些不同类型的 ML/AI 模型中&#xff0c;也可能存在显着差异。“最佳”…

不用ChatGPT,只用CodeGeeX with Chat!一样实现智能问答

在ChatGPT推出后&#xff0c;许多人发现&#xff0c;它在编程方面也具有强大的能力——在编写代码过程中&#xff0c;如果遇到问题&#xff0c;可以不必去搜索引擎寻找答案&#xff0c;而是直接向ChatGPT提问。不过&#xff0c;在申请使用一些功能时&#xff0c;需要先等待各种…

机器人感知与控制关键技术及其智能制造应用

源自&#xff1a;自动化学报 作者&#xff1a;王耀南 江一鸣 姜娇 张辉 谭浩然 彭伟星 吴昊天 曾凯 摘 要 智能机器人在服务国家重大需求, 引领国民经济发展和保障国防安全中起到重要作用, 被誉为“制造业皇冠顶端的明珠”. 随着新一轮工业革命的到来, 世界主要工业国…

【Linux】System V IPC-进程信号

进程信号 信号的概念信号的产生信号的种类信号的处理方式信号的注册信号的注销信号的自定义处理方式信号的捕捉流程信号的阻塞常见的程序崩溃父子进程进程等待自定义信号处理方式volatile关键字 信号的概念 信号是一个软件中断&#xff0c;实际上是操作系统告诉进程需要进程执行…

08 - 文章详情页面

文章详情页面 8-1&#xff1a;开篇 从本章开始我们要进入文章详情的页面开发。 在文章详情页面可以展示&#xff1a; 文章标题作者信息发布时间文章内容文章评论 同时你可以在这里进行&#xff1a; 作者关注文章评论文章点赞文章收藏 等操作。 基本功能大家可以进入到我…

IT知识百科:什么是暴力破解?

暴力破解是一种常见的网络安全攻击方法&#xff0c;它利用计算机程序自动尝试大量的密码组合来破解密码。这种攻击方法通常用于获取未经授权的访问权限&#xff0c;如入侵网络系统或个人账户。在本文中&#xff0c;我们将探讨暴力破解的原理、工具和防范方法。 暴力破解的原理 …

WPS表格的重复项使用方法

重复项就是指一列内容中有重复一样的值&#xff0c;或者两列数据对比后是否有重复的值&#xff0c;而在WPS表格中提供了直接标记重复值&#xff08;高度重复项&#xff09;&#xff0c;删除重复值和限制重复值在一个单元格区域中输入。 【WPS表格的高度重复项】 作用是&#…