Hive离线数仓结构分析
Hive离线数仓结构
首先,在数据源部分,包括源业务库、用户日志、爬虫数据和系统日志,这些都是数据的源头。这些数据通过Sqoop、DataX或 Flume 工具进行提取和导入操作。这些工具负责将不同来源的数据传输到基于 Hive 的离线数据仓库中。
在离线数据仓库中,数据会依次经过多个处理层。最开始是 ODS(操作数据存储)层,这里存储的是从数据源导入的原始数据。接着数据流向 DWD(数据仓库明细)层,在此层对原始数据进行清洗和预处理,确保数据质量。之后是 DWM(数据仓库中间)层,在这一层进行数据的聚合和整合,生成中间结果。然后是 DWS(数据仓库服务)层,该层主要是为数据分析和应用提供数据服务。最后是DM(数据集市)层,针对特定业务需求进行数据定制和汇总。
在数据仓库处理过程中,分布式离线计算起到了关键作用。图中展示了几种常用的分布式计算框架,包括MapReduce、Hive SQL、Impala和 Spark SQL。这些框架用于处理和分析数据仓库中的数据,确保数据处理的高效性和准确性。
数仓分层
为什么分层?
作为一名数据的规划者,我们肯定希望自己的数据能够有秩序地流转,数据的整个生命周期能够清晰明确被设计者和使用者感知到。直观来讲就是如图这般层次清晰、依赖关系直观。但是,大多数情况下,我们完成的数据体系却是依赖复杂、层级混乱的。在不知不觉的情况下,我们可能会做出一套表依赖结构混乱,甚至出现循环依赖的数据体系。
因此,我们需要一套行之有效的数据组织和管理方法来让我们的数据体系更有序,这就是谈到的数据分层。数据分层并不能解决所有的数据问题,但是,数据分层却可以给我们带来如下的好处:
-
清晰数据结构:每一个数据分层都有它的作用域和职责,在使用表的时候能更方便地定位和理解。
-
复杂问题简单化:将一个复杂的任务分解成多个步骤来完成,每一层解决特定的问题。
-
便于维护:当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复。
-
减少重复开发:规范数据分层,开发一些通用的中间层数据,能够减少重复开发的工作量。
-
高性能:数据仓库的构建将大大缩短获取信息的时间,数据仓库作为数据的集合,所有的信息都可以从数据仓库直接获取,尤其对于海量数据的关联查询和复杂查询,所以数据仓库分层有利于实现复杂的统计需求,提高数据统计的效率。
ODS层(操作数据层,Operational Data Store)
数据来源与特点
数据来源广泛:直接从各个业务系统的数据库中抽取而来,如企业的ERP系统、CRM系统、电商平台的交易数据库等。这些数据基本保持了业务系统中原始数据的原貌,包括数据的格式、精度、编码等。
数据实时性强:能够快速获取业务系统中的最新数据,通常是按照一定的时间周期(如每小时、每天)进行增量抽取,以保证数据仓库中的数据与业务系统数据的同步性在可接受范围内。
功能作用
数据集成:将不同业务系统、不同类型的数据整合到一起,解决了数据分散在多个系统中的问题,为后续的数据处理提供了统一的数据基础。
数据缓冲:作为业务数据进入数据仓库的第一层,起到了缓冲的作用,避免了直接对业务系统数据库的频繁查询和读取,减轻了业务系统的压力。
支持快速查询:可以满足一些对实时性要求较高、查询相对简单的业务需求,如实时监控业务数据的变化、快速获取当天的业务订单数量等。
DIM层(维度层,Dimension)
数据构成与特性
维度数据丰富:主要包含了描述业务事实的各种维度信息,如时间维度(年、月、日、时等)、地理维度(国家、地区、城市等)、产品维度(产品类别、品牌、型号等)、客户维度(客户类型、年龄、性别等)。
数据相对稳定:维度数据一旦确定,通常不会频繁更改,具有较高的稳定性。例如,产品的类别和品牌一般不会经常变动。
功能作用
提供分析维度:为数据分析和决策支持提供了丰富的维度视角,通过与其他层的数据进行关联,可以从不同的维度对业务事实进行分析和挖掘。
数据标准化:对维度数据进行统一的编码、分类和标准化处理,确保在整个数据仓库中维度信息的一致性和准确性,便于进行跨部门、跨业务的数据分析和比较。
支持数据钻取:方便用户在数据分析过程中进行维度的上卷和下钻操作,例如从年维度钻取到月维度,或者从产品类别维度下钻到具体的产品型号维度,以满足不同层次的分析需求。
DWD层(明细数据层,Data Warehouse Detail)
数据处理与特征
数据清洗与转换:对从ODS层抽取上来的数据进行清洗,去除噪声数据、重复数据,处理缺失值等,并根据业务规则进行数据转换,如数据类型的统一、字段的拆分和合并等。
明细数据存储:以业务过程为单位,存储经过清洗和转换后的详细业务数据,这些数据能够完整地反映每个业务过程的细节信息,如每一笔订单的详细信息、每一次客户访问的记录等。
功能作用
数据质量提升:通过清洗和转换操作,提高了数据的质量,为后续的数据分析和应用提供了准确、可靠的数据基础。
支持明细查询:能够满足对业务数据进行详细查询和分析的需求,例如查询某一订单的具体交易信息、某一客户在特定时间段内的所有访问记录等。
为数据聚合做准备:作为数据聚合的基础层,为DWS层和ADS层提供了详细的数据支持,便于进行各种维度的汇总和统计分析。
DWM 层(数据仓库中间层,Data Warehouse Middle)
数据处理方式与特点
轻度汇总处理:对 DWD 层的明细数据进行轻度汇总操作。这种汇总操作介于明细数据和高度汇总数据之间,例如按小时对用户登录次数进行汇总,或按天对商品点击量进行汇总。
数据整合与转换:将来自多个不同数据源的 DWD 层数据进行整合,并进行必要的数据转换。比如将不同格式的日期数据统一转换为标准格式,或者将不同编码的产品类别进行统一编码。
关联分析处理:对存在关联关系的数据进行处理,挖掘数据间的潜在联系。例如将用户的浏览行为数据和购买行为数据进行关联,分析用户的购买决策过程。
功能作用
数据优化与预处理:通过轻度汇总、转换和关联处理,优化数据结构,为后续更复杂的数据分析和处理提供更便捷的数据基础,减少数据处理复杂性。
支持实时分析需求:能够快速地为一些实时性较强的数据分析需求提供数据支持,如实时监控某产品在当天的销售趋势,通过 DWM 层已处理的数据可以快速获取相关信息。
辅助数据挖掘工作:为数据挖掘任务提供经过初步处理的数据,提高数据挖掘的效率和准确性。例如在进行用户细分的数据挖掘项目时,DWM 层处理的数据可以帮助更准确地识别不同用户群体的特征。
DWS层(汇总数据层,Data Warehouse Summary)
数据汇总方式与特点
基于维度汇总:根据预先定义的业务规则和分析需求,按照一定的维度对DWD层的明细数据进行汇总,如按天、周、月等时间维度对订单金额进行汇总,或者按地区、产品类别等维度对销售量进行汇总。
轻度汇总数据:汇总的程度相对较轻,一般保留了关键的维度信息和汇总指标,既能满足一定的分析需求,又不至于丢失过多的细节信息,具有较好的灵活性和扩展性。
功能作用
提高查询效率:通过预先的汇总计算,大大减少了查询时需要处理的数据量,提高了数据分析的效率,能够快速响应用户的分析请求,如快速获取某个月的销售总额、某个地区的客户活跃度等。
支持综合分析:为企业的综合数据分析和决策支持提供了有力的数据支持,能够从多个维度对业务数据进行综合分析,发现业务的趋势、规律和问题。
数据共享与复用:作为企业内部分享和复用的数据层,不同的业务部门和分析团队可以基于DWS层的数据进行各自的分析和应用开发,减少了重复的数据处理工作。
ADS层(应用数据层,Application Data Store)
数据应用导向与特性
面向应用场景:根据具体的业务应用需求和决策场景而构建,数据具有很强的针对性和实用性,如为营销活动提供目标客户名单、为财务报表提供数据支持、为运营监控提供关键指标数据等。
数据形式多样:可以是报表、仪表盘、数据接口等多种形式,以满足不同用户和业务场景的需求。
功能作用
支持业务决策:直接为企业的业务决策提供数据支持,通过对数据的分析和展示,帮助决策者快速了解业务现状、发现问题、制定决策方案。
数据交付与输出:作为数据仓库与业务应用的接口层,将经过处理和分析的数据以合适的形式交付给业务用户,实现了数据仓库与业务应用的有效衔接,促进了数据的价值转化和应用落地。
相关文章:
Hive离线数仓结构分析
Hive离线数仓结构 首先,在数据源部分,包括源业务库、用户日志、爬虫数据和系统日志,这些都是数据的源头。这些数据通过Sqoop、DataX或 Flume 工具进行提取和导入操作。这些工具负责将不同来源的数据传输到基于 Hive 的离线数据仓库中。 在离线…...
《macOS 开发环境配置与应用开发》
一、引言 macOS 作为一款强大而流行的操作系统,为开发者提供了丰富的开发机会和优秀的开发环境。无论是开发原生的 macOS 应用,还是进行跨平台开发,了解和掌握 macOS 开发环境的配置以及应用开发的方法至关重要。本文将详细介绍 macOS 开发环…...
DataGear 5.2.0 发布,数据可视化分析平台
DataGear 企业版 1.3.0 已发布,欢迎体验! http://datagear.tech/pro/ DataGear 5.2.0 发布,图表插件支持定义依赖库、严重 BUG 修复、功能改进、安全增强,具体更新内容如下: 重构:各模块管理功能访问路径…...
Knife4j快速入门
1 概述 Knife4j是一个用于生成和展示API文档的工具,同时它还提供了在线调试的功能,下图是其工作界面。 了解: Knife4j有多个版本,最新版的Knife4j基于开源项目springdoc-openapi,这个开源项目的核心功能就是根据Sprin…...
pcap_set_buffer_size()函数
功能简介 pcap_set_buffer_size()函数主要用于设置数据包捕获的内核缓冲区大小。这个缓冲区是操作系统内核用于临时存储捕获到的数据包的区域。通过调整缓冲区大小,可以在一定程度上优化数据包捕获的性能,特别是在高流量网络环境或者需要长时间捕获数据包…...
Ubuntu24.04——软件包系统已损坏
如果你在使用 Ubuntu 时遇到“软件包系统已损坏”的问题,可以尝试以下步骤来修复它: 更新软件包列表: 打开终端,运行以下命令以更新软件包列表: sudo apt update修复损坏的软件包: 运行以下命令来修复损坏的…...
项目实战:Vue3开发一个购物车
这段HTML代码实现了一个简单的购物车实战小项目的前端页面,结合了Vue.js框架来实现数据响应式和交互逻辑。页面展示了购物车中的商品项,每个商品项有增减数量的按钮,并且能显示商品总数以及目前固定为0元的商品总价和总价计算。 【运用响应式…...
OpenOCD之J-Link下载
1.下载USB Dirver Tool.exe,选择J-Link dirver,替换成WinUSB驱动。(⭐USB Dirver Tool工具可将J-Link从WinUSB驱动恢复为默认驱动⭐) 下载方式 ①官方网址:https://visualgdb.com/UsbDriverTool/ ②笔者的CSDN链接&…...
C++中定义类型名的方法
什么是 C 中的类型别名和 using 声明? 类型别名与using都是为了提高代码的可读性。 有两种方法可以定义类型别名 一种是使用关键字typedef起别名使用别名声明来定义类型的别名,即使用using. typedef 关键字typedef作为声明语句中的基本数据类型的一…...
241124学习日志——[CSDIY] [ByteDance] 后端训练营 [14]
CSDIY:这是一个非科班学生的努力之路,从今天开始这个系列会长期更新,(最好做到日更),我会慢慢把自己目前对CS的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!!&…...
丹摩|丹摩智算平台深度评测
1. 丹摩智算平台介绍 随着人工智能和大数据技术的快速发展,越来越多的智能计算平台涌现,为科研工作者和开发者提供高性能计算资源。丹摩智算平台作为其中的一员,定位于智能计算服务的提供者,支持从数据处理到模型训练的全流程操作…...
VSCode 快捷键
箭头函数 安装VSCODE插件用于在编辑器中生成ES6语法的JavaScript的代码段(支持JavaScript和Typescript)。 安装成功后输入an回车就可以了 (params) > {} 1、显示快捷键列表 快捷键:⌘ K S 可以通过上述按键显示vscode的快捷键列表&am…...
Java基础-Java多线程机制
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 一、引言 二、多线程的基本概念 1. 线程与进程 2. 多线程与并发 3. 多线程的优势 三、Java多线程的实…...
【创建型设计模式】单例模式
【创建型设计模式】单例模式 这篇博客接下来几篇都将阐述设计模式相关内容。 接下来的顺序大概是:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。 一、什么是单例模式 单例模式是一种创建型设计模式,它保证一个类仅有一个实例&#…...
SpringBoot集成多个rabbitmq
1、pom文件 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><versio…...
JavaScript将至
JS是什么? 是一种运行在客户端(浏览器)的编程语言,实现人机交互效果 作用捏? 网页特效 (监听用户的一些行为让网页作出对应的反馈) 表单验证 (针对表单数据的合法性进行判断) 数据交互 (获取后台的数据, 渲染到前…...
Java中的线程池(如果想知道Java中有关线程池的知识,那么只看这一篇就足够了!)
前言:线程池是 Java 中用于高效管理并发任务的工具,通过复用线程、降低线程创建销毁的开销,提升系统性能与响应速度。它帮助开发者更好地控制线程生命周期和资源消耗,是高并发应用的重要组成部分。 ✨✨✨这里是秋刀鱼不做梦的BLO…...
Java 获取本机 IP 地址的方法
文章目录 一、使用 InetAddress.getLocalHost二、遍历网络接口获取 在 Java 编程中,若有本机的 IP 地址的需求,小编来展示一下方法: 一、使用 InetAddress.getLocalHost 一是最基本的获取本机 IP 地址的方式。 示例代码: impo…...
开源动态表单form-create-designer 扩展个性化配置的最佳实践教程
在开源低代码表单设计器 form-create-designer 的右侧配置面板里,field 映射规则为开发者提供了强大的工具去自定义和增强组件及表单配置的显示方式。通过这些规则,你可以简单而高效地调整配置项的展示,提升用户体验。 源码地址: Github | G…...
c语言数据结构与算法--简单实现线性表(顺序表+链表)的插入与删除
老规矩,点赞评论收藏关注!!! 目录 线性表 其特点是: 算法实现: 运行结果展示 链表 插入元素: 删除元素: 算法实现 运行结果 线性表是由n个数据元素组成的有限序列ÿ…...
5、AI测试辅助-生成测试用例思维导图
AI测试辅助-生成测试用例思维导图 创建测试用例两种方式1、Plantuml思维导图版本 (不推荐)2、Markdown思维导图版本(推荐) 创建测试用例两种方式 完整的测试用例通常需要包含以下的元素: 1、测试模块 2、测试标题 3、前置条件 4、…...
c ++零基础可视化——vector
c 零基础可视化——vector 初始化 vector<int> v0(5); // 0 0 0 0 0 vector<int> v1(5, 1); // 1 1 1 1 1 vector<int> v2{1, 2, 3} // 1 2 3 vector<int> v3(v1); // 1 1 1 1 1 vector<vector<int>> v4(2, vect…...
网络安全应急响应及其发展方向
计算机信息系统和网络已经成为社会重要的基础设施,而网络安全始终是笼罩在Internet天空的一片乌云,对社会的威胁也与日俱增。自1988年莫里斯蠕虫事件以来,网络安全事件逐年上升,所造成的损失越来越大。自从CERT/CC成立以来&#x…...
Linux应用编程(C语言编译过程)
目录 1. 举例 2.预处理 2.1 预处理命令 2.2 .i文件内容解读 3.编译 4.汇编 5.链接 5.1 链接方式 5.1.1 静态链接 5.1.2 动态链接 5.1.3 混合链接 1. 举例 Linux的C语言开发,一般选择GCC工具链进行编译,通过下面的例子来演示GCC如何使用&#…...
003 STM32基础、架构以及资料介绍——常识
注: 本笔记参考学习B站官方视频教程,免费公开交流,切莫商用。内容可能有误,具体以官方为准,也欢迎大家指出问题所在。 01什么是STM32(宏观) STM32属于一个微控制器,自带了各种常用通…...
输入三个整数x,y,z,请把这三个数由小到大输出。-多语言实现
目录 C 语言实现 Python 实现 Java 实现 Js 实现 题目:输入三个整数x,y,z,请把这三个数由小到大输出。 程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后…...
Java爬虫:获取商品详情的实践之旅
在当今这个信息爆炸的时代,数据的价值日益凸显。对于电商行业来说,商品详情的获取尤为重要,它不仅关系到产品的销售,还直接影响到用户体验。传统的人工获取方式耗时耗力,而自动化的爬虫技术则提供了一种高效解决方案。…...
vue 富文本图片如何拖拽
在Vue项目中实现富文本编辑器(如vue-quill-editor)的图片拖拽功能,需要结合Quill.js及其相关插件进行配置 安装必要的依赖包: 你需要安装vue-quill-editor作为富文本编辑器的基础组件。为了支持图片拖拽功能,你还需要…...
C#里怎么样实现自己的类满足for-each循环访问?
C#里怎么样实现自己的类满足for-each循环访问? 由于foreach语句使用起来比较方便,并且又简单,不像for循环那样需要写三个语句, 并且还有可能判断不对,导致少访问的情况。 在使用库里提供的容器时,都会有实现foreach的方式。 如果自己的类也实现这种方式,使用起来就比较…...
【Elasticsearch入门到落地】2、正向索引和倒排索引
接上篇《1、初识Elasticsearch》 上一篇我们学习了什么是Elasticsearch,以及Elastic stack(ELK)技术栈介绍。本篇我们来什么是正向索引和倒排索引,这是了解Elasticsearch底层架构的核心。 上一篇我们学习到,Elasticsearch的底层是由Lucene实…...
ODBC连接PostgreSQL数据库后,网卡DOWN后,客户端进程阻塞问题解决方法
问题现象:数据库客户端进程数据库连接成功后,再把跟数据库交互的网卡down掉,客户端进程就会阻塞,无法进行其他处理。该问题跟TCP keepalive机制有关。 可以在odbc.ini文件中增加相应的属性来解决,在odbc.ini 增加如下…...
Java Springboot河北任丘非遗传承宣传平台
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…...
SpringBoot整合MQTT利用EMQX完成消息的发布与接收+Python模拟硬件测试通信
教程说明 本教程主要内容为使用SpringBoot整合MQTT利用EMQX代理服务完成MQTT的消息发送与接收,然后用Python模拟硬件与SpringBoot应用进行了MQTT消息的通信,教程详细,并在最后讲解了开发中的注意事项,本教程适用于物联网领域、Ja…...
【数据结构】【线性表】栈的基本概念(附c语言源码)
栈的基本概念 讲基本概念还是回到数据结构的三要素:逻辑结构,物理结构和数据运算。 从逻辑结构来讲,栈的各个数据元素之间是通过是一对一的线性连接,因此栈也是属于线性表的一种从物理结构来说,栈可以是顺序存储和顺…...
【jvm】为什么java是半编译半解释型语言
目录 1. 编译过程2. 解释过程3. 即时编译(JIT)过程4. 半编译半解释型语言的特点 1. 编译过程 1.Java源代码首先会被编译成字节码(Bytecode),这是一种与具体平台无关的中间代码。2.这一编译过程由Java编译器࿰…...
人工智能之机器学习5-回归算法2【培训机构学习笔记】
培训班ppt内容: 个人精进总结: 可解释方差 定义 可解释方差的回归评分函数是一种用于评估回归模型性能的指标,以下从其定义、计算公式、取值范围及意义、应用场景等方面进行详细介绍: 可解释方差(Explained Varian…...
C#动态类型详解:应用场景与注意事项
C#中的动态类型(dynamic)是C# 4.0引入的一个关键字,它允许在编译时绕过类型检查,将类型确定推迟到运行时。这意味着,当使用dynamic类型时,编译器不会对调用的方法或访问的属性进行类型检查,而是…...
C语言笔记(自定义类型:结构体、枚举、联合体 )
前言 本文对自定义类型的结构体创建、使用、结构体的存储方式和对齐方式,枚举的定义、使用方式以及联合体的定义、使用和存储方式展开叙述,如有错误,请各位指正。 目录 前言 1 结构体 1.1 结构体的声明 1.2 结构体的自引用 1.3 结构体变…...
【Golang】——Gin 框架与数据库集成详解
文章目录 1. 引言2. 初始化项目2.1 创建 Gin 项目2.2 安装依赖 3. 数据库驱动安装与配置3.1 配置数据库3.2 连接数据库3.3 在主函数中初始化数据库 4. 定义数据模型4.1 创建用户模型4.2 自动迁移 5. 使用 GORM 进行 CRUD 操作5.1 创建用户5.2 获取用户列表5.3 更新用户信息5.4 …...
nature communications论文 解读
题目《Transfer learning with graph neural networks for improved molecular property prediction in the multi-fidelity setting》 这篇文章主要讨论了如何在多保真数据环境(multi-fidelity setting)下,利用图神经网络(GNNs&…...
selinux及防火墙
selinux说明 SELinux 是 Security-Enhanced Linux 的缩写,意思是安全强化的 linux 。 SELinux 主要由美国国家安全局( NSA )开发,当初开发的目的是为了避免资源的误用。 httpd进程标签(/usr/share/nginx/html &#…...
实验二 系统响应及系统稳定性
实验目的 (1)学会运用Matlab 求解离散时间系统的零状态响应; (2)学会运用Matlab 求解离散时间系统的单位取样响应; (3)学会运用Matlab 求解离散时间系统的卷积和。 实验原理及实…...
【人工智能】深度学习入门:用TensorFlow实现多层感知器(MLP)模型
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 多层感知器(MLP)是一种基础的神经网络结构,广泛应用于分类和回归任务。作为深度学习的重要组成部分,理解并实现MLP是学习更复杂神经网络模型的基础。本文将介绍多层感知器的核心概念、数学原理,并使用…...
设计模式之建造者模式
建造者模式(Builder Pattern)是一种创建型设计模式,旨在将一个复杂对象的构建过程与其表示分离。它允许通过一步步地构造对象,而不需要暴露对象的内部细节和构建过程。通常,这个模式适用于创建对象时需要多个步骤&…...
谈一下开源生态对 AI人工智能大模型的促进作用
谈一下开源生态对 AI人工智能大模型的促进作用 作者:开源呼叫中心系统 FreeIPCC,Github地址:https://github.com/lihaiya/freeipcc 开源生态对大模型的促进作用是一个多维度且深远的话题,它不仅加速了技术创新的速度,…...
数据结构——树与二叉树
树 介绍 n个节点的有效集,它可为空树或非空树; 树是一种递归的结构。 对于非空树: 有且仅有一个称为根的节点。 除根节点以外其余节点可分为m个互不相交的有限集,且这些有限集本身也是一棵树,称为根的子树。 分等…...
神经网络(系统性学习三):多层感知机(MLP)
相关文章: 神经网络中常用的激活函数 神经网络(系统性学习一):入门篇 神经网络(系统性学习二):单层神经网络(感知机) 多层感知机(MLP) 多层感…...
Python学习——字符串操作方法
mystr “hello word goodbye” str “bye” Find函数:检测一个字符串中是否包含另一个字符串,找到了返回索引值,找不到了返回-1 print(mystr.find(str,0,len(mystr))) print(mystr.find(str,0,13)) index函数:检测一个字符串是否包含另一…...
css使用弹性盒,让每个子元素平均等分父元素的4/1大小
css使用弹性盒,让每个子元素平均等分父元素的4/1大小 原本: ul {padding: 0;width: 100%;background-color: rgb(74, 80, 62);display: flex;justify-content: space-between;flex-wrap: wrap;li {/* 每个占4/1 */overflow: hidden;background-color: r…...
C语言练习.if.else语句.strstr
今天在做题之前,先介绍一下,新学到的库函数strstr 想要使用它,要先给它一个头文件<string.h> char *strstr(const char*str1,const char*str2); 首先:1.strstr的返回值是char,字符类型的。 2.两个实参ÿ…...