Hive学习——DDLDML语句

news2024/12/22 22:10:44

目录

一、Hive数据类型

(一)Hive基本数据类型

(二)Hive的基本数据类型转换

(三)Hive集合数据类型

(四)文本文件数据编码

(五)读时模式

(六)Hive数据结构

二、DDL&DML命令

(一)数据库操作

1.创建数据库

2.查看数据库

3.修改数据库

4.删除数据库

5.切换(使用)指定数据库

(二)表操作

1.建表语法

2.内部表

3.外部表

4.内部表与外部表的转换

5.分区表

6.分桶表

7.修改表与删除表

(三)数据操作

1.数据导入

2.插入数据

3.数据导出


一、Hive数据类型

(一)Hive基本数据类型

类型

示例

类型

示例

TINYINT

10

SMALLINT

10

INT

10

BIGINT

100L

FLOAT

1.342

DOUBLE

1.234

DECIMAL

3.14

BINARY

1010

BOOLEAN

TRUE

STRING

'Book' or "Book"

CHAR

'YES' or "YES"

VARCHAR

'Book' or "Book"

DATE

'2013-01-31'

TIMESTAMP

'2020-01-31 00:13:00.345'

(二)Hive的基本数据类型转换

参考下图,可以从下至上进行转换

任何整数类型都可以隐式转换为一个范围更广的类型。tinyint=>int;int=>bigint;

所有整数类型、float、string(都是数字)都可以隐式转换为Double;

tinyint、smallint、int=>float;

boolean不能转换;

select '1.0'+2; -- 3
select '88' > 888;
select '1'+true;-- 报错,boolean不能转换
select cast('111' as int);-- 111

(三)Hive集合数据类型

(四)文本文件数据编码

vi 中输入特殊字符:
  • (Ctrl + v) + (Ctrl + a) => ^A
  • (Ctrl + v) + (Ctrl + b) => ^B
  • (Ctrl + v) + (Ctrl + c) => ^C
^A / ^B / ^C 都是特殊的控制字符,使用 more cat 命令是看不见的;可以使用cat - A file.dat 

1.创建一个表

create table s1(
    id int,
    name string,
    age int,
    hobby array<string>,
    score map<string,int>
);

2.XShell端创建文本文件

[root@lxm147 stufile]# cat -A /opt/stufile/s1.txt 
666^Alisi^A18^Aread^Bgame^Ajava^C97^Bhadoop^C87$

 3.上传数据

load data local inpath '/opt/stufile/s1.txt' into table s1;

select * from s1;

4.运行结果

(五)读时模式

        在传统数据库中,在加载时发现数据不符合表的定义,则拒绝加载数据。数据在写入 数据库时对照表模式进行检查,这种模式称为 " 写时模式 " schema on write )。
写时模式 -> 写数据检查 -> RDBMS
        Hive中数据加载过程采用 " 读时模式 " (schema on read) ,加载数据时不进行数据格式的校验,读取数据时如果不合法则显示 NULL 。这种模式的优点是加载数据迅速。
读时模式 -> 读时检查数据 -> Hive ;好处:加载数据快;问题:数据显示 NULL

(六)Hive数据结构

二、DDL&DML命令

(一)数据库操作

  • Hive的默认数据库为default,如果不指定数据库,则默认使用default;
  • Hive的数据库名、表名不区分大小写;
  • 名字不能使用数字开头;
  • 不能使用关键字,尽量不使用特殊符号。

1.创建数据库

(1)语法

CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];-- K-V键值对信息

(2)案例

1)创建一个数据库,不指定路径:

create database db_hive1;

注:若不指定路径,其默认路径为${/opt/soft/hive312/warehouse}/database_name.db

参考博文《Hive学习——单机版Hive的安装》2.2

2)创建一个数据库,指定路径:

create database db_hive2 location '/db_hive2';

3)创建一个数据库带有dbproperties

create database db_hive3 with dbproperties('create_date'='2023-01-01');

2.查看数据库

(1)展示所有数据库

SHOW DATABASES [LIKE 'identifier_with_wildcards'];

注:like通配表达式说明:*表示任意个任意字符,|表示或的关系。

-- 查看以'db'为开头的数据库
show databases like 'db*';

(2)查看数据库信息

DESCRIBE | DESC DATABASE [EXTENDED] db_name;

1)查看基本信息

desc database db_hive3;

2)查看更多信息

desc database extended db_hive3;

3.修改数据库

--修改dbproperties
ALTER DATABASE database_name SET DBPROPERTIES (property_name=property_value, ...);

--修改location
ALTER DATABASE database_name SET LOCATION hdfs_path;

--修改owner user
ALTER DATABASE database_name SET OWNER USER user_name;

注:修改数据库location,不会改变当前已有表的路径信息,而只是改变后续创建的新表的默认的父目录。 

alter database db_hive3 set dbproperties ('create_date'='2023-02-01');

4.删除数据库

DROP DATABASE [IF EXISTS] database_name [RESTRICT|CASCADE];

注:RESTRICT:严格模式,若数据库不为空,则会删除失败,默认为该模式。

       CASCADE:级联模式,若数据库不为空,则会将库中的表一并删除。

drop database db_hive1 restrict ;
drop database db_hive3 cascade ;

5.切换(使用)指定数据库

use database_name;

(二)表操作

1.建表语法

create [external] table [IF NOT EXISTS] table_name
[(colName colType [comment 'comment'], ...)]
[comment table_comment]
[partition by (colName colType [comment col_comment], ...)]
[clustered BY (colName, colName, ...)
[sorted by (col_name [ASC|DESC], ...)] into num_buckets
buckets]
[row format row_format]
[stored as file_format]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement];


CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS]
[db_name.]table_name
LIKE existing_table_or_view_name
[LOCATION hdfs_path];
1. CREATE TABLE :按给定名称创建表,如果表已经存在则抛出异常。可使用 if not
exists 规避;
2. EXTERNAL 关键字:
        创建外部表,否则创建的是内部表( 管理表 )
        删除内部表时,数据和表的定义(元数据)同时被删除;
        删除外部表时,仅仅删除了表的定义(元数据),数据保留;
         在生产环境中,多使用外部表;
3. comment :表的注释;
4. partition by :对表中数据进行分区,指定表的分区字段;
5. clustered by :创建分桶表,指定分桶字段;
6. sorted by :对桶中的一个或多个列排序,较少使用。

存储子句:

ROW FORMAT DELIMITED
[FIELDS TERMINATED BY char] -- 字段分隔符
[COLLECTION ITEMS TERMINATED BY char] -- 集合分隔符
[MAP KEYS TERMINATED BY char] -- map分隔符
[LINES TERMINATED BY char] | SERDE serde_name -- 行分隔符
[WITH SERDEPROPERTIES (property_name=property_value,
property_name=property_value, ...)]
AS :后面可以接查询语句,表示根据后面的查询结果创建表。
LIKE like 表名,允许用户复制现有的表结构,但是不复制数据。

查看建表语句:

show create table 表名;

2.内部表

-- 创建内部表

create table t1(
    id int,
    name string,
    hobby array<string>,
    addr map<string,string>
)row format delimited fields terminated by ';'
collection items terminated by ','
map keys terminated by ':'
lines terminated by '\n';
-- 显示表的定义,显示的信息较少
desc t1; 

-- 显示表的定义,显示的信息多,格式友好

desc formatted t1; 
-- 数据源
2;zhangsan;book,TV,code;beijing:chaoyang,shagnhai:pudong
3;lishi;book,code;nanjing:jiangning,taiwan:taibei
4;wangwu;music,book;heilongjiang:haerbin

-- 加载数据

load data local inpath '/opt/stufile/t1.dat' into table t1;
-- 查询数据
select * from t1;

-- 查询数据文件

dfs -cat /opt/soft/hive312/warehouse/mydb.db/t1/t1.dat;


2;zhangsan;book,TV,code;beijing:chaoyang,shagnhai:pudong
3;lishi;book,code;nanjing:jiangning,taiwan:taibei
4;wangwu;music,book;heilongjiang:haerbin

-- 删除表,表和数据同时被删除

drop table t1;

-- 再次查看数据文件,已经被删除

dfs -ls /opt/soft/hive312/warehouse/mydb.db

3.外部表

-- 创建外部表

create external table t2(
    id int,
    name string,
    hobby array<string>,
    addr map<string,string>
)row format delimited fields terminated by ';'
collection items terminated by ','
map keys terminated by ':'
lines terminated by '\n'
location '/opt/lsl';-- 指定外部表的存放目录,如果hdfs没有创建,会自动创建

-- 显示表的定义

desc formatted t2;

-- 加载数据

load data local inpath '/opt/stufile/t1.dat' [overwrite] into table t2;

-- 查询表数据

select * from t2;

-- 查看数据源

dfs -cat /opt/lsl/t1.dat;

-- 删除外部表,表不存在,但是数据还在

drop table t2;
show tables ;
dfs -cat /opt/lsl/t1.dat;

4.内部表与外部表的转换

(1)内部表转外部表

alter table t1 set tblproperties ('EXTERNAL'='TRUE');

(2)外部表转内部表

alter table t1 set tblproperties ('EXTERNAL'='FALSE');

小结

建表时:
  • 如果不指定external关键字,创建的是内部表;
  • 指定external关键字,创建的是外部表;
删表时:
  • 删除外部表时,仅删除表的定义,表的数据不受影响;
  • 删除内部表时,表的数据和定义同时被删除;
外部表的使用场景:
  • 想保留数据时使用,生产多用外部表。

5.分区表

  1. Hive在执行查询时,一般会扫描整个表的数据。由于表的数据量大,全表扫描消耗时 间长、效率低。
  2. 而有时候,查询只需要扫描表中的一部分数据即可,Hive引入了分区表的概念,将表 的数据存储在不同的子目录中,每一个子目录对应一个分区。只查询部分分区数据时,可避免全表扫描,提高查询效率。
  3. 在实际中,通常根据时间、地区等信息进行分区。

-- 创建分区表

create table if not exists t3
(
    id    int,
    name  string,
    hobby array<string>,
    addr  map<string,string>
) partitioned by (dt string)
    row format delimited fields terminated by ';'
        collection items terminated by ','
        map keys terminated by ':'
        lines terminated by '\n';

-- 加载数据到对应分区,该语句不需要新建分区

load data local inpath '/opt/stufile/t1.dat' into table t3 partition (dt = '2020-06-01');
load data local inpath '/opt/stufile/t1.dat' into table t3 partition (dt = '2020-06-02');

-- 查看分区

show partitions t3;

-- 新增分区不加载数据

alter table t3 add partition (dt = '2020-06-03');

-- 新增多个分区,不加载数据

alter table t3 add partition (dt = '2020-06-04') partition (dt = '2020-06-05');

-- 新增多个分区,准备数据

dfs -cp /opt/soft/hive312/warehouse/mydb.db/t3/dt=2020-06-01 /opt/soft/hive312/warehouse/mydb.db/t3/dt=2020-06-07;

dfs -cp /opt/soft/hive312/warehouse/mydb.db/t3/dt=2020-06-01 /opt/soft/hive312/warehouse/mydb.db/t3/dt=2020-06-08;

-- 拷贝后检查是否有数据

dfs -cat /opt/soft/hive312/warehouse/mydb.db/t3/dt=2020-06-07/t1.dat;

dfs -cat /opt/soft/hive312/warehouse/mydb.db/t3/dt=2020-06-08/t1.dat;

-- 新增多个分区,加载数据

alter table t3
    add partition (dt = '2020-06-07') location '/opt/soft/hive312/warehouse/mydb.db/t3/dt=2020-06-07'
        partition (dt = '2020-06-08') location '/opt/soft/hive312/warehouse/mydb.db/t3/dt=2020-06-08';

-- 查询数据

select * from t3;

 -- 修改分区的hdfs路径

alter table t3
    partition (dt = '2020-06-01') set location '/opt/soft/hive312/warehouse/mydb.db/t3/dt=2020-06-03';

-- 加载数据

load data local inpath '/opt/stufile/t1.dat' into table t3 partition (dt = '2020-06-03');

-- 删除分区:可以删除一个或多个分区,用逗号隔开

alter table t3 drop partition (dt='2020-06-03'),partition (dt='2020-06-04');

6.分桶表

        当单个的分区或者表的数据量过大,分区不能更细粒度的划分数据,就需要使用分桶技术将数据划分成更细的粒度。将数据按照指定的字段进行分成多个桶中去,即将数据按照字段进行划分,数据按照字段划分到多个文件当中去。分桶的原理:
  • MR中:key.hashCode % reductTask
  • Hive中:分桶字段.hashCode % 分桶个数

-- 创建分桶表

create table course(
    id int,
    name string,
    score int
)
clustered by (id) into 3 buckets
row format delimited fields terminated by '\t';

-- 创建普通表

create table course_common(
    id int,
    name string,
    score int
)
row format delimited fields terminated by '\t';

-- 普通表加载数据

load data local inpath '/opt/stufile/course.dat' into table course_common;


1       java    90
1       c       78
1       python  91
1       hadoop  80
2       java    75
2       c       76
2       python  80
2       hadoop  93
3       java    98
3       c       74
3       python  89
3       hadoop  91
5       java    93
6       c       76
7       python  87
8       hadoop  88

注:数据之间不是空格,而是Tab键

-- 通过 insert ... select ... 给桶表加载数据

insert into table course select * from course_common;

-- 查看分桶表

dfs -ls /opt/soft/hive312/warehouse/mydb.db/course;

-- 第一个分区:id%3=0

dfs -cat /opt/soft/hive312/warehouse/mydb.db/course/000000_0;

-- 第二个分区:id%3=1

dfs -cat /opt/soft/hive312/warehouse/mydb.db/course/000001_0;

-- 第三个分区:id%3=2

dfs -cat /opt/soft/hive312/warehouse/mydb.db/course/000002_0;

备注:
分桶规则: 分桶字段.hashCode % 分桶数
分桶表加载数据时,使用 insert... select ... 方式进行
网上有资料说要使用分区表需要设置 hive.enforce.bucketing=true ,是 Hive1.x 以前的版本; Hive 2.x 中,删除了该参数,始终可以分桶;

7.修改表与删除表

--修改表名

alter table course_common rename to course_common1;
-- 修改列名
alter table course_common1 change column id cid int;

-- 修改字段类型

alter table course_common1 change column cid cid string;
注:修改字段数据类型时,要满足数据类型转换的要求。如 int 可以转为 string ,但是string 不能转为 int。
-- 增加字段,默认数据为null
alter table course_common1 add columns (common string);

-- 删除字段

alter table course_common1 replace columns (id string,cname string,score int);

注:这里仅仅只是在元数据中删除了字段,并没有改动hdfs上的数据文件

-- 删除表
drop table course_common1;

(三)数据操作

1.数据导入

LOAD DATA [LOCAL] INPATH 'filepath'
[OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1,
partcol2=val2 ...)]
LOCAL
LOAD DATA LOCAL ... 从本地文件系统加载数据到Hive表中,本地文件会拷贝到Hive表指定的位置;
LOAD DATA ... 从HDFS加载数据到Hive表中,HDFS文件移动到Hive表指定的位置
INPATH :加载数据的路径
OVERWRITE :覆盖表中已有数据;否则表示追加数据
PARTITION :将数据加载到指定的分区

-- 创建表

CREATE TABLE tabA
(
    id   int,
    name string,
    area string
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

-- 加载本地文件到hive(tabA),本地文件会拷贝到表中

load data local inpath '/opt/stufile/sourceA.txt' into table tabA;

1,fish1,SZ
2,fish2,SH
3,fish3,HZ
4,fish4,QD
5,fish5,SR

-- 查看tabA数据

select * from tabA;

-- 本地文件还在

-- 加载hdfs文件到hive(tabA),本地文件会移动到表中

load data inpath '/data/sourceA.txt' into table tabA;
-- 检查hdfs文件,已经被转移
dfs -cat /data/sourceA.txt;

-- 加载数据覆盖表中已有数据

load data local inpath '/opt/stufile/sourceA.txt' overwrite into table tabA;
-- 创建表时加载数据
dfs -mkdir /data/tabB;
dfs -put /opt/stufile/sourceA.txt /data/tabB;
dfs -cat /data/tabB/sourceA.txt;

create table tabB
(
    id   int,
    name string,
    area string
) row format delimited fields terminated by ','
    location '/data/tabB';

select * from tabB;

2.插入数据

-- 创建分区表

create table tabC(
    id int,
    name string,
    area string
)partitioned by (month string)
row format delimited fields terminated by ',';

-- 插入数据

insert into tabC partition (month = '202301')
values (1, 'zhangsan', 'BJ'),
       (2, 'lisi', 'SH'),
       (3, 'wangwu', 'NJ');

-- 结果

-- 插入查询的结果数据

insert into tabC partition (month = '202302')
select id, name, area
from tabC
where month = '202301';

-- 结果

 -- 多表(多分区)插入模式

from tabC insert overwrite table tabC partition (month = '202303')
select id, name, area where month = '202302'
insert overwrite table tabC partition (month = '202304')
select id, name, area where month = '202302';

-- 结果

-- 创建表并插入数据(as select)

insert overwrite local directory '/opt/stufile/tabC' select * from tabC where month='202304';

-- 结果

[root@lxm147 ~]# cat /opt/stufile/tabC/000000_0 
1zhangsanBJ202304
2lisiSH202304
3wangwuNJ202304

-- 将查询结果格式化输出到本地

insert overwrite local directory '/opt/stufile/tabC2'
row format delimited fields terminated by ' '
select * from tabC;

-- 结果

[root@lxm147 ~]# cat /opt/stufile/tabC2/000000_0 
1 zhangsan BJ 202301
2 lisi SH 202301
3 wangwu NJ 202301
1 zhangsan BJ 202302
2 lisi SH 202302
3 wangwu NJ 202302
1 zhangsan BJ 202303
2 lisi SH 202303
3 wangwu NJ 202303
1 zhangsan BJ 202304
2 lisi SH 202304
3 wangwu NJ 202304

3.数据导出

-- 将查询结果导出到hdfs

insert overwrite directory '/data/tabC3'
row format delimited fields terminated by ' '
select * from tabC;

-- 结果

dfs -cat /data/tabC3/000000_0;

 -- dfs 命令导出数据到本地。本质是执行数据文件的拷贝

dfs -get /data/tabC3/000000_0 /opt/stufile/tabC4;

[root@lxm147 ~]# cat /opt/stufile/tabC4
1 zhangsan BJ 202301
2 lisi SH 202301
3 wangwu NJ 202301
1 zhangsan BJ 202302
2 lisi SH 202302
3 wangwu NJ 202302
1 zhangsan BJ 202303
2 lisi SH 202303
3 wangwu NJ 202303
1 zhangsan BJ 202304
2 lisi SH 202304
3 wangwu NJ 202304

​-- hive 命令导出数据到本地。执行查询将查询结果重定向到文件

[root@lxm147 ~]# hive -e "select * from mydb.tabC" > /opt/stufile/a.log;

[root@lxm147 ~]# cat /opt/stufile/a.log 
tabc.id	tabc.name	tabc.area	tabc.month
1	zhangsan	BJ	202301
2	lisi	SH	202301
3	wangwu	NJ	202301
1	zhangsan	BJ	202302
2	lisi	SH	202302
3	wangwu	NJ	202302
1	zhangsan	BJ	202303
2	lisi	SH	202303
3	wangwu	NJ	202303
1	zhangsan	BJ	202304
2	lisi	SH	202304
3	wangwu	NJ	202304

-- export 导出数据到HDFS。使用export导出数据时,不仅有数还有表的元数据信息

export table tabC to '/data/tabC4';

dfs -ls /data/tabC4;

-- export 导出的数据,可以使用 import 命令导入到 Hive 表中
-- 使用 like tname 创建的表结构与原表一致。 create ... as select ...结构可能不一致
create table tabE like tabc;
import table tabE from '/user/hadoop/data/tabC4'; 

-- 截断表,清空表中的数据(注意:仅能操作内部表)

truncate table tabB;
小结:
数据导入: load data / insert / create table .... as select ..... / import table
数据导出: insert overwrite ... diretory ... / hdfs dfs -get / hive -e "select ..." > a.log / export table ...
Hive 的数据导入与导出还可以使用其他工具: Sqoop DataX 等;

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

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

相关文章

【LeetCode】No.225. 用队列实现栈 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/implement-stack-using-queues/ 1. 题目介绍&#xff08;225. 用队列实现栈&#xff09; 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、t…

回文子串的数量[寻找回文子串的完整思路过程]

寻找回文子串的完整思路过程前言一、回文串的数量二、动态规划1、完整思考过程2、go总结参考文献前言 回文字符串&#xff0c;就是从左遍历和从右遍历的字符是相同顺序的&#xff0c;转换一下&#xff0c;就是该字符串是对称的。寻找回文子串面临两个直接的问题&#xff0c;1-…

pytorch深度学习案例(二)——航拍街道语义分割

数据集 使用的数据集是kaggle的Semantic segmentation of aerial imagery 其数据的组织形式为 项目结构 utils dataConvert.py dataConvert中主要包含数据的变换过程 函数作用loadColorMap用于加载标签的颜色映射voc_colormap2label获取颜色标签到数值标签的映射关系voc_…

黑马Spring学习笔记(二)——注解开发

目录 一、纯注解开发 1.1 实现步骤 1.2 小结 二、注解开发依赖注入 2.1 自动装配 2.1.1 Autowired——按照类型注入 2.1.2 Qualifier——按照名称注入 2.1.3 Value——简单类型注入 2.2 注解读取properties配置文件——PropertySource 三、注解开发管理第三方B…

【基础算法】差分

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

Kotlin 33. CompileSdkVersion 和 targetSdkVersion 有什么区别?

CompileSdkVersion 和 targetSdkVersion 有什么区别&#xff1f; 在 build.gradle (Module) 文件中&#xff0c;我们通常会看到 CompileSdkVersion 和 targetSdkVersion 的使用&#xff0c;比如下面是一个完整的 build.gradle (Module) 文件&#xff1a; plugins {id com.and…

JavaScript随手笔记---比较两个数组差异

&#x1f48c; 所属专栏&#xff1a;【JavaScript随手笔记】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#…

0基础学习diffusion_model扩散模型【易理解的公式推导】

0基础学习diffusion_model扩散模型【易理解的公式推导】一、概述二、扩散过程(已知X0求Xt)三、逆扩散过程(已知Xt求Xt-1)1。算法流程图四、结论五、损失函数六、心得体会&#xff08;优缺点分析&#xff09;一、概述 DDPM论文链接&#xff1a; Jonathan Ho_Denoising Diffusion…

Android入门第64天-MVVM下瀑布流界面的完美实现-使用RecyclerView

前言 网上充满着不完善的基于RecyclerView的瀑布流实现&#xff0c;要么根本是错的、要么就是只知其一不知其二、要么就是一充诉了一堆无用代码、要么用的是古老的MVC设计模式。 一个真正的、用户体验类似于淘宝、抖音的瀑布流怎么实现目前基本为无解。因为本人正好自己空闲时也…

32岁,薪水被应届生倒挂,裸辞了

今年 32 岁&#xff0c;我从公司离职了&#xff0c;是裸辞。 前段时间&#xff0c;我有一件事情一直憋在心里很难受&#xff0c;想了很久也没找到合适的人倾诉&#xff0c;就借着今天写出来。 我一个十几年开发经验&#xff0c;八年 软件测试 经验的职场老人&#xff0c;我慢…

markdown常用语法--花括号(超详细)

&#x1f48c; 所属专栏&#xff1a;【Markdown常用语法】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1…

2023年,自动化测试岗位有这么吃香吗

测试人员需要具备自动化测试或者测试开发能力&#xff0c;已经成为测试行业内容的一种显在趋势&#xff0c;而且这种趋势呈放大态势&#xff0c;其发展前景是十分明朗的。 2022疫情期间&#xff0c;就业大环境不是很理想&#xff0c;目前呢&#xff0c;企业倾向于招自动化测试…

易基因项目文章| 组蛋白ChIP-seq揭示烟粉虱含菌细胞共生菌调控宿主生殖的新机制

喜报&#xff1a;易基因组蛋白ChIP-seq研究成果见刊《Cell Reports》2023年02月10日&#xff0c;沈阳农业大学植物保护学院博士研究生姚亚林为第一作者、栾军波教授为论文通讯作者在《Cell Reports》杂志以“A bacteriocyte symbiont determines whitefly sex ratio by regulat…

④ 链表

24. 两两交换链表中的节点 题目链接&#xff1a;https://leetcode.cn/problems/swap-nodes-in-pairs/ 注意点&#xff1a; 遍历链表的时候什么时候截止&#xff08;避免空指针异常或无限死循环的问题&#xff09;&#xff1f; 节点数量为偶数或链表为空时&#xff0c;cur.ne…

关于欧拉角你需要知道几个点

基础理解&#xff0c;参照&#xff1a;https://www.cnblogs.com/Estranged-Tech/p/16903025.html 欧拉角、万向节死锁&#xff08;锁死&#xff09;理解 一、欧拉角理解 举例讲解 欧拉角用三次独立的绕确定的轴旋转角度来表示姿态。如下图所示 经过三次旋转&#xff0c;旋…

原创不易,坚持更难

早上CSDN发消息&#xff0c;今天是创作满三年的纪念日&#xff0c;邀请写一篇博文&#xff0c;谈谈感受 开博原因 2020年是一个特殊的年份&#xff0c;疫情刚爆发第一年&#xff0c;也是第一次居家办公&#xff0c;从过完年就一直居家办公&#xff0c;一直居家了38天。2020年…

宗教生活污水处理项目的设计原则

我国的历史源远流长&#xff0c;许多传统文化都延续了上千年以上。同时&#xff0c;我国也是宗教信仰自由的国家&#xff0c;儒释道文化相互影响&#xff0c;交相辉映。游人穿过山间小道&#xff0c;走到寺院庄严礼拜&#xff0c;游客和信众的增多&#xff0c;使教堂、寺庙等宗…

机器学习笔记之谱聚类(一)k-Means聚类算法介绍

机器学习笔记之谱聚类——K-Means聚类算法介绍引言回顾&#xff1a;高斯混合模型聚类任务基本介绍距离计算k-Means\text{k-Means}k-Means算法介绍k-Means\text{k-Means}k-Means算法示例k-Means\text{k-Means}k-Means算法与高斯混合模型的关系k-Means\text{k-Means}k-Means算法的…

CTFer成长之路之CTF中的SQL注入

CTF中的SQL注入CTF SQL注入 SQL注入-1 题目描述: 暂无 docker-compose.yml version: 3.2services:web:image: registry.cn-hangzhou.aliyuncs.com/n1book/web-sql-1:latestports:- 80:80启动方式 docker-compose up -d 题目Flag n1book{union_select_is_so_cool} Wri…

PyQt5数据库开发1 4.3 QSqlTableModel 之 相关槽函数的实现(多图长文详解)

目录 一、打开数据库表 1. 写打开数据库的槽函数 2. 运行后发现数据库可以打开了 3. ODBC配通了&#xff0c;数据库还是打不开 4. 写在tableView上显示数据库表的函数 5. 运行后发现表可以显示了 6. 代码分析 7. 添加列名称 8. 根据内容调整列宽 9. 备注&#xff1a;…