大数据面试题之Hive(2)

目录

Hive的join操作原理,leftjoin、right join、inner join、outer join的异同?

Hive如何优化join操作

Hive的mapjoin

Hive语句的运行机制,例如包含where、having、group by、orderby,整个的执行过程?

Hive使用的时候会将数据同步到HDFS,小文件问题怎么解决的?

Hive Shuffle的具体过程

Hive有哪些保存元数据的方式,都有什么特点?

Hive SOL实现查询用户连续登陆,讲讲思路

Hive的开窗函数有哪些

Hive存储数据吗


Hive的join操作原理,leftjoin、right join、inner join、outer join的异同?

Inner Join(内连接)
原理:Inner Join返回两个表中具有匹配关联键的所有行。如果在其中一个表中找不到匹配项,那么结果集中就
不会包含该行。
特点:结果集仅包含两个表中关联键相等的行。Left Join(左连接)
原理:Left Join返回左表(左边的表)的所有行,即使在右表中没有匹配项。如果右表中没有匹配项,则结果
集中右表的部分将填充NULL值。
特点:结果集包含左表的所有行,右表中无匹配的行以NULL填充。Right Join(右连接)
原理:与Left Join相反,Right Join返回右表(右边的表)的所有行,即使在左表中没有匹配项。左表中无
匹配的行将以NULL值填充。
特点:结果集包含右表的所有行,左表中无匹配的行以NULL填充。Full Outer Join(全外连接)
原理:Full Outer Join返回左表和右表中所有行的组合。如果某行在另一个表中没有匹配项,则另一个表对应
的列值将为NULL。
特点:结果集包含两个表的所有行,任一表中无匹配的行以NULL填充。Outer Join(外连接)
Outer Join是一个总称,实际上指的是Left Outer Join、Right Outer Join或Full Outer Join中的
任何一种。在某些数据库或上下文中,"Outer Join"可能特指其中一种,但在Hive中,通常需要明确指定是
Left、Right还是Full。Left Semi Join(左半连接/半连接)
原理:这是一种特殊的Join操作,它只返回左表中存在与右表匹配的行,但是结果集中不会包含右表的任何列,
只显示左表匹配的行。
特点:优化了数据处理,特别是当只需要判断是否存在匹配,而不需要实际合并数据时非常有用。

Hive如何优化join操作

1、选择正确的JOIN类型:
使用INNER JOIN只返回两个表中都有的记录。
如果只需要左表的所有记录,即使右表中没有匹配的记录,也要使用LEFT OUTER JOIN。
根据需求选择其他类型的JOIN(如RIGHT OUTER JOIN, FULL OUTER JOIN)。2、使用Map Join:
如果一个表很小(通常称为“小表”),你可以考虑使用Map Join。在Hive中,小表会被加载到每个mapper的内
存中,从而避免了shuffle和reduce阶段。
使用/*+ MAPJOIN(small_table) */提示来启用Map Join。3、排序和分区:
对JOIN的键进行排序可以加速JOIN操作。
使用分区来减少跨多个HDFS块的数据读取。确保JOIN的键与表的分区键匹配。4、启用Bucket Map Join:
如果两个表都很大,但它们的JOIN键有相同的桶数和相同的哈希函数,你可以使用Bucket Map Join。这允许
Hive在mapper级别直接进行JOIN操作,而无需reduce阶段。5、优化Hive配置:
增加mapreduce.map.memory.mb和mapreduce.reduce.memory.mb以增加mapper和reducer的内存。
调整hive.auto.convert.join和hive.mapjoin.smalltable.filesize以自动优化JOIN操作。6、使用Bucketing和Skew Join:
如果数据倾斜严重,考虑使用Bucketing和Skew Join优化。这允许Hive更好地处理具有不同数据分布的数据
集。7、使用ORC或Parquet格式:
ORC和Parquet是Hive中常用的列式存储格式,它们比文本格式(如CSV)更高效。这些格式允许Hive只读取所
需的列,从而减少I/O。8、减少数据倾斜:
数据倾斜是指某些键的数据量远大于其他键。这会导致某些reducer处理的数据量远大于其他reducer,从而延
长整个JOB的执行时间。考虑对数据进行重新分区或预聚合以减少倾斜。9、启用Vectorization:
Hive支持向量化执行,它允许一次处理多行数据,从而提高性能。通过设置hive.vectorized.execution.enabled为true来启用它。10、监控和调优:
使用Hive的查询执行计划和资源管理器来监控JOB的性能。根据观察到的瓶颈(如CPU、内存、磁盘I/O)进行调
整。
考虑使用YARN ResourceManager UI或HiveServer2 UI来查看作业的详细信息和资源使用情况。11、索引:
虽然Hive不像关系型数据库那样支持传统的B-tree索引,但它支持其他类型的索引,如分区索引和物化视图。在
适当的情况下使用这些索引可以加速JOIN操作。但是,请注意,索引也会占用额外的存储空间,并可能增加数据
写入的复杂性。12、考虑使用其他工具:
如果Hive的JOIN性能仍然是一个问题,并且你的数据集适合其他工具(如Spark SQL、Flink SQL或Presto),那么考虑使用这些工具来执行JOIN操作。这些工具可能提供了更好的性能优化和更灵活的执行计划。

Hive的mapjoin

Hive 中的 MapJoin 是一种在 Map 阶段完成表连接的操作,它与普通的连接(Common Join)不同。在 
MapJoin 中,Hive 会将小表全部读入内存中,并在 Map 阶段直接将其与大表进行连接,从而避免了在 
Reduce 阶段进行数据分发和连接的开销。MapJoin 的适用场景包括大表与小表的连接,以及不等值连接等。通过在 SQL 语句中添加/*+ 
MAPJOIN(smallTable) */提示或设置相关参数,Hive 可以自动将连接操作转换为 MapJoin。
与 Common Join 相比,MapJoin 省去了 Shuffle 阶段,减少了数据传输和排序的开销,因此在处理大表与
小表连接时具有更好的性能。然而,MapJoin 也有一些限制,例如需要将小表完全加载到内存中,因此对于过大
的小表可能不太适用。
在实际应用中,需要根据数据量、表大小和性能要求等因素来选择合适的连接方式。如果连接的表中有一个非常小
的表(例如,一个包含几行数据的表),或者需要进行等值连接,并且数据存储在支持快速 I/O 和压缩的格式
(如 ORC 或 Parquet)中,那么 MapJoin 可能是一个较好的选择。

Hive语句的运行机制,例如包含where、having、group by、orderby,整个的执行过程?

Hive SQL语句的执行机制,尤其是包含WHERE、HAVING、GROUP BY、ORDER BY等子句的复杂查询,遵循一个
典型的分阶段处理流程。下面是一个简化的概述,展示这些子句如何影响查询的执行顺序:1、解析与分析(Parse & Analyze):Hive首先解析SQL语句,生成抽象语法树(AST),然后进行语义分析,
验证查询的正确性,比如检查表和列是否存在。
2、逻辑计划生成(Logical Plan Generation):基于分析结果,Hive构建一个逻辑执行计划,描述查询的
大致操作流程,但不涉及具体实现细节。
3、优化(Optimization):Hive的优化器会应用一系列规则来改进逻辑计划,比如重写查询、消除冗余操作
等,以提高执行效率。
4、物理计划生成(Physical Plan Generation):优化后的逻辑计划被转换为物理执行计划,此时会确定使
用哪些具体的MapReduce作业或其他执行引擎(如Tez、Spark)来执行查询,并规划每个阶段的任务。执行过程具体到WHERE、GROUP BY、HAVING、ORDER BY等子句时,大致流程如下:WHERE子句:在Map阶段或者 Reduce阶段之前(取决于具体优化策略),数据会被过滤。Hive尝试将尽可能多的
过滤条件推送到Map阶段执行,这称为谓词下推(Predicate Pushdown),以减少后续阶段处理的数据量。GROUP BY子句:在MapReduce模型中,GROUP BY操作通常在Reduce阶段执行。Map任务会对输入数据进行局
部聚合(如果启用了Map端聚合,即map-side aggregation),然后将聚合结果发送给Reducer,Reducer完
成全局聚合操作,即按指定列分组并聚合数据。HAVING子句:类似于WHERE,但作用于分组后的结果。因此,HAVING条件会在GROUP BY之后、在Reducer阶
段,用来过滤掉不符合条件的分组结果。ORDER BY子句:排序操作通常发生在最后一个Reduce阶段,或者如果使用了分布式排序(Distributed 
Sort),则在Map和Reduce阶段都有参与。这一步骤会消耗较多资源,特别是当处理大量数据时。为了优化,可
以结合LIMIT子句使用CLUSTER BY或DISTRIBUTE BY来限制排序范围。整个过程中,数据在MapReduce作业间流动,先经过筛选(WHERE)、局部聚合(如果适用),然后分组(GROUP 
BY)、再次筛选(HAVING),最后排序(ORDER BY),输出结果。每一步都旨在高效地处理大规模数据集。

Hive使用的时候会将数据同步到HDFS,小文件问题怎么解决的?

Hive在使用过程中确实会将数据存储于HDFS上,而小文件问题(即HDFS中存在大量远小于HDFS块大小的文件)
会影响集群性能和资源利用率。解决Hive中的小文件问题,可以采取以下几种策略:1、合并小文件:
使用SET hive.merge.mapfiles=true;和SET hive.merge.mapredfiles=true;配置,可以在Map-
only任务或MapReduce任务完成后自动合并小文件。
执行ALTER TABLE your_table CONCATENATE;命令手动触发文件合并,但这在新版本的Hive中可能已被废弃,建议使用更现代的解决方案如Insert overwrite目录或使用Spark/Hadoop的文件合并功能。2、Bucketing与分区结合:
使用分桶表(Bucketing)可以将数据预分割成固定大小的文件,减少小文件产生。合理设置桶的数量以平衡文
件大小和查询效率。3、调整动态分区参数:
动态分区产生的小文件问题可以通过调整hive.exec.dynamic.partition.mode(设置为非strict模式)、
hive.exec.max.dynamic.partitions、hive.exec.max.dynamic.partitions.pernode等参数控制分
区数量,避免过度分区。4、控制Reduce数量:
调整hive.exec.reducers.bytes.per.reducer参数,适当增加每个Reducer处理的数据量,减少Reducer
的数量,从而减少输出文件数量。5、数据导入策略:
在数据导入Hive前,先通过Hadoop的getmerge工具或使用Spark等框架预先合并小文件。6、使用Compaction:
对于ACID表,可以利用Hive的Compaction特性来合并小文件。Compaction过程会重新组织数据,减少文件数
量,优化查询性能。7、考虑使用外部工具或脚本:
定期运行脚本检测并合并HDFS上的小文件,虽然这不是Hive直接提供的功能,但对维护集群健康是有帮助的。8、采用更高效的执行引擎:
切换到Tez或Spark作为Hive的执行引擎,它们在处理小文件时可能更加高效,尤其是Spark有良好的数据处理和优化能力。

Hive Shuffle的具体过程

Hive Shuffle的具体过程可以清晰地分为以下几个步骤:1、Map任务输出:
Map任务会将数据处理的结果输出到本地缓存中。
当本地缓存的数据达到一定大小时,Hive会将数据写入临时文件中。2、数据准备:
所有Map任务完成后,Reducer任务开始执行。
Reducer任务会从所有Map任务的临时文件中读取数据。3、数据排序:
为了确保数据的正确性,在读取数据之前,Hive会对数据进行排序。
排序操作可以按照Hadoop的默认排序算法(按照key值进行排序)或自定义排序算法来实现。4、数据分区:
排序完成后,Hive会根据Reducer的数量进行数据的分区。
每个分区的数据会被写入一个临时文件中,以便Reducer任务进行后续处理。5、Reducer任务处理:
Reducer任务从对应的临时文件中读取数据。
将结果输出到HDFS(Hadoop Distributed File System)中。
需要注意的是,Hive Shuffle过程中由于需要将数据写入和读取临时文件,因此会产生额外的I/O开销,这可能会降低任务的执行效率。为了优化Hive Shuffle过程,可以采取以下措施:调整Map和Reduce任务的并行度:避免产生过多的临时文件,减少I/O开销。
选择合适的分区策略:确保具有相同key值的数据能够发送到同一个Reducer节点上进行处理,从而提高效率。优化排序算法:根据具体需求和数据特点选择合适的排序算法,提高排序效率。
使用Bucket Map Join:如果两个表都很大,但它们的JOIN键有相同的桶数和相同的哈希函数,可以考虑使用Bucket Map Join来避免shuffle和reduce阶段。
此外,还可以考虑其他因素来优化Hive的性能,如选择合适的存储格式、使用索引、调整Hive配置参数等。

Hive有哪些保存元数据的方式,都有什么特点?

在Hive中,有多种保存元数据的方式,以下是一些常见的方式及其特点:内存数据库(Derby):Hive默认使用内嵌的Derby数据库来存储元数据。这种方式安装简单,配置方便。然而,
由于数据存储在内存中,不够稳定,且不支持多会话连接,因此不适用于生产环境。外部数据库(如MySQL):将元数据保存在外部独立的数据库中,如MySQL。这种方式可以支持多会话连接,并且
数据可以持久化存储,具有更好的稳定性和可靠性。此外,使用外部数据库还可以方便地进行元数据的管理和维
护。

Hive SOL实现查询用户连续登陆,讲讲思路

在Hive中实现查询用户连续登录的逻辑,通常涉及到用户行为日志分析,这里我们可以采用窗口函数来实现这一
需求。以下是一个简化的思路和示例:基础假设
假设你有一个用户登录日志表user_login_logs,包含至少两列:user_id(用户ID)和login_date(登录
日期,格式为YYYY-MM-DD)。
我们定义“连续登录”为用户在连续的日期上均有登录记录。
为了简化,我们不考虑具体登录时间,仅关注日期。思路
排序与分组:首先,需要按user_id和login_date对数据进行排序,确保每个用户的登录记录按日期排序。
计算连续日期差:使用窗口函数LAG或LEAD来获取每个用户登录日期与前一条或后一条记录的日期差。
过滤连续登录记录:基于日期差判断连续性,保留满足连续登录条件的记录。
示例SQL
以下是一个使用LAG函数找出至少连续两天登录的用户的示例SQL。这里我们计算每个用户每天的登录与前一天的
登录间隔,并筛选出间隔为1天的记录,意味着连续登录。WITH login_dates AS (SELECT user_id, login_date, LAG(login_date, 1) OVER (PARTITION BY user_id ORDER BY login_date) as prev_login_dateFROM user_login_logs
)SELECT user_id, login_date, DATE_ADD(prev_login_date, 1) as expected_login_date
FROM login_dates
WHERE login_date = DATE_ADD(prev_login_date, 1)
ORDER BY user_id, login_date;注意事项
上述SQL只是基础示例,实际场景可能更复杂,比如需要考虑跨月连续登录的情况,或者需要找出最长连续登录序
列等。
如果要找出所有连续登录序列,可能需要更复杂的逻辑,比如使用自定义UDF(用户自定义函数)或者编写更复杂
的窗口函数逻辑。
考虑性能,对于大规模数据,上述查询可能较慢,可能需要进一步优化,比如通过预处理数据或使用更高效的计算
引擎。

Hive的开窗函数有哪些

Hive的开窗函数(也称为窗口函数或分析函数)主要用于在数据集的每个窗口上执行计算,这些窗口可以是整个
数据集,也可以是由PARTITION BY子句定义的每个分区。以下是Hive中常用的一些开窗函数:ROW_NUMBER() OVER()
功能:为窗口中的每一行分配一个唯一的序号。
特点:对相等的值不进行区分,相等的值对应的排名相同,序号从1到n连续。RANK() OVER()
功能:为窗口中的每一行提供一个排名。
特点:相等的值排名相同,但若有相等的值,则序号从1到n不连续。例如,如果有两个人都排在第三名,则没有第
四名。DENSE_RANK() OVER()
功能:为窗口中的每一行提供一个排名。
特点:对相等的值排名相同,但序号从1到n连续。例如,如果有两个人都排在第一名,则排在第二名的人是第三个
人。NTILE(n) OVER()
功能:将有序的数据集合平均分配到指定的n个桶中,将桶号分配给每一行。
特点:如果不能平均分配,则较小的桶分配额外的行,并且各个桶中能放的数据条数最多相等。PERCENT_RANK()
功能:计算排名百分比。
排名计算公式:(当前排名 - 1)/(分组内总行数 - 1)。CUME_DIST()
功能:计算小于或等于当前值的行数占总数的比例。
如果按照升序排列,则统计小于等于当前值的行数/总行数;如果是降序排列,则统计大于等于当前值的行数/总行数。LEAD(value_expr[, offset[, default]])
功能:用于统计窗口内往下第n行值。
第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(如果往下第n行为null时,取默认值)。LAG(value_expr[, offset[, default]])
功能:与LEAD相反,用于统计窗口内往上第n行值。
参数含义与LEAD相同,但方向相反。这些开窗函数在Hive中通常与OVER()子句一起使用,以指定窗口的定义,包括PARTITION BY子句(用于定义分区)和ORDER BY子句(用于定义窗口内的排序)。通过这些函数,可以在Hive中进行各种复杂的数据分析操作。

Hive存储数据吗

Hive 本身并不直接存储数据,而是对存储在 Hadoop 分布式文件系统(HDFS)或其他兼容的文件系统中的数据
进行管理和查询。Hive 提供了一种类似于 SQL 的查询语言(HiveQL),使用户能够方便地对大规模数据进行分析和处理。当用户
在 Hive 中创建表并定义表结构时,Hive 会将这些元数据信息进行存储和管理,但实际的数据仍然存放在底层
的文件系统中。例如,如果您在 Hive 中创建了一个表,并指定数据存储在 HDFS 中的某个路径,那么 Hive 会知道如何解析
和查询该路径下的数据,但数据本身是由 HDFS 负责存储和管理的。

引用:https://www.nowcoder.com/discuss/353159520220291072

通义千问、文心一言、豆包

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

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

相关文章

Laravel 响应对象深度解析:构建动态 HTTP 响应

在 Laravel 框架中,响应(Response)对象扮演着至关重要的角色,它负责将应用程序的输出发送给客户端。Laravel 的响应系统非常灵活,允许开发者以多种方式构建和自定义响应。本文将深入探讨 Laravel 中响应对象的工作机制…

Keil汇编相关知识

一、汇编的组成 1.汇编指令:在内存中占用内存,执行一条汇编指令会让处理器进行相关运算 分类:数据处理指令,跳转指令,内存读写指令,状态寄存器传送指令,软中断产生指令,协助处理器…

AcWing算法基础课笔记——状态压缩DP:蒙德里安的梦想

状态压缩DP 状态是整数,但把它看成二进制数,二进制中每一位是0或1表示不同的情况。 蒙德里安的梦想 291. 蒙德里安的梦想 - AcWing题库 题目 求把 NM𝑁𝑀 的棋盘分割成若干个 1212 的长方形,有多少种方案。 例如…

electron-builder 打包过慢解决

报错内容如下 > 6-241.0.0 build > electron-builder • electron-builder version24.13.3 os10.0.22631 • loaded configuration filepackage.json ("build" field) • writing effective config filedist\builder-effective-config.yaml • pack…

地下管线管网三维建模系统MagicPipe3D

地下管网是保障城市运行的基础设施和“生命线”。随着实景三维中国建设的推进,构建地下管网三维模型与地上融合的数字孪生场景,对于提升智慧城市管理至关重要!针对现有三维管线建模数据差异大、建模交互弱、模型效果差、缺乏语义信息等缺陷&a…

清科ZF引导基金数据(1990-2023年)

清科ZF引导基金数据,参考经济学家吴超鹏和严泽浩在《经济研究》2023年的研究,通过清科私募通数据库,获取ZF引导基金的管理机构信息。数据涵盖了ZF引导基金的关键信息,如基金名称、管理机构详情、所属层级、发展阶段、地域分布、初…

java学习 - Redis五大数据类型

redis通用命令 命令说明时间复杂度type key判断key的数据类型O(1)keys [pattern]获取数据库中所有符合pattern的keyO(n)dbsize获取数据库的key的数量O(1)exists key判断是否存在key;存在返回1,不存在返回0O(1)del key [key…]删除key;返回删除个数O(1)expire key s…

Batch学习:开启高效学习之旅

Batch学习:开启高效学习之旅 Batch学习是一种学习方法,它将学习内容划分为多个批次进行学习。这种方法有助于学生更好地掌握知识,提高学习效果。本文将详细介绍Batch学习的概念、方法和优势,并探讨如何有效地实施Batch学习。 一…

数据集MNIST手写体识别 pyqt5+Pytorch/TensorFlow

GitHub - LINHYYY/Real-time-handwritten-digit-recognition: VGG16和PyQt5的实时手写数字识别/Real-time handwritten digit recognition for VGG16 and PyQt5 pyqt5Pytorch内容已进行开源,链接如上,请遵守开源协议维护开源环境,如果觉得内…

redis集群简单介绍及其搭建过程

Redis集群 1、哨兵模式 哨兵可以有多个,从服务器也可以有多个,从服务器也可以有多个,在Redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会实现主从切换&#x…

百度大模型安全荣获2024世界智能产业博览会“Find智能科技创新应用典型案例”

6月20日,2024世界智能产业博览会在天津开幕。会议聚焦人工智能、智能网联汽车、智能制造等年度热点议题,由世界智能产业博览会组委会指导,世界智能产业博览会组委会秘书处、中国新一代人工智能战略发展研究院、中国软件行业协会、中国网络空间…

极客之夜 | XCTF国际网络攻防联赛十周年庆典圆满落幕

在数字化浪潮的推动下,网络安全已成为全球关注的焦点。十年磨一剑,XCTF国际网络攻防联赛以其卓越的赛事品质和深远的影响力,成为网络安全领域的一面旗帜。极客之夜,我们齐聚一堂,共同庆祝XCTF的十年辉煌,展…

sheng的学习笔记-AI-高斯混合模型(GMM)

AI目录:sheng的学习笔记-AI目录-CSDN博客 sheng的学习笔记-AI-聚类(Clustering)-CSDN博客需要学习前置知识: 聚类,可参考 sheng的学习笔记-AI-聚类(Clustering)-CSDN博客 EM算法,可参考 sheng的学习笔记-AI-EM算法-CSDN博客 贝…

OVS:网桥的状态:fail_mode模式

目录 1.创建一个普通的ovs网桥不做任何配置 2.检测fail_mode值,默认为空 3.创建netns并配置sto网桥的两个普通端口并配置IP信息 4.默认情况下的两个端口下挂两个虚拟机v3,v4天然通信-ping-ok 5.修改网桥的fail_mode为standalone,原来的通信没有影响 6.修改了…

okcc呼叫中心系统通话声音小有哪几种处理办法?

处理OKCC呼叫中心系统通话声音过小的几种方法包括: 第一种: 1、IP话机:通过话机上的音量调节按钮来进行调节。 2、模拟话机:修改语音网关上的增益来实现。 “ 往IP增益”表示电话呼入的声音调节,主要针对内部分…

伸缩盒模型,flex布局

目录 1、伸缩容器、伸缩项目 2、主轴方向(flex-direction) 3、主轴换行方式(flex-wrap) 4、flex-flow 5、主轴对齐方式(justify-content) 6、侧轴对齐方式_一行(align-items) 7、侧轴对齐方式_多行(align-content) 8、元素水平垂直居中 9、项目在主轴的基准长度(flex-b…

运维.Linux下执行定时任务(中:Cron的常用替代方案)

运维系列 Linux下执行定时任务(中:Cron的常用替代方案) - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAd…

CMA软件测试报告对企业和用户有什么好处?

CMA是中国计量认证的简称,由省级以上人民政府计量行政部门对检测机构的检测能力及可靠性进行的一种全面的认证及评价,认证对象是所有对社会出具公正数据的产品质量监督检验机构及其它各类实验室,是需要强制性认证的资质。取得该资质认证的&am…

【golang学习之旅】复杂数据类型——指针 函数

系列文章 【golang学习之旅】使用VScode安装配置Go开发环境 【golang学习之旅】报错:a declared but not used 【golang学习之旅】Go 的基本数据类型 【golang学习之旅】深入理解字符串string数据类型 【golang学习之旅】go mod tidy 【golang学习之旅】记录一次 p…

spring02

bean中公共属性抽取出来&#xff0c;统一配置 <bean class"com.cj.Animal" id"animal"><property name"category" value"犬科"/></bean><bean class"com.cj.Dog" id"dog1" parent"anim…