hive函数

news2024/11/24 5:55:51

函数

Hive的函数分为两大类∶内置函数(Built-in Functions )、用户定义函数UDF (User-Defined Functions ) .

内置函数可分为︰数值类型函数、日期类型函数、字符串类型函数、集合函数、条件函数等;

用户定义函数根据输入输出的行数可分为3类:UDF、UDAF、UDTF。

  • UDF:普通函数,一进一出
  • UDAF:聚合函数,多进一出
  • UDTF:表生成函数,一进多出

在这里插入图片描述

UDF分类标准本来针对的是用户自己编写开发实现的函数。UDF分类标准可以扩大到Hive的所有函数中︰包括内置函数和用户自定义函数。

查看所有函数

show functions ;

查看指定函数信息

-- 查看count函数信息
desc function count;
desc function extended count;

函数API文档

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-Built-inFunctions

1 字符串函数

在这里插入图片描述

---------String Functions字符串函数-— —---------
select concat("liu", "yan")
-- 带分隔符字符串连接函数:concat_ws(separator,[string|array(string)]+)
select concat_ws('.', 'www', array('51doit', 'com'));
--字符串截取函数: substr(str, pos[, len])或者substring(str, pos[,len])
select substr("angelababy", -2); --pos是从1开始的索引,如果为负数则倒着数
select substr("angelababy", 2, 2);
-- 正则表达式替换函数: regexp_replace(str, regexp,rep)
select regexp_replace('100-200', '(\\d+)', 'num');
-- 正则表达式解析函数:regexp_extract(str,regexp[, idx]) 提取正则匹配到的指定组内容
select regexp_extract('100-200', '(\\d+)-(\\d+)', 2);
-- URL解析函数: parse_url 
select parse_url('http://www.51doit.com/path/p1.php?query=1', 'HOST');
select parse_url('http://www.51doit.com/path/p1.php?query=1', 'PATH');
select parse_url('http://www.51doit.com/path/p1.php?query=1', 'QUERY');
--分割字符串函数: split(str, regex)
select split('apache hive', '\\s+');
--json解析函数: get_json_object(json_txt, path)  
-- $ 获取对象
select get_json_object(
               '[{"name":"柳岩","sex":"女","age":"38"},{"name":"唐嫣","sex":"女","age":"18"}]', '$.[0]');
select get_json_object(
               '[{"name":"柳岩","sex":"女","age":"38"},{"name":"唐嫣","sex":"女","age":"18"}]', '$[0].name');

------------------------------------------以下自行练习------------------------------------------
-- 字符串长度函数: length(str / binary)
select length("I Love Hive");
-- 字符串反转函数: reverse
select reverse("I Love Hive");
-- 字符串连接函数:concat(stri, str2, ... strN)
-- 字符串转大写函数: upper , ucase
select upper("I Love Hive");
select ucase("I Love Hive");
-- 字符串转小写函数:lower , Lcase
select lower("I Love Hive");
select lcase("I Love Hive");
-- 去空格函数: trim去除左右两边的空格
select trim(" I Love Hive ");
-- 左边去空格函数: ltrim
select ltrim(" I Love Hive ");
-- 右边去空格函数:rtrim
select ltrim(" I Love Hive ");
-- 空格字符串函数: space(n)返回指定个数空格
select space(4);
-- 重复字符串函数:repeat(str, n)重复str字符串n
select repeat("I Love Hive", 2);
-- 首字符ascii函数: ascii
select ascii("angela");
--a对应ASCII 97
--左补足函数:lpad
select lpad('hi', 5, '*');
--右补足函数: rpad
select rpad('hi', 5, '*');
--集合查找函数:find_in_set(str ,str_array)  返回str的位置 从1开始
select find_in_set('b', 'abc,b,ab,c,def');

2 日期函数

在这里插入图片描述

-- 当前日期
select current_date();
-- 获取当前时问歌:current_timestamp
-- 同一查询中对current_timestamp 的所有调用均返回相同的值。
select current_timestamp();
-- 获取当前UNIX时间戳函数:unix_timestamp
select unix_timestamp();
-- 日期转UNIX时问戳函数: unix_timestamp
select unix_timestamp("2022-08-13 19:08:03");
-- 指定格式日期转UNIX时间戳函数: unix_timestamp
select unix_timestamp('20220813 19:08:03', 'yyyyMMdd HH:mm:ss');
--UNIX时间戳转日期函数:from_unixtime
select from_unixtime(1660417683);
select from_unixtime(0, 'yyyy-MM-dd HH:mm:ss');
--日期比较函数; datediff日期格式要求'yyyy-MN-dd HH:mm:ss ' or 'yyyy-MM-dd '
select datediff('2022-08-08', '2022-08-10');
-- 日期增加函数: date_add
select date_add('2022-08-08', 10);
--日期减少函数: date_sub
select date_sub('2012-08-08', 10);
-- 日期格式化
select date_format('2022-08-13 19:08:03','yyyy/MM/dd');
------------------------------------------以下自行练习------------------------------------------
-- 抽取日期函数:to_date
select to_date('2022-08-13 19:08:03');
-- 获取年:year
select year('2022-08-13 19:08:03');
-- 获取月:month
select month('2022-08-13 19:08:03');
-- 获取日:day
select day('2022-08-13 19:08:03');
-- 获取时:hour
select hour('2022-08-13 19:08:03');
-- 获取分:minute
select minute('2022-08-13 19:08:03');
-- 获取秒:second
select second('2022-08-13 19:08:03');
-- 获取周:weekofyear 指定年份的第多少周
select weekofyear('2022-08-13 19:08:03');

3 数学函数

在这里插入图片描述

-- 四舍五入: round返回double类型的整数值部分(四舍五入)
select round(3.1415926);
select round(3.1415926, 2);
-- 向下取整函数:floor
select floor(3.1415926);
select floor(-3.1415926);
-- 向上取整函数: ceil
select ceil(3.1415926);
select ceil(-3.1415926);
--取随机数函数: rand每次执行都不一样返回一个0到1范围内的随机数
select rand();
-- 在同一个查询中保证同一个随机数
select rand(10);

-- 二进制
select bin(100);
-- 转换进制  conv(num,现在进制,要转换的进制)
select conv(11, 10, 2);
-- 绝对值
select abs(-100);

4 集合函数

在这里插入图片描述

-- 创建map集合 map(k1,v1,k2,v2...)
select map('zhangsan', '18', 'lisi', '28');
-- 获取map所有的键
select map_keys(map('zhangsan', '18', 'lisi', '28'));
-- 获取map所有的值
select map_values(map('zhangsan', '18', 'lisi', '28'));
-- 获取map指定键的值
select map('zhangsan', '18', 'lisi', '28')['zhangsan'];
-- 获取map的长度
select size(map('zhangsan', '18', 'lisi', '28'));
-- 创建数组 array(值1,值2,值3);
select array(1, 3, 5, 6);
-- 数组取值
select array(3, 3, 5, 6)[0];
-- 数组长度
select size(array(3, 3, 5, 6));
-- 数组排序
select sort_array(`array`(13, 7, 5, 2, 1));
-- 创建结构体
select struct('liuyan', 38);
-- 取值
select struct('liuyan', 38).col2;

5 条件判断函数

在这里插入图片描述

-- if判断 类似java三元表达式  if(boolean testCondion,T valueTrue,T valueFalse)
select if(1 == 1, 'a', 'b');
-- 判断是否为空: isnull 空返回true 非空返回false
select isnull(null);
select isnull(10);
-- 判断是否非空:isnotnull  不是null返回true 是null返回false
select isnotnull(null);
select isnotnull(10);
-- nvl(T value, T defaultValue) 判断value是否为空 非空返回value, 是空返回defaultValue
select nvl("aa", "bb");
select nvl(null, "bb");
--coalesce(v1,v2,v3,v4...)返回第一个非空的值 如果都为null返回null
select coalesce(null, null, null, null);
select coalesce(null, null, 1, 2, 3, 4, null, 5, 6);
select coalesce(null, 3, 1, 2, 3, 4, null, 5, 6);
-- assert_true(条件)  条件为true 返回null 条件为false 报错
select assert_true(1 == 2);

6 脱敏加密函数

在这里插入图片描述

-- mask 将大写字母转换为X 小写字母转换为x 数字转换为n
select mask("abc123XYZ");
-- 将大写字母转换为- 小写字母转换为* 数字转换$
select mask("abc123XYZ",'-','*','$'); -- 自定义替换的字母

--对前n个进行脱敏 mask_first_n(String str, int n);
select mask_first_n("abc123XYZ",2);
--对后n个进行脱敏 mask_last_n(String str, int n);
select mask_last_n("abc123XYZ",4);
-- 除了前n个 其余脱敏处理
select mask_show_first_n("abc123XYZ",2);
-- 除了后n个 其余脱敏处理
select mask_show_last_n("abc123XYZ",4);
-- 返回基于str的哈希 非字符串 返回Null;
select mask_hash("abc");
-- 获取哈希值
select hash("abc");

--SHA-1加密
select sha1("abc");
--SHA-2家族算法加密 sha2(string/binary,int)(SHA-224,SHA-256,SHA-384,SHA-512)
select sha2("abc",256);
select sha2("abc",512);
--crc32加密
select crc32("abc");
--md5加密
select md5("abc");

7 调用Java函数

-- hive调用java方法
select java_method("java.lang.Math","max",100,200);
-- 反射调用
select reflect("java.lang.Math","min",100,200);

函数高级

1 行转列

这里的行转列,指的是多行转一列.输入多行输出一行

在这里插入图片描述
涉及的函数

concat函数  字符串拼接,不可指定分隔符 
语法 
    concat(element1,element2,element3...)
举例 
	select concat('I','Love','Hive');
特点 如果任意一个元素为null,结果为null
	select concat('I','Love','Hive',null);
	
concat_ws函数 字符串拼接,可以指定分隔符
语法 
	concat_ws(splitChar,e1,e2,e3....|array<String>);
举例
	select concat_ws('-','I','Love','Hive');
	select concat_ws('-',`array`('aa','bb','cc','dd'));
特点 任意一个元素不为null,结果就不为null
	select concat_ws('-','I','Love','Hive',null);
	
collect_list函数 用于将一列中的多行合并为一行 不进行去重
语法 
	collect_list(colName)
举例 
	select collect_list(price) from t_product;
	
collect_set函数 用于将一列中的多行合并为一行 去重
语法 
	 collect_set(colName)
举例
	select collect_list(price) from t_product;

还有聚合函数 count,sum,max,avg等等

准备数据

vi emp.tsv
name gender job
柳岩	女	班主任
唐嫣	女	讲师
金莲	女	班主任
大郎	男	讲师
小庆	男	讲师
武松	男	班主任
-- 获取如下结果,班主任    柳岩|金莲
女,讲师	 唐嫣
男,班主任	武松
男,讲师	 大郎|小庆

create table t_emp
(
    name   string,
    gender string,
    job    string
) row format delimited fields terminated by "\t";

load data local inpath '/root/emp.tsv' into table t_emp;

查询

在这里插入图片描述

-- 将gender和job合并为一列
select concat_ws(',', gender, job) as gender_job, name
from t_emp;

-- 得出结果
with t1 as (select concat_ws(',', gender, job) as gender_job, name
            from t_emp)
select t1.gender_job, concat_ws('|', collect_list(name))
from t1
group by t1.gender_job;

求每种工作每种性别各有多少人,分别有谁,获取如下结果

在这里插入图片描述

select job,
       count(*)                                    as total,
       sum(case gender when '男' then 1 else 0 end) as man,
       sum(case gender when '女' then 1 else 0 end) as woman,
       concat_ws('|', collect_list(name))          as names
from t_emp
group by job;

2 列传行

这里的列转行指的是将一行数据转换成多行,输入一行输出多行
在这里插入图片描述

涉及的函数

expload函数 用于将一个集合或者数组中的每个元素展开,将每个元素变为一行
语法 
    exploade(Map|Array)
举例 
	select explode(`array`(1,2,3,4,5));
	select explode(split('a,b,c,d',','));
	select explode(`map`('liuyan','38','tangyan','18'));

建表准备数据

 name		category
《八佰》	战争,动作,爱国,剧情
《当幸福来敲门》	剧情,励志,怀旧,心理,故事
《悬崖之上》	战争,爱国,抗日,谍战

create table t_movie
(
    name     string,
    category string
) row format delimited fields terminated by "\t";

load data local inpath '/root/movie.txt' overwrite into table t_movie;

select * from t_movie;

查询

在这里插入图片描述

-- 先来炸裂所有分类
select explode(split(category, ',')) from t_movie;

-- 但是当我们加上name时 查询时 报错
-- UDTF's are not supported outside the SELECT clause, nor nested in expressions
select name, explode(split(category, ',')) from t_movie; -- 报错

我们发现在select条件中,如果只有explode函数表达式,程序执行是没有任何问题的.但是如果在select条件中,包含explode和其他字段,就会报错. 那么如何理解这个错误?为什么在select的时候,explode的旁边不支持其他字段的同时出现?

UDTF语法限制

  • explode函数属于UDTF表生成函数,explode执行返回的结果可以理解为一张虚拟的表,其数据来源于源表;
  • 在select中只查询源表数据没有问题,只查询explode生成的虚拟表数据也没问题,但是不能在只查询源表的时候,既想返回源表字段又想返回explode生成的虚拟表字段;通俗点讲,有两张表,不能只查询一张表但是又想返回分别属于两张表的字段;

在这里插入图片描述

如何解决?

1.从SQL层面上来说上述问题的解决方案是:对两张表进行join关联查询

2.Hive专门提供了语法lateral View侧视图,专门用于搭配explode这样的UDTF函数,以满足上述需要.

-- laterval view相当于自带关联条件 t_moive和t1进行 join连接
select name, t1.categroy from t_movie lateral view explode(split(category,',')) t1 as categroy;

在这里插入图片描述

-- 向表中添加一个没有分类的电影  category为null
vi moive2.txt
<战狼> 
load data local inpath '/root/movie2.txt'  into table t_movie;

select  * from t_movie;

-- 查询时 发现战狼电影不显示
select name, t1.categroy
from t_movie lateral view explode(split(category, ',')) t1 as categroy;

-- 如果想显示 需要写 laterval view outer  使用outer 显示null值
select name, t1.categroy
from t_movie lateral view outer explode(split(category, ',')) t1 as categroy;

3 聚合增强

增强聚合的grouping_sets、cube、rollup这几个函数主要适用于OLAP多维数据分析模式中,多维分析中的指的分析问题时看待问题的维度、角度。

下面我们来准备一下数据,通过案例更好的理解函数的功能含义.

2018-03,2018-03-10,cookie1
2018-03,2018-03-10,cookie5
2018-03,2018-03-12,cookie7
2018-04,2018-04-12,cookie3
2018-04,2018-04-13,cookie2
2018-04,2018-04-13,cookie4
2018-04,2018-04-16,cookie4
2018-03,2018-03-10,cookie2
2018-03,2018-03-10,cookie3
2018-04,2018-04-12,cookie5
2018-04,2018-04-13,cookie6
2018-04,2018-04-15,cookie3
2018-04,2018-04-15,cookie2
2018-04,2018-04-16,cookie1
--表创建并且加载数据
CREATE TABLE cookie_info
(
    month    STRING,
    day      STRING,
    cookieid STRING
) ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ',';

load data local inpath '/root/cookie.txt' into table cookie_info;

select *
from cookie_info;

3.1 grouping_sets

grouping sets是一种将多个group by逻辑写在一个sql语句中的便利写法。等价于将不同维度的GROUP BY结果集进行UNION ALL。GROUPING__ID表示结果属于哪一个分组集合。

SELECT
    month,
    day,
    COUNT(DISTINCT cookieid) AS nums,
    GROUPING__ID
FROM cookie_info
GROUP BY month,day
    GROUPING SETS (month,day) --这里是关键
ORDER BY GROUPING__ID;

--等价于
SELECT month, NULL, COUNT(DISTINCT cookieid) AS nums, 1 AS GROUPING__ID
FROM cookie_info
GROUP BY month
UNION ALL
SELECT NULL as month, day, COUNT(DISTINCT cookieid) AS nums, 2 AS GROUPING__ID
FROM cookie_info
GROUP BY day;
--再比如
SELECT month,
       day,
       COUNT(DISTINCT cookieid) AS nums,
       GROUPING__ID
FROM cookie_info
GROUP BY month, day
    GROUPING SETS ( month, day, ( month, day)) --1 month   2 day    3 (month,day)
ORDER BY GROUPING__ID;

--等价于
SELECT month, NULL, COUNT(DISTINCT cookieid) AS nums, 0 AS GROUPING__ID
FROM cookie_info
GROUP BY month
UNION ALL
SELECT NULL, day, COUNT(DISTINCT cookieid) AS nums, 1 AS GROUPING__ID
FROM cookie_info
GROUP BY day
UNION ALL
SELECT month, day, COUNT(DISTINCT cookieid) AS nums, 2 AS GROUPING__ID
FROM cookie_info
GROUP BY month, day;

3.2 cube

cube表示根据GROUP BY的维度的所有组合进行聚合。

对于cube来说,如果有n个维度,则所有组合的总个数是:2^n

比如cube有a,b,c 3个维度,则所有组合情况是: (a,b,c),(a,b),(b,c),(a,c),(a),(b),©,()

SELECT
    month,
    day,
    COUNT(DISTINCT cookieid) AS nums,
    GROUPING__ID
FROM cookie_info
GROUP BY month,day
WITH CUBE
ORDER BY GROUPING__ID;

--等价于
SELECT NULL, NULL, COUNT(DISTINCT cookieid) AS nums, 0 AS GROUPING__ID
FROM cookie_info
UNION ALL
SELECT month, NULL, COUNT(DISTINCT cookieid) AS nums, 1 AS GROUPING__ID
FROM cookie_info
GROUP BY month
UNION ALL
SELECT NULL, day, COUNT(DISTINCT cookieid) AS nums, 2 AS GROUPING__ID
FROM cookie_info
GROUP BY day
UNION ALL
SELECT month, day, COUNT(DISTINCT cookieid) AS nums, 3 AS GROUPING__ID
FROM cookie_info
GROUP BY month, day;

3.3 rollup

rollup是cube的子集,以最左侧的维度为主,从该维度进行层级聚合。

比如ROLLUP有a,b,c3个维度,则所有组合情况是:(a,b,c),(a,b),(a),()

-- month和day
SELECT month,
       day,
       COUNT(DISTINCT cookieid) AS nums,
       GROUPING__ID
FROM cookie_info
GROUP BY month, day
WITH ROLLUP
ORDER BY GROUPING__ID;
-- 等价于  所有,month,month day
SELECT NULL, NULL, COUNT(DISTINCT cookieid) AS nums, 0 AS GROUPING__ID
FROM cookie_info
UNION ALL
SELECT month, NULL, COUNT(DISTINCT cookieid) AS nums, 1 AS GROUPING__ID
FROM cookie_info
GROUP BY month
UNION ALL
SELECT month, day, COUNT(DISTINCT cookieid) AS nums, 3 AS GROUPING__ID
FROM cookie_info
GROUP BY month, day;
-- day 和month
SELECT month,
       day,
       COUNT(DISTINCT cookieid) AS nums,
       GROUPING__ID
FROM cookie_info
GROUP BY day, month
WITH ROLLUP
ORDER BY GROUPING__ID;

-- 等价于  所有 ,day,day month
SELECT NULL, NULL, COUNT(DISTINCT cookieid) AS nums, 0 AS GROUPING__ID
FROM cookie_info
UNION ALL
SELECT null, day, COUNT(DISTINCT cookieid) AS nums, 1 AS GROUPING__ID
FROM cookie_info
GROUP BY day
UNION ALL
SELECT month, day, COUNT(DISTINCT cookieid) AS nums, 3 AS GROUPING__ID
FROM cookie_info
GROUP BY day, month;

4 窗口函数

窗口函数(Window functions )也叫做开窗函数、OLAP函数,其最大特点是∶输入值是从SELECT语句的结果集中的一行或多行的“窗口”中获取的。
窗口函数可以简单地解释为类似于聚合函数的计算函数,但是通过GROUP BY子句组合的常规聚合会隐藏正在聚合的各个行,最终输出一行,窗口函数聚合后还可以访问当中的各个行,并且可以将这些行中的某些属性添加到结果集中。

在这里插入图片描述

select * from stu_mark;
-- 常规分组查询 求分数和
select sname,sum(score) from stu_mark group by  sname;

在这里插入图片描述

-- 窗口函数分组
select sname,subject,score,sum(score) over (partition by sname) as total_score  from stu_mark;

在这里插入图片描述

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

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

相关文章

一图看懂 charset_normalizer 模块:字符集规范化,真正的第一个通用字符集检测器,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 charset_normalizer 模块&#xff1a;字符集规范化&#xff0c;真正的第一个通用字符集检测器&#xff0c;资料整理笔记&#xff08;大全&#xff09; &#x1f9ca;摘要&a…

AI人工智能决策树分类器的原理、优缺点、应用场景和实现方法

决策树分类器&#xff08;Decision Tree Classifier&#xff09;是一种常用的机器学习算法&#xff0c;它被广泛应用于分类和回归问题中。在人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;领域中&#xff0c;决策树分类器是一种简单而有效的算法&…

DETR3D 论文学习

1. 解决了什么问题&#xff1f; 对于低成本自动驾驶系统&#xff0c;仅凭视觉信息进行 3D 目标检测是非常有挑战性的。目前的多相机 3D 目标检测方法有两类&#xff0c;一类直接对单目图像做预测&#xff0c;没有考虑 3D 场景的结构或传感器配置。这类方法需要多步后处理&…

tcpdump 抓包和记录、tshark 过滤抓包

目录 tcpdump 一、包名 二、可用参数 tcpdump -nn tcpdump -nn -i 网卡名 —— 指定显示的网卡 tcpdump -nn -i 网卡名 port 端口名 —— 指定显示的端口 tcpdump -nn -i 网卡名 not port 端口名 —— 排除指定的端口不显示 tcpdump -nn -i …

JavaWeb15 - web 应用常用功能 -文件上传下载

1. 基本介绍 文件的上传和下载&#xff0c;是常见的功能。后面项目就使用了文件上传下载。如果是传输大文件&#xff0c;一般用专门工具或者插件文件上传下载需要使用到两个包 , 需要导入说明: 2. 文件上传 2.1 文件上传的基本原理 ● 文件上传原理示意图, 一图胜千言 …

进程调度策略

1 先进先出 FIFO 2 最短任务优先 SJF https://blog.51cto.com/u_13064014/5079546?btotalstatistic

机器学习和大数据:如何利用机器学习算法分析和预测大数据

第一章&#xff1a;引言 近年来&#xff0c;随着科技的迅速发展和数据的爆炸式增长&#xff0c;大数据已经成为我们生活中无法忽视的一部分。大数据不仅包含着海量的信息&#xff0c;而且蕴含着无数的商机和挑战。然而&#xff0c;如何从这些海量的数据中提取有价值的信息并做…

【CANN训练营0基础赢满分秘籍】昇腾AI入门课(PyTorch)

1 昇腾AI全栈架构 昇腾计算产业是基于昇腾系列处理器和基础软件构睫的全栈Al计算基础设施&#xff0e;行业应用及服务&#xff0c;包括昇腾系列处理器、Atlas系列硬件、CANN (Compute Architecture for Neural Networks&#xff0c;异构计算架构》、Al计算框架、应用使能、全流…

LeetCode_Day4 | 好有难度的一个环形链表啊(在最后)!

LeetCode_链表 24. 两两交换链表中的节点1.题目描述2.虚拟头节点法1.思路2.代码实现 3.递归法1.思路2.代码实现 19. 删除链表的倒数第n个节点1.题目描述2.思路&#xff1a;双指针法3.代码实现 面试题 02.07. 链表相交1.题目描述2.思路3.代码实现 142. 环形链表 II1. 题目描述2.…

【SNAT和DNAT的原理与应用】

目录 一、SNAT原理与应用1、SNAT概述2、SNAT的应用环境3、进行SNAT转换后的情况 二、SNAT实验三、DNAT1、DNAT策略概述2、DNAT 实验 一、SNAT原理与应用 1、SNAT概述 SNAT 应用环境&#xff1a;局域网主机共享单个公网IP地址接入Internet&#xff08;私有不能早Internet中正常…

网络知识点之-静态路由

静态路由&#xff08;英语&#xff1a;Static routing&#xff09;是一种路由的方式&#xff0c;路由项&#xff08;routing entry&#xff09;由手动配置&#xff0c;而非动态决定。与动态路由不同&#xff0c;静态路由是固定的&#xff0c;不会改变&#xff0c;即使网络状况已…

进程控制(总)

目录 进程创建 fork函数初识&#xff1a; 写时拷贝&#xff1a; fork常规用法&#xff1a; fork调用失败的原因&#xff1a; 进程终止 进程退出场景&#xff1a; 进程常见退出方法&#xff1a; _exit函数 exit函数 return退出&#xff1a; 进程等待 进程等待的必…

UE5实现模型压平效果

文章目录 1.实现目标2.实现过程2.1 实现原理2.2 蓝图实现2.3 闪面问题与压平精度3.参考资料1.实现目标 模型压平功能是GIS系统中的一个常用功能,可以用于模型的替换,数据的对比等。本文在UE5中通过修改材质的方式实现,实现模型压平的功能,包括常规建模的StaticMesh,以及C…

2023年网络安全竞赛——Windows操作系统渗透测试Server2124

任务五:Windows操作系统渗透测试 任务环境说明: 服务器场景:Server2124(关闭链接)服务器场景操作系统:Windows(版本不详)通过本地PC中渗透测试平台Kali对服务器场景Server2124进行系统服务及版本扫描渗透测试,并将该操作显示结果中1433端口对应的服务版本信息作为Fla…

【C++ 学习 ⑥】- C++ 动态内存管理详解

目录 一、new 表达式和 delete 表达式的工作机理 二、operator new 和 operator delete 函数 2.1 - 标准库定义 2.2 - 重载 三、定位 new 表达式 四、常见面试题 4.1 - malloc/free 和 new/delete 的区别 4.2 - 内存泄漏 在 C 中&#xff0c;new 和 delete 既是关键字&…

Linux系统c语言socket实现TCP通信

socket通信用到的函数 int socket( int af, int type, int protocol); af&#xff1a;一个地址描述。仅支持AF_INET格式&#xff0c;也就是说ARPA Internet地址格式。 type&#xff1a;指定socket类型。新套接口的类型描述类型&#xff0c;如TCP&#xff08;SOCK_STREAM&#…

IMX6ULL裸机篇之DDR3参数配置分析

一. DDR3L 初始化简介 上一篇博文进行了 DDR参数的初始化&#xff0c;通过一个 execl表进行配置&#xff0c;生成脚本文件。文章网址如下&#xff1a; IMX6ULL裸机篇之DDR3初始化_凌雪舞的博客-CSDN博客 本文对 DDR的参数配置进行详细的说明。即对 "Register Configur…

前端026_菜单模块_新增功能

菜单模块_新增功能 1、需求分析2、新增组件实现3、列表引用新增组件4、关闭弹出窗口5、校验表单数据6、提交表单数据6.1、Mock 添加新增模拟接口6.2、Api 调用接口6.3、测试新增功能1、需求分析 菜单管理中有两处有 新增 按钮: 条件区域的是新增一级菜单,传递的参数是0。列表…

java多线程同步技术基础

说明 当程序中出现多个进程对同一资源进行操作时&#xff0c;因为对数据的操作非常密集&#xff0c;可能会对资源过度操作&#xff0c;这时就需要用到线程的同步技术。 以一个抢红包程序为例&#xff0c;红包数量为3个&#xff0c;开启5个线程来模拟抢红包行为&#xff0c;红…

[MAUI]在.NET MAUI中复刻苹果Cover Flow

文章目录 原理3D旋转平行变换 创建3D变换控件绘制封面图片应用3D旋转应用平行变换绘制倒影创建绑定属性 创建绑定数据创建布局计算位置计算3D旋转 创建动效项目地址 Cover Flow是iTunes和Finder中的一个视图选项&#xff0c;允许用户使用水平滚动的图像查看他们的音乐库或文件。…