Hive之存储和压缩

news2025/7/12 16:52:16

Hive系列


第十章 存储和压缩

10.1 首先看一下Hadoop中的压缩

10.1.1 基本概念

1、概念

压缩是一种通过特定的算法来减小计算机文件大小的机制。这种机制是一种很方便的发明,尤其是对网络用户,因为它可以减小文件的字节总数,使文件能够通过较慢的互联网连接实现更快传输,此外还可以减少文件的磁盘占用空间。

2、优缺点

压缩优点:减少磁盘IO、减少磁盘存储空间。
压缩缺点:增加CPU开销,也就是需要大量的计算能力去解压缩。

3、原则

(1)运算密集型任务(经常需要计算),少用压缩
(2)IO密集型任务(经常需要输入输出,也就是需要传输),多用压缩

10.1.2 Hadoop中的压缩编码

1、常见的压缩编码

压缩编码Hadoop是否自带算法文件扩展名是否支持切片换压缩格式后,原程序是否需要修改
DEFLATE是,直接使用DEFLATE.deflate和文本处理一样,不需要修改
Gzip是,直接使用DEFLATE.gz和文本处理一样,不需要修改
bzip2是,直接使用bzip2.bz2和文本处理一样,不需要修改
LZO否,需要安装LZO.lzo需要建索引,还需要指定输入格式
Snappy是,直接使用Snappy.snappy和文本处理一样,不需要修改

2、部分性能对比

压缩算法原文件大小压缩之后文件大小压缩速度解压速度
gzip8.3GB1.8GB17.5MB/s58MB/s
bzip28.3GB1.1GB2.4MB/s9.5MB/s
LZO8.3GB2.9GB49.3MB/s74.6MB/s

注: 数据来源于网络。

再来一个Snappy的。链接: http://google.github.io/snappy/

Snappy is a compression/decompression library. It does not aim for maximum compression, or compatibility with any other compression library; instead, it aims for very high speeds and reasonable compression. For instance, compared to the fastest mode of zlib, Snappy is an order of magnitude faster for most inputs, but the resulting compressed files are anywhere from 20% to 100% bigger. On a single core of a Core i7 processor in 64-bit mode, Snappy compresses at about 250 MB/sec or more and decompresses at about 500 MB/sec or more.

10.1.3 多种压缩方式优缺点及适用场景

压缩方式选择时考虑的几个方面:解、压缩速度、压缩率、压缩文件是否可以支持切片。

1、Gzip压缩
优点:压缩率较高
缺点:不支持Split切片;解、压缩 速度一般

2、Bzip2压缩
优点:压缩率高,支持Split切片 
缺点:解、压缩速度慢

3、Lzo压缩
优点:解、压缩速度比较快,支持Split切片
缺点:压缩率一般,想支持切片需要额外创建索引

4、Snappy压缩
优点:解、压缩速度快  
缺点:不支持Split切片,压缩率一般 

10.1.4 压缩的位置

1、Map前(输入端)
无须显示指定使用的解压缩编码方式。Hadoop自动检查文件扩展名,如果扩展名能够匹配,就会用适当的编解码方式对文件压缩和解压。
选择因素:
(1)数据量小于块大小,考虑压缩和解压缩速度比较快的Snappy/LZO
(2)数据量非常大,考虑支持切片的Bzip2/LZO

2、Map到Reduce中间
在两者中间,肯定要要传输数据,为了减少MapTask和ReduceTask之间的网络IO。
就可以考虑压缩和解压缩快的压缩编码,比如Snappy、LZO。

3、Reduce后(输出端)
这个时候选择要考虑具体需求:
(1)若数据永久保存,考虑压缩率较高的 Bzip2 /  Gzip。
(2)若作为下一个MapReduce输入,要考虑数据量大小和是否支持切片。

10.1.5 参数配置

1、Hadoop引入编码/解码器来支持多种压缩/解压缩算法

压缩格式对应的编码/解码器
DEFLATEorg.apache.hadoop.io.compress.DefaultCodec
gziporg.apache.hadoop.io.compress.GzipCodec
bzip2org.apache.hadoop.io.compress.BZip2Codec
LZOcom.hadoop.compression.lzo.LzopCodec
Snappyorg.apache.hadoop.io.compress.SnappyCodec

2、Hadoop中启用压缩,可以通过如下参数进行配置

参数默认值阶段参考建议
io.compression.codecs (在core-site.xml中配置)无。需要在命令行输入hadoop checknative查看输入压缩Hadoop使用文件扩展名判断是否支持某种编解码器
mapreduce.map.output.compress(在mapred-site.xml中配置)falseMapper输出这个参数设为true启用压缩
mapreduce.map.output.compress.codec(在mapred-site.xml中配置)org.apache.hadoop.io.compress.DefaultCodecMapper输出企业多使用LZO或Snappy编解码器在此阶段压缩数据
mapreduce.output.fileoutputformat.compress(在mapred-site.xml中配置)falseReducer输出这个参数设为true启用压缩
mapreduce.output.fileoutputformat.compress.codec(在mapred-site.xml中配置)org.apache.hadoop.io.compress.DefaultCodecReducer输出使用标准工具或者编解码器,如gzip和bzip2

10.2 Hive中开启map输出阶段压缩

一、理论

在Hive中开启 map 输出阶段压缩可以减少 job 中 map 和 Reduce task 间数据传输量。

二、实践

1、开启 hive 中间传输数据压缩功能
hive (mydb)>set hive.exec.compress.intermediate=true;
2、开启 mapreduce 中 map 输出压缩功能
hive (mydb)>set mapreduce.map.output.compress=true;
3、设置 mapreduce 中 map 输出数据的压缩方式
hive (mydb)>set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
4、执行查询语句
hive (mydb)> select count(ename) name from emp;

想查看过程的话记得开启历史服务器
http://hadoop10:8088/ 
先进去,然后点击History 跳转到历史服务器里面查看
自己配置完了查看,最好给历史服务器配置到某个固定的节点。

10.3 Hive中开启Reduce输出阶段压缩

一、理论

在 Hive 中,将输出写入到表中的时候,输出内容同样可以进行压缩。属性 hive.exec.compress.output 控制着这个功能。用户可能需要保持默认设置文件中的默认值false,这样默认的输出就是非压缩的纯文本文件了。用户可以通过在查询语句或执行脚本中设置这个值为 true,来开启输出结果压缩功能。

二、实践

1、开启 hive 最终输出数据压缩功能
hive (mydb)>set hive.exec.compress.output=true;
2、开启 mapreduce 最终输出数据压缩
hive (mydb)>set mapreduce.output.fileoutputformat.compress=true;
3、设置 mapreduce 最终数据输出压缩方式
hive (mydb)> set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
4、设置 mapreduce 最终数据输出压缩为块压缩
hive (mydb)> set mapreduce.output.fileoutputformat.compress.type=BLOCK;
5、测试一下输出结果是否是压缩文件
hive (mydb)> insert overwrite local directory '/home/data/reduceyasuo' select * from emp distribute by deptno sort by empno desc;
6、去对应的地方查看结果
[root@hadoop10 data]# cd reduceyasuo/
[root@hadoop10 reduceyasuo]# ll
total 4
-rw-r--r--. 1 root root 446 Oct 11 11:58 000000_0.snappy
[root@hadoop10 reduceyasuo]# pwd
/home/data/reduceyasuo

10.4 Hive中常见的存储格式

首先 Hive 支持的存储数据的格式主要有 :TEXTFILE 、SEQUENCEFILE 、PARQUET 、 ORC 。

10.4.1 行式存储和列式存储

1、逻辑物理对应图

在这里插入图片描述

注:图片来源于网络

上图左边为逻辑表,右边第一个为行式存储,第二个为列式存储。

2、行存储和列存储特点

1、行存储特点
当查询满足条件的一整行数据的时候,列存储需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快。
2、列存储的特点
列存储每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法。

3、Hive中的存储

TEXTFILE 和 SEQUENCEFILE 的存储格式都是基于行存储的
PARQUET 和 ORC 是基于列式存储的

10.4.2 Hive中的存储格式

10.4.2.1 TextFile格式

Hive中的默认格式,为行存储格式,数据不做压缩,磁盘占用大。

10.4.2.2 Parquet格式

仔细看下面的图,它是一个 Parquet 文件的内容,一个文件中可以存储多个行组,文件的首位都是该文件的 Magic Code,用于校验它是否是一个 Parquet 文件
Footer length 记录了文件元数据的大小,通过该值和文件长度可以计算出元数据的偏移量
文件的元数据中包括每一个行组的元数据信息和该文件存储数据的Schema 信息
除此之外,文件中每一个行组的元数据,每一页的开始都会存储该页的元数据

在 Parquet 中, 有三种类型的页:数据页、字典页和索引页。
	数据页用于存储当前行组中该列的值
	字典页存储该列值的编码字典,每一个列块中最多包含一个字典页
	索引页用来存储当前行组下该列的索引,目前 Parquet 中还不支持索引页。

在这里插入图片描述

Parquet 文件是以二进制方式存储的,自然而然是不可以直接读取的,文件中包括该文件的数据和元数据,所以 Parquet 格式文件是自解析的。
几个重要的概念:

1、行组(Row Group)
每一个行组包含一定的行数,在一个 HDFS 文件中至少存储一个行组
2、列块(Column Chunk)
在一个行组中每一列保存在一个列块中,行组中的所有列连续的存储在这个行组文件中。
一个列块中的值都是相同类型的,不同的列块可以使用不同的算法进行压缩。
3、页(Page)
每一个列块划分为多个页,一个页是最小的编码的单位,在同一个列块的不同页可能使用不同的编码方式。

其实在一般的情况下,在存储 Parquet 数据的时候会按照 Block 大小设置行组的大小,在一般情况下每一个 Mapper 任务处理数据的最小单位是一个 Block块,这样可以把每一个行组由一个 Mapper 任务来处理,从增大任务执行并行度。

10.4.2.2 ORC格式

官网链接:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC

在这里插入图片描述

注:图片来源于网络

ORC 的全称是 Optimied Row Columnar
ORC文件格式是一种Hadoop生态圈中的列式存储格式,它的产生在2013年初,最初产生自Apache Hive,用于降低Hadoop 数据存储空间的和加速 Hive 查询速度。和Parquet 类似,它并不是一个单纯的列式存储格式,是首先根据行分割整个表,在每一行组内进行按列压缩存储。

一些概念的解释:

每个 Orc 文件由 1 个或多个 stripe 组成,每个 stripe 一般情况下为 HDFS 的块大小,每一个 stripe 中包含多条记录,这些记录按照列进行独立存储,和 Parquet中的 row group 的概念其实是类似的。
每个 Stripe 里有三部分组成,分别是 Index Data,Row Data,Stripe Footer

1、Index Data:一个轻量级的 index,默认是每隔 1W 行做一个索引。这里做的索引是记录某行的各字段在 Row Data 中的偏移量
2、Row Data:存的是真实的数据,先取部分行,然后对这些行按列进行存储。对每个列进行了编码,分成多个 Stream 来存储。
3、Stripe Footer:存的是各个 Stream 的类型,长度等等的信息。

10.5 案例测试对比各种存储格式和压缩

TextFile 、 Parquet 、 ORC 对比

1、TextFile格式

1、创建表
create table student_textfile(id int, name string, sex string, age int, department string) row format delimited fields terminated by "," stored as textfile;
2、造数据
以1122660行,大小为25.6m的数据进行测试,student_big.txt文件。
3、加载数据
load data local inpath '/home/data/student_big.txt' into table student_textfile;
4、查看大小
hive (mydb)> dfs -du -h /user/hive/warehouse/mydb.db/student_textfile/student_big.txt;
25.7 M  25.7 M  /user/hive/warehouse/mydb.db/student_textfile/student_big.txt
hive (mydb)> 

2、Parquet格式

1、创建表
create table student_parquet(id int, name string, sex string, age int, department string) row format delimited fields terminated by "," stored as parquet;
2、造数据
以1122660行,大小为25.6m的数据进行测试,student_big.txt文件。
hive (myhive5)> load data local inpath '/home/data/student_big.txt' into table student_parquet;
上面的命令可以给数据导入到student_parquet表的对应的目录下面,但是这种方式只是直接给数据放过去了,没有产生压缩的效果。在hive中使用命令hive (myhive5)> select * from student_parquet;去查询会报错,因为类型不匹配。
3、加载数据
若是误导入可以,使用下面的命令清空
hive (mydb)> truncate table student_parquet;
使用下面的方式导入:
hive (mydb)> insert into table student_parquet select * from student_textfile;
4、查看大小
hive (mydb)> dfs -du -h /user/hive/warehouse/mydb.db/student_parquet;
2.2 M  2.2 M  /user/hive/warehouse/mydb.db/student_parquet/000000_0
hive (mydb)> 

3、ORC格式

1、创建表
create table student_orc(id int, name string, sex string, age int, department string) row format delimited fields terminated by "," stored as orc tblproperties("orc.compress"="NONE");
注意: tblproperties("orc.compress"="NONE"); -- 设置 orc 存储不使用压缩来进行测试
2、造数据
以1122660行,大小为25.6m的数据进行测试,student_big.txt文件。
3、加载数据
hive (mydb)> load data local inpath '/home/data/student_big.txt' into table student_orc;
FAILED: SemanticException Unable to load data to destination table. Error: The file that you are trying to load does not match the file format of the destination table.
hive (mydb)> 
使用下面的方式导入:
hive (mydb)> insert into table student_orc select * from student_textfile;
4、查看大小
hive (mydb)> dfs -du -h /user/hive/warehouse/mydb.db/student_orc;
6.7 M  6.7 M  /user/hive/warehouse/mydb.db/student_orc/000000_0
hive (mydb)> 

10.5测试结论:

Parquet > ORC > TextFile

注意,可能会由于样本的不同导致结果会出现ORC优于Parquet的情况,这都是正常的现象,但是都优于TextFile。

10.6 案例测试对比各种存储格式和压缩结合方式

再来一遍官网链接:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC

在这里插入图片描述

The parameters are all placed in the TBLPROPERTIES (see Create Table). 
翻译过来:
所有关于 ORCFile 的参数都是在 HQL 语句的 TBLPROPERTIES 字段里面设置的。

1、ORC_ZLIB

1、创建表
create table student_orc_zlib(id int, name string, sex string, age int, department string) row format delimited fields terminated by "," stored as orc tblproperties("orc.compress"="ZLIB");
注意: tblproperties("orc.compress"="ZLIB"); -- 设置 orc 存储使用ZLIB压缩来进行测试
2、造数据
以1122660行,大小为25.6m的数据进行测试,student_big.txt文件。
3、加载数据
hive (mydb)> load data local inpath '/home/data/student_big.txt' into table student_orc_zlib;
FAILED: SemanticException Unable to load data to destination table. Error: The file that you are trying to load does not match the file format of the destination table.
hive (mydb)> 
使用下面的方式导入:
hive (mydb)> insert into table student_orc_zlib select * from student_textfile;
4、查看大小
hive (mydb)> dfs -du -h /user/hive/warehouse/mydb.db/student_orc_zlib;
59.5 K  59.5 K  /user/hive/warehouse/mydb.db/student_orc_zlib/000000_0
hive (mydb)> 

2、ORC_SNAPPY

1、创建表
create table student_orc_snappy(id int, name string, sex string, age int, department string) row format delimited fields terminated by "," stored as orc tblproperties("orc.compress"="SNAPPY");
注意: tblproperties("orc.compress"="SNAPPY"); -- 设置 orc 存储使用SNAPPY压缩来进行测试
2、造数据
以1122660行,大小为25.6m的数据进行测试,student_big.txt文件。
3、加载数据
hive (mydb)> insert into table student_orc_snappy select * from student_textfile;
4、查看大小
hive (mydb)> dfs -du -h /user/hive/warehouse/mydb.db/student_orc_snappy;
343.5 K  343.5 K  /user/hive/warehouse/mydb.db/student_orc_snappy/000000_0
hive (mydb)> 

3、Parquet_Snappy

在默认的情况下,Parquet就自带Snappy压缩。压缩之后的文件的名称示例:

part-00000-3c53817b-4608-4e27-a727-f398b94b4ed9-c000.snappy.parquet

操作示例:

1、创建表
create table student_parquet_snappy(id int, name string, sex string, age int, department string) row format delimited fields terminated by "," stored as parquet tblproperties("parquet.compress"="SNAPPY");
注意: tblproperties("orc.compress"="SNAPPY"); -- 设置 parquet 存储使用SNAPPY压缩来进行测试
2、造数据
以1122660行,大小为25.6m的数据进行测试,student_big.txt文件。
3、加载数据
hive (mydb)> insert into table student_parquet_snappy select * from student_textfile;
4、查看大小
hive (mydb)> dfs -du -h /user/hive/warehouse/mydb.db/student_parquet_snappy;
2.2 M  2.2 M  /user/hive/warehouse/mydb.db/student_parquet_snappy/000000_0
hive (mydb)> 

10.6测试结论(在ORC开压缩的情况下):

ORC > Parquet > TextFile

总结:

企业开发当中,hive 的数据存储格式一般选择:orc 或 parquet;压缩方式可以选择 snappy,lzo 等


声明:
        文章中代码及相关语句为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除。感谢。转载请注明出处,感谢。


By luoyepiaoxue2014

微博地址: http://weibo.com/luoyepiaoxue2014 点击打开链接

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

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

相关文章

Linux-yum

Linux下的开发工具即配置基本都要自己手动,和Windows一键式安装相比,Linux软件的安装要复杂很多。 centos 7下,基本的安装方式有三种: 1.源码安装——挺常用的,但是复杂,对初学者来说可以忽略。 2.rpm包安…

FFmpeg的makefile逻辑分析

在开始分析之前,讲一个 makefile 的调试技巧,推荐阅读《如何调试MAKEFILE变量》 make -f Makefile -f vars.mk HOSTPROGS这里我对 vars.mk 做了点修改,因为源 vars.mk 没处理特殊字符,直接 echo 会报错。ffmpeg 的 makefile 的变…

改进粒子滤波的无人机三维航迹预测方法附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

某公司常见题刷题笔记

LeetCode搞起来,虽说和实际业务没啥联系,但现在就卷起来了,没办法被迫卷起来。 1,滑动平均值,官网 给定窗口大小size,然后每次增加一个值value放入窗口,求此窗口内的平均值 class MovingAver…

李宏毅:Life Long Learning

Life Long Learing 也是continual Learning,也是incremental learning 目录 Life-Long Learning vs Transfer Learning Evaluation Research Directions Selective Synaptic Plasticity——Regulization Based Additional Neural Resourcr Allocation Memo…

Python简介-Python3及环境配置

Python简介 Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。 Python语…

MFC的YUV播放器实现

MFC的YUV播放器实现 文章目录MFC的YUV播放器实现一、主要参考链接二、开发踩坑记录1、Gdiplus 绘图前置条件2、播放时点击滑竿能精准跳转3、鼠标悬停在滑竿上时显示预览小窗口本文记录使用MFC编写一个YUV播放器的过程,尽量实现播放器都有的常用功能。功能参考与网上…

四旋翼无人机学习第9节--OpenMV以及WIFI电路、供电电路再分析

文章目录0、参考与学习1、OpenMV插座电路2、OpenMV供电电路3、ESP8266电路分析3.0 绘制分享3.1 模块正面图3.2 模块背面图3.3 模块引脚介绍3.4 模块模式选择3.5 芯片手册参考电路4、供电电路分析4.1 电池接口与电源开关部分4.2 usb供电电路与电池电压降压电路4.3 5V降3.3V电路4…

[论文精度|博士论文]非结构环境下病虫害识别方法研究

概述 提出一种基于级联卷积神经网络的植物病害识别方法提出一种融合农田多源环境信息的害虫监测方法提出一种新的目标检测损失函数解决特征冲突问题 本文研究的主要方面在于特征提取。(其他部分沿用目前最全面的公开数据和病虫害数据以及最先进的开源算法&#xf…

30岁之后身体还能像年轻的时候一样撸代码吗?

在IT圈流传着一句话,程序员吃的是青春饭。很多人认为,30岁是个阶段,在这个阶段后就需要往管理方向转型。因为在30岁之后身体再也不能像年轻的时候一样熬夜撸代码,而且继续从事一线开发的待遇也不如管理层优厚。至于转管理层失败的…

redis缓存一致性以及解决方案

一致性问题: 首先要到redis里面读取缓存,如果没有缓存,那么就到mysql里面去取数据,并且将其放置在缓存中 关于解决缓存一致性的问题,不难想到主要有两种解决方案,双更模式和删除模式 ** 双更模式&#xf…

【JVM】native关键字的使用

native关键字的使用一、JVM体系结构二、native是什么?三、native能干什么?四、native怎么使用?五、native总结在研读**《深入理解Java虚拟机》这本书时,看到 Java 虚拟机运行时数据区中有关本地方法栈**(Native Method…

鲜花在线销售平台的设计与实现/鲜花商城/网上花店管理系统

摘 要 为了解决客户便捷地在网上购物,本文设计和开发了一个鲜花在线销售平台。本系统是基于web架构设计,SSM框架,javascript技术的前台页面设计与实现,使用Mysql数据库管理,综合采用java模式来完成系统的相关功能。主…

【GlobalMapper精品教程】028:栅格计算器的使用方法总结

文章目录 一、栅格计算器简介二、栅格计算器应用举例1. 归一化植被指数NDVI2. 归一化水体指数NDWI3. 归一化建筑指数NDBI一、栅格计算器简介 GlobalMapper中也提供了栅格计算器工具,可以方便的进行栅格计算、波段计算、指数计算等,使用方法有点儿像Envi软件。 用户可以使用系…

世界杯来了,让 Towhee 带你多语言「以文搜球」!

四年一度的世界杯已正式拉开战幕,各小组比赛正如火如荼地进行中。在这样一场球迷的盛宴中,不如让 Towhee 带你「以文搜球」,一览绿茵场上足球战将们的风采吧~ 「以文搜球」是跨模态图文检索的一部分,如今最热门的跨模…

Leetcode刷题Day5休息 Day6----------哈希表

Leetcode刷题Day5休息 & Day6----------哈希表 1. 哈希表理论基础 数组、Set、Map 如果数据量小------------数组 如果数据量大------------Set 如果有Key、value------------Map 文章讲解:https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86…

【雷达检测】基于复杂环境下的雷达目标检测技术(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

数据之道读书笔记-06面向“自助消费”的数据服务建设

数据之道读书笔记-06面向“自助消费”的数据服务建设 数据底座建设的目标是更好地支撑数据消费,在完成数据的汇聚、整合、联接之后,还需要在供应侧确保用户更便捷、更安全地获取数据。一方面业务人员希望尽可能快速地获取各种所需的数据,另一…

基于双目相机拍摄图像的深度信息提取和目标测距matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB程序 1.算法描述 双目相机一般由左眼和右眼两个水平放置的相机组成。当然也可以做成上下两个目,但我们见到的主流双目都是做成左右的。在左右双目的相机中,我们可以把两个相机都看作针…

大数据毕设选题 - 深度学习图像超分辨率重建(opencv python cnn)

文章目录0 前言1 什么是图像超分辨率重建2 应用场景3 实现方法4 SRResNet算法原理5 SRCNN设计思路6 代码实现6.1 代码结构组织6.2 train_srresnet6.3 训练效果7 最后0 前言 🔥 Hi,大家好,这里是丹成学长的毕设系列文章! &#x…