【Hive_04】分区分桶表以及文件格式

  • 1、分区表
    • 1.1 分区表基本语法
      • (1)创建分区表
      • (2)分区表读写数据
      • (3)分区表基本操作
    • 1.2 二级分区
    • 1.3 动态分区
  • 2、分桶表
    • 2.1 分桶表的基本语法
    • 2.2 分桶排序表
  • 3、文件格式与压缩
    • 3.1 Hadoop压缩概述
    • 3.2 Hive文件格式
      • (1)Text File
      • (2)ORC
      • (3)Parquet
    • 3.3 压缩
      • (1)Hive表数据进行压缩
      • (2)计算过程中使用压缩

1、分区表

Hive中的分区就是把一张大表的数据按照业务需要分散的存储到多个目录,每个目录就称为该表的一个分区。在查询时通过where子句中的表达式选择查询所需要的分区,这样的查询效率会提高很多。

1.1 分区表基本语法

(1)创建分区表

create table dept_partition
(deptno int,    --部门编号dname  string, --部门名称loc    string  --部门位置
)partitioned by (day string)row format delimited fields terminated by '\t';

(2)分区表读写数据

1)写数据

(1)load

  • 数据准备

在/opt/module/hive/datas/路径上创建文件dept_20220401.log,并输入如下内容。

[root@hadoop102 datas]$ vim dept_20220401.log
10	行政部	1700
20	财务部	1800

无论是哪种方式,只要往分区表里面写入数据,都必须声明是哪个分区。

  • 装载语句
hive (default)> 
load data local inpath '/opt/module/hive/datas/dept_20220401.log' 
into table dept_partition 
partition(day='20220401');

在这里插入图片描述

在这里插入图片描述

(2)insert

将day='20220401’分区的数据插入到day='20220402’分区,可执行如下装载语句

hive (default)> 
insert overwrite table dept_partition partition (day = '20220402')
select deptno, dname, loc
from dept_partition
where day = '2020-04-01';

查询出来之后插入

在这里插入图片描述

2)读数据

查询分区表数据时,可以将分区字段看作表的伪列,可像使用其他字段一样使用分区字段。

select deptno, dname, loc ,day
from dept_partition
where day = '2020-04-01';

在这里插入图片描述
可以看到存储的时候只有三个字段,但是查询的时候可以查询到四个字段,原因是因为,第四个分区字段取自于路径的信息。

(3)分区表基本操作

1)查看所有分区信息

hive> show partitions dept_partition;

在这里插入图片描述

2)增加分区

(1)创建单个分区

hive (default)> 
alter table dept_partition 
add partition(day='20220403');
  • 新增分区,但此时新的分区里面是没有数据的。

那么新建一个分区会做哪些事情呢?
1、首先在HDFS上创建一个路径。
2、会在hive的元数据里面增加一条分区信息。【分区信息也属于hive元数据的一部分】

(2)同时创建多个分区(分区之间不能有逗号

hive (default)> 
alter table dept_partition 
add partition(day='20220404') partition(day='20220405');

3)删除分区

(1)删除单个分区

hive (default)> 
alter table dept_partition 
drop partition (day='20220403');

(2)同时删除多个分区(分区之间必须有逗号

hive (default)> 
alter table dept_partition 
drop partition (day='20220404'), partition(day='20220405');
  • 之前有提及内部表和外部表:
    两者的区别是在删除表的时候,对HDFS的处理上面。如果是外部表,则在删除的时候,不会删除HDFS上对应的路径,只会删除元数据;如果是内部表,则在删除的时候,会删除HDFS上对应的路径以及元数据。
  • 这个内部表与外部表对分区同样是适用的。
    如果建的是外部表,则删除分区的时候,也不会删除HDFS上的路径。

4)修复分区

Hive将分区表的所有分区信息都保存在了元数据中,只有元数据与HDFS上的分区路径一致时,分区表才能正常读写数据。若用户手动创建/删除分区路径,Hive都是感知不到的,这样就会导致Hive的元数据和HDFS的分区路径不一致。再比如,若分区表为外部表,用户执行drop partition命令后,分区元数据会被删除,而HDFS的分区路径不会被删除,同样会导致Hive的元数据和HDFS的分区路径不一致。

若出现元数据和HDFS路径不一致的情况,可通过如下几种手段进行修复。

(1)add partition
若手动创建HDFS的分区路径,Hive无法识别,可通过add partition命令增加分区元数据信息,从而使元数据和分区路径保持一致。

(2)drop partition
若手动删除HDFS的分区路径,Hive无法识别,可通过drop partition命令删除分区元数据信息,从而使元数据和分区路径保持一致。

(3)msck
若分区元数据和HDFS的分区路径不一致,还可使用msck命令进行修复,以下是该命令的用法说明。

hive (default)> 
msck repair table table_name [add/drop/sync partitions];

说明:

  • msck repair table table_name add partitions:该命令会增加HDFS路径存在但元数据缺失的分区信息。
  • msck repair table table_name drop partitions:该命令会删除HDFS路径已经删除但元数据仍然存在的分区信息。
  • msck repair table table_name sync partitions:该命令会同步HDFS路径和元数据分区信息,相当于同时执行上述的两个命令。
  • msck repair table table_name:等价于msck repair table table_name add partitions命令。【默认值】

上面这些命令修改的都是元数据,而不会去改变HDFS的路径。

我们在执行分区sql语句的时候,实际上是以mysql里面的元数据为主的。只有元数据里面有的才能查出来。

1.2 二级分区

  • 首先,一级分区指的是将一张表的数据分散的存储到多个路径下面。
  • 二级分区指的是将分区里面的数据再进行进一步的分散存储。甚至还能有三、四级分区,可以一层一层往下分。

在什么情况下会需要使用二级分区?

  • 将来在hive做项目的时候,大多数使用的都是分区表。对于分区表而言,很重要的一点就是按照什么分区。其实绝大多数的分区表都是按照日期分区的。hive做的是离线批处理,攒一批进行处理。
  • 如果觉得一天进行一次处理太慢了,想一个小时处理一次,这个时候就可以进行二级分区。

1)二级分区表建表语句

hive (default)>
create table dept_partition2(deptno int,    -- 部门编号dname string, -- 部门名称loc string     -- 部门位置
)
partitioned by (day string, hour string)
row format delimited fields terminated by '\t';
  • 可以看到二级分区相比于一级分区就是在分区的时候多加了一个字段,但是要注意顺序不要颠倒,day是一级分区的路径,hour是二级分区。

2)数据装载语句

hive (default)> 
load data local inpath '/opt/module/hive/datas/dept_20220401.log' 
into table dept_partition2 
partition(day='20220401', hour='12');
  • 装载数据没有很大的差别。
    3)查询分区数据
hive (default)> 
select * 
from dept_partition2 
where day='20220401' and hour='12';

1.3 动态分区

动态分区是指向分区表insert数据时,被写往的分区不由用户指定,而是由每行数据的最后一个字段的值来动态的决定。使用动态分区,可只用一个insert语句将数据写入多个分区。

1)动态分区相关参数

(1)动态分区功能总开关(默认true,开启)

set hive.exec.dynamic.partition=true

(2)严格模式和非严格模式

动态分区的模式,默认strict(严格模式),要求必须指定至少一个分区为静态分区==【也就是必须指定一个分区字段】==,nonstrict(非严格模式)允许所有的分区字段都使用动态分区。

set hive.exec.dynamic.partition.mode=nonstrict

在这里插入图片描述

(3)一条insert语句可同时创建的最大的分区个数,默认为1000。

set hive.exec.max.dynamic.partitions=1000
  • 实际上mysql里面不易设置太多的分区字段,因为设置一个分区,就会在元数据里面插入一个数据,如果分区太多,则mysql的分区表需要保存非常多的数据。

(4)单个Mapper或者Reducer可同时创建的最大的分区个数,默认为100。

set hive.exec.max.dynamic.partitions.pernode=100
  • 一个insert语句将来一定会翻译成mapreduce语句去执行的,而有些简单的sql语句可能是只有map而没有reduce

(5)一条insert语句可以创建的最大的文件个数,默认100000。

hive.exec.max.created.files=100000

(6)当查询结果为空时且进行动态分区时,是否抛出异常,默认false。

hive.error.on.empty.partition=false
  • 上面这些都是和动态分区相关的参数,都可能导致分区报错。

在这里插入图片描述

在这里插入图片描述
2)案例实操

需求:将dept表中的数据按照地区(loc字段),插入到目标表dept_partition_dynamic的相应分区中。

(1)创建目标分区表

hive (default)> 
create table dept_partition_dynamic(id int, name string
) 
partitioned by (loc int) 
row format delimited fields terminated by '\t';

(2)设置动态分区

set hive.exec.dynamic.partition.mode = nonstrict;
hive (default)> 
insert into table dept_partition_dynamic 
partition(loc) 
select deptno, dname, loc 
from dept;

(3)查看目标分区表的分区情况

hive (default)> show partitions dept_partition_dynamic;

2、分桶表

分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区。对于一张表或者分区,Hive 可以进一步组织成桶,也就是更为细粒度的数据范围划分,分区针对的是数据的存储路径,分桶针对的是数据文件。

分桶表的基本原理是,首先为每行数据计算一个指定字段的数据的hash值,然后模以一个指定的分桶数,最后将取模运算结果相同的行,写入同一个文件中,这个文件就称为一个分桶(bucket)。需要对表的数据进行hash分区

  • 分区和分桶没有必然的联系,是两个不同的概念。分区表是将数据存储到不同的分区里面,分桶表是将数据存储到不同的文件里面。
  • 一张表可以既是分区表也是分桶表。对于分区分桶表,会对每一个分区里面的数据进行分桶。
  • 不能对同一个字段既分区又分桶。因为如果一个字段分区了,那么这个字段在这个分区里面都是相同的,再分桶也是分到同一个桶里面,是没有意义的。而且分区字段还是一个虚拟字段。

2.1 分桶表的基本语法

1)建表语句

hive (default)> 
create table stu_buckt(id int, name string
)
clustered by(id) 
into 4 buckets
row format delimited fields terminated by '\t';

在这里插入图片描述

2.2 分桶排序表

  • 分桶字段和排序字段不要求完全一致,并且分桶字段和排序字段都可以有多个。
    在这里插入图片描述

3、文件格式与压缩

  • hadoop支持哪些压缩算法,hive就支持哪些压缩算法,两者保持一致。

3.1 Hadoop压缩概述

压缩格式算法文件扩展名是否可切分
DEFLATEDEFLATE.deflate
GzipDEFLATE.gz
bzip2bzip2.bz2
LZOLZO.lzo
SnappySnappy.snappy

3.2 Hive文件格式

为Hive表中的数据选择一个合适的文件格式,对提高查询性能的提高是十分有益的。Hive表数据的存储格式,可以选择text file、orc、parquet、sequence file等。

(1)Text File

文本文件是Hive默认使用的文件格式,文本文件中的一行内容,就对应Hive表中的一行记录。

可通过以下建表语句指定文件格式为文本文件:

create table textfile_table
(column_specs)
stored as textfile;
  • 当不声明文件格式的时候,默认使用的是文本文件。

(2)ORC

1)文件格式

ORC(Optimized Row Columnar)file format是Hive 0.11版里引入的一种列式存储的文件格式。ORC文件能够提高Hive读写数据和处理数据的性能。

与列式存储相对的是行式存储,下图是两者的对比:

在这里插入图片描述
如图所示左边为逻辑表,右边第一个为行式存储,第二个为列式存储。

(1)行存储的特点

查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快。【这种情况下使用行式存储的格式较好。】

(2)列存储的特点

因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法。

前文提到的text file和sequence file都是基于行存储的,orc和parquet是基于列式存储的。

  • 我们平常的查询大多数是以按列查询为主,过滤等按行查询的操作其实不多。
  • 文本文件、sequence file是行式存储的。
  • orc、parquet是列式存储的。

orc文件的具体结构如下图所示:

在这里插入图片描述
行的位置是稀疏存储的,每一万行记录一个索引。
在这里插入图片描述

在这里插入图片描述

  • 尾部会对数据进行编码,这样能减少对存储空间的占用率。

在这里插入图片描述

  • 每个Orc文件由Header、Body和Tail三部分组成。
  • 其中Header内容为ORC,用于表示文件类型。
  • Body由1个或多个stripe组成,每个stripe一般为HDFS的块大小,每一个stripe包含多条记录,这些记录按照列进行独立存储,每个stripe里有三部分组成,分别是Index Data,Row Data,Stripe Footer。
  • Index Data:一个轻量级的index,默认是为各列每隔1W行做一个索引。每个索引会记录第n万行的位置,和最近一万行的最大值和最小值等信息。
  • Row Data:存的是具体的数据,按列进行存储,并对每个列进行编码,分成多个Stream来存储。
  • Stripe Footer:存放的是各个Stream的位置以及各column的编码信息。
  • Tail由File Footer和PostScript组成。File Footer中保存了各Stripe的其实位置、索引长度、数据长度等信息,各Column的统计信息等;PostScript记录了整个文件的压缩类型以及File Footer的长度信息等。
  • 在读取ORC文件时,会先从最后一个字节读取PostScript长度,进而读取到PostScript,从里面解析到File Footer长度,进而读取FileFooter,从中解析到各个Stripe信息,再读各个Stripe,即从后往前读。

在这里插入图片描述

如果我想读取a列的内容,则读取逻辑是什么样的?

  • 首先要先读取整个文件的最后一个字节,这样可以拿到File Footer的长度,之后可以往前推,拿到整个File Footer的内容,之后就可以从File Footer当中拿到有关strip的信息。先拿到索引长度,通过索引长度定位数据位置。并且Strip Footer的信息也需要拿到,这样才能知道数据按什么格式去进行编码的,最后对拿到的列进行解析即可。
  • 文件格式对于加快hive读数据的速度是有很大的帮助的。

如果现在我有一张表,我希望其底层采用ORC的存储格式,我要如何做?

create table orc_table
(column_specs)
stored as orc
tblproperties (property_name=property_value, ...);

ORC文件格式支持的参数如下:

参数默认值说明
orc.compressZLIB压缩格式,可选项:NONE、ZLIB,、SNAPPY
orc.compress.size262,144每个压缩块的大小(ORC文件是分块压缩的)
orc.stripe.size67,108,864每个stripe的大小
orc.row.index.stride10,000索引步长(每隔多少行数据建一条索引)
  • ORC压缩是不支持切片的,但压缩也不是整个文件进行压缩的,是分块压缩的。

在这里插入图片描述

  • 每张表的具体写法都是如下图所示,都会包含SERDE、INPUTFORMAT、OUTPUTFORMAT的

在这里插入图片描述

1、ROW FORMAT SERDE:用来序列化和解序列化一行数据的。
2、INPUTFORMAT:写文件的
3、OUTPUTFORMAT:读文件的

(3)Parquet

Parquet文件是Hadoop生态中的一个通用的文件格式,它也是一个列式存储的文件格式。

Parquet文件的格式如下图所示:

在这里插入图片描述

在这里插入图片描述

  • 如果我要读取a列数据,则会先跳过最后4个字节找到footer长度,在根据footer的内容找到每个column chunk的元数据信息,之后就可以根据这些信息,快速定位到其想要的列。

一个Parquet文件的基本结构,文件的首尾都是该文件的Magic Code,用于校验它是否是一个Parquet文件。
首尾中间由若干个Row Group和一个Footer(File Meta Data)组成。
每个Row Group包含多个Column Chunk,每个Column Chunk包含多个Page。以下是Row Group、Column Chunk和Page三个概念的说明:

  • 行组(Row Group):一个行组对应逻辑表中的若干行。
  • 列块(Column Chunk):一个行组中的一列保存在一个列块中。
  • 页(Page):一个列块的数据会划分为若干个页。
  • Footer(File Meta Data)中存储了每个行组(Row Group)中的每个列快(Column Chunk)的元数据信息,元数据信息包含了该列的数据类型、该列的编码方式、该类的Data Page位置等信息。
Create table parquet_table
(column_specs)
stored as parquet
tblproperties (property_name=property_value, ...);

支持的参数如下:

参数默认值说明
parquet.compressionuncompressed压缩格式,可选项:uncompressed,snappy,gzip,lzo,brotli,lz4
parquet.block.size134217728行组大小,通常与HDFS块大小保持一致
parquet.page.size1048576页大小

3.3 压缩

在Hive表中 [即表里面存储的数据] 和计算过程 [比如map结束之后,往reduce里面发送数据的时候,数据是否需要压缩] 中,保持数据的压缩,对磁盘空间的有效利用和提高查询性能都是十分有益的。

(1)Hive表数据进行压缩

在Hive中,不同文件类型的表,声明数据压缩的方式是不同的。

1)TextFile

若一张表的文件类型为TextFile,若需要对该表中的数据进行压缩,多数情况下,无需在建表语句做出声明。直接将压缩后的文件导入到该表即可,Hive在查询表中数据时,可自动识别其压缩格式,进行解压。

需要注意的是,在执行往表中导入数据的SQL语句时,用户需设置以下参数,来保证写入表中的数据是被压缩的。

  • 直接往文本文件当中写数据,则hive是不会进行压缩的,因此往一张文本文件的表里面写数据,需要自己去声明压缩。
  • 情况一:如果采用load的方式往文本文件里面导入数据,则需要保证load的文件是压缩好的文件。
  • 情况二:如果是往一张表里面去insert数据的话,需要通过配置参数保证数据是压缩的。
--SQL语句的最终输出结果是否压缩
set hive.exec.compress.output=true;
--输出结果的压缩格式(以下示例为snappy)
set mapreduce.output.fileoutputformat.compress.codec =org.apache.hadoop.io.compress.SnappyCodec;

2)ORC

若一张表的文件类型为ORC,若需要对该表数据进行压缩,需在建表语句中声明压缩格式如下:

create table orc_table
(column_specs)
stored as orc
tblproperties ("orc.compress"="snappy");
  • 通过声明参数之后,只要往这张表里面去insert数据,就会自动进行压缩的。
  • 同样的,当去读取表当中的数据之后,也能够自动识别压缩算法并且进行解压。

3)Parquet

若一张表的文件类型为Parquet,若需要对该表数据进行压缩,需在建表语句中声明压缩格式如下:

create table orc_table
(column_specs)
stored as parquet
tblproperties ("parquet.compression"="snappy");

(2)计算过程中使用压缩

计算过程有包括两种场景:
1、是一个MR的中间结果进行压缩。mapper结束之后,会把数据写入到hdfs,之后reducer读取数据的时候,这个中间阶段是否要进行压缩。
2、

1)单个MR的中间结果进行压缩

单个MR的中间结果是指Mapper输出的数据,对其进行压缩可降低shuffle阶段的网络IO,可通过以下参数进行配置:

--开启MapReduce中间数据压缩功能
set mapreduce.map.output.compress=true;
--设置MapReduce中间数据数据的压缩方式(以下示例为snappy)
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;

2)单条SQL语句的中间结果进行压缩

单条SQL语句的中间结果是指,两个MR(一条SQL语句可能需要通过MR进行计算)之间的临时数据,可通过以下参数进行配置:

--是否对两个MR之间的临时数据进行压缩
set hive.exec.compress.intermediate=true;
--压缩格式(以下示例为snappy)
set hive.intermediate.compression.codec= org.apache.hadoop.io.compress.SnappyCodec;

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

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

相关文章

Android Studio各种Gradle常见报错问题及解决方案

大家好,我是咕噜铁蛋!在开发Android应用程序时,我们可能会遇到各种Gradle错误。这些错误可能来自不同的原因,例如依赖项问题、配置错误、版本冲突等。今天我通过搜索整理了一下,在这篇文章中,我将分享一些常…

HTML---网页布局

目录 文章目录 一.常见的网页布局 二.标准文档流 标准文档流常见标签 三.display属性 四.float属性 总结 一.常见网页布局 二.标准文档流 标准文档流常见标签 标准文档流的组成 块级元素<div>、<p>、<h1>-<h6>、<ul>、<ol>等内联元素<…

国内chatGPT3.5升级到chatGPT4.0的教程

1、准备一个3.5的账号 2、准备一个美元虚拟信用卡 这里默认您是有账号的 1、注册办理卡 2、按图片步骤就可以开卡成功 3、卡片cvc在卡中心cvc安全码里面 4、登录ChatGPT 第三步:升级 Plus 完成了上面步骤 小白朋友连账号都么有的&#xff0c;可以使用谷歌邮箱直接在open…

房顶漏水啦【算法赛】

问题描述 小蓝家的房顶是一个边长为 n 的正方形&#xff0c;可以看成是由 nn 个边长为 1 的小正方形格子组成。 从上到下第 i 行、从左到右第 j 列的格子用 (i,j) 表示。 小蓝的家由于年久失修&#xff0c;导致房顶有一些地方漏水。总共有 m 处漏水的地方&#xff0c;我们用…

K8s攻击案例:Privileged特权容器导致节点沦陷

01、概述 特权容器&#xff08;Privileged Container&#xff09;是一种比较特殊的容器&#xff0c;在K8s中运行特权容器&#xff0c;需要将 Privileged 设为 true &#xff0c;容器可以执行几乎所有可以直接在主机上执行的操作。 基于此&#xff0c;利用容器的特权配置可以获取…

Vue 实现响应式布局

实现响应式布局是工作中必不可少 客户需要 若是使用vue element ui 的方式实现 浏览器宽度为760的情况 浏览器宽度为360的情况 手机上的显示的情况 一、对于屏幕尺寸的定义 element UI参照Bootstrap的解决方案提供了五种屏幕大小尺寸&#xff1a;xs、sm、md、lg 和 xl。并对…

Vue+ElementUI+nodejs学生宿舍报修管理系统68ozj

本站是一个B/S模式系统&#xff0c;采用vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得学生宿舍信息管理系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中…

实用干货:公司规定所有接口都用 POST请求,为什么?

大家好&#xff0c;我是大澈&#xff01; 本文约1000字&#xff0c;整篇阅读大约需要2分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费领取"面试礼包"一份&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff01…

在k8s中使用Helm安装harbor并将Chart推送到私有仓库harbor

使用Helm安装harbor并将Chart推送到私有仓库harbor 注意&#xff1a;如果你的harbor是之前docker-compose安装的&#xff0c;还需要额外做一个动作&#xff0c;让它支持chart docker-compose stop ./install.sh --with-chartmuseum1&#xff09;下载harbor的chart包 Harbor的…

「数据结构」二叉树2

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;初阶数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 文章目录 &#x1f349;前言&#x1f349;链式结构&#x1f349;遍历二叉树&#x1f34c;前序遍历&#x1f34c;中序遍历&#x…

MySQL升级版本(Linux环境)

摘要 由于我们在做部署的时候会部署MySQL&#xff0c;但是版本可能各种各样&#xff0c;而且我们服务器会定期的进行漏洞扫描&#xff0c;因此我们在遇到MySQL的相关漏洞时&#xff0c;一般漏洞报告中会提示出解决方案&#xff0c;一般来时就是升级软件的版本&#xff0c;因此…

C# WPF上位机开发(从demo编写到项目开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 C# WPF编程&#xff0c;特别是控件部分&#xff0c;其实学起来特别快。只是后面多了多线程、锁、数据库、网络这部分稍微复杂一点&#xff0c;不过…

CAD制图

CAD制图 二维到三维 文章目录 CAD制图前言一、CAD制图二、机械设计三、二维图纸四、三维图纸总结前言 CAD制图可以提高设计效率和准确性,并方便文档的存档和交流,是现代工程设计中不可或缺的一部分。 一、CAD制图 CAD(Computer-Aided Design)是利用计算机技术辅助进行设计…

欠采样对二维相位展开的影响

1.前言 如前所述&#xff0c;相位展开器通过计算两个连续样本之间的差来检测图像中包裹的存在。如果这个差值大于π或小于-π&#xff0c;则相位展开器认为在这个位置存在包裹。这可能是真正的相位包络&#xff0c;也可能是由噪声或采样不足引起的伪包络。 对欠采样的相位图像…

【自营版】物流系统+取件员收件员/运营级快递系统小程序源码

后端php前端原生小程序 mysql数据库 主要功能&#xff1a; 寄快递 查快递 多门店 市内取送 取件员中心在线接单 提前预约 也可 立即下单 门店入住 取件员入住

交叉熵损失(Cross-Entropy loss)

在处理机器学习或深度学习问题时&#xff0c;损失/成本函数用于在训练期间优化模型。目标几乎总是最小化损失函数。损失越低&#xff0c;模型越好。交叉熵损失是最重要的成本函数。它用于优化分类。对交叉熵的理解取决于对 Softmax 激活函数的理解。 一、softmax激活函数 激活…

屏幕颜色吸取器

前言 屏幕颜色吸取器。 前端工程师的福音&#xff0c;获取全屏幕上所有位置的颜色。 运行在window上的软件 屏幕颜色吸取器 前言1 下载解压2 使用 1 下载解压 下载地址&#xff1a;https://download.csdn.net/download/qq_44850489/11943229 下载下来之后解压 如下图&#…

python算法例23 落单的数Ⅰ

1. 问题描述 给出2n1个非负整数元素的数组&#xff0c;除其中一个数字之外&#xff0c;其他每个数字均出现两次&#xff0c;找到这个数字。 2. 问题示例 给出[1&#xff0c;2&#xff0c;2&#xff0c;1&#xff0c;3&#xff0c;4&#xff0c;3]&#xff0c;返回4。 3. 代…

使用函数式接口对代码简化,完成代码重复性使用

&#x1f4da;目录 &#x1f4da;简介&#x1f4a8;优化前原代码:⚙️ 函数编程简化&#x1f384; JDK自带的函数式接口✨ 改造调用方式&#x1f38a; 时间范围执行&#x1f389;时间范围每天执行 &#x1f4da;简介 因为公司的使用Xxl-Job作为任务调度平台,其中我们大部分的报…

camera同步信号

基本概念 PCLK&#xff1a;pixel clock是像素点同步时钟信号, 主频。也就是每个PCLK对应一个像素点。 HSYNC&#xff1a;horizonal synchronization是行同步信号&#xff0c;水平同步信号。就是在告诉接收端&#xff1a;“HSYNC”有效时段内接收端接收到的所有的信号输出属同…