工作常用、面试必问:Hive 窗口函数汇总

在SQL中有一类函数叫做聚合函数,例如sum()、avg()、max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的。但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数。窗口函数又叫OLAP函数/分析函数,窗口函数兼具分组和排序功能。

本文分为两部分:
第一部分是Hive窗口函数详解,剖析各种窗口函数(几乎涵盖Hive所有的窗口函数);
第二部分是窗口函数实际应用,这部分总共有五个例子,都是工作常用、面试必问的非常经典的例子。

文章目录

    • Hive 窗口函数
    • 技术提升
        • 1. SUM、AVG、MIN、MAX
        • 2. ROW_NUMBER、RANK、DENSE_RANK、NTILE
        • 3. LAG、LEAD、FIRST_VALUE、LAST_VALUE
        • 4. CUME_DIST
        • 5. GROUPING SETS、GROUPING_ID、CUBE、ROLLUP
    • 窗口函数实际应用
        • 1. 第二高的薪水
        • 2. 分数排名
        • 3. 连续出现的数字
        • 4. 连续N天登录
        • 5. 给定数字的频率查询中位数

Hive 窗口函数

窗口函数最重要的关键字是 partition byorder by

具体语法如下:XXX over (partition by xxx order by xxx)

特别注意:over()里面的 partition by 和 order by 都不是必选的,over()里面可以只有partition by,也可以只有order by,也可以两个都没有,大家需根据需求灵活运用。

窗口函数我划分了几个大类,我们一类一类的讲解。

技术提升

技术要学会分享、交流,不建议闭门造车。一个人走的很快、一堆人可以走的更远。

更多实用的工作常用、面试必备资料、数据、技术交流提升, 均可加知识星球交流群获取,群友已超过2000人,添加时切记的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、添加微信号:pythoner666,备注:来自 CSDN + python
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

1. SUM、AVG、MIN、MAX

讲解这几个窗口函数前,先创建一个表,以实际例子讲解大家更容易理解。

首先创建用户访问页面表:user_pv

create table user_pv(
cookieid string,  -- 用户登录的cookie,即用户标识
createtime string, -- 日期
pv int -- 页面访问量
); 

给上面这个表加上如下数据:

cookie1,2021-05-10,1
cookie1,2021-05-11,5
cookie1,2021-05-12,7
cookie1,2021-05-13,3
cookie1,2021-05-14,2
cookie1,2021-05-15,4
cookie1,2021-05-16,4

  • SUM()使用

执行如下查询语句:

select cookieid,createtime,pv,
sum(pv) over(partition by cookieid order by createtime) as pv1 
from user_pv;

结果如下:(因命令行原因,下图字段名和值是错位的,请注意辨别!)图片

执行如下查询语句:

select cookieid,createtime,pv,
sum(pv) over(partition by cookieid ) as pv1 
from user_pv;

结果如下:图片

第一条SQL的over()里面加 order by ,第二条SQL没加order by ,结果差别很大

所以要注意了

  • over()里面加 order by 表示:分组内从起点到当前行的pv累积,如,11号的pv1=10号的pv+11号的pv, 12号=10号+11号+12号;

  • over()里面不加 order by 表示:将分组内所有值累加。

AVG,MIN,MAX,和SUM用法一样,这里就不展开讲了,但是要注意 AVG,MIN,MAX 的over()里面加不加 order by 也和SUM一样,如 AVG 求平均值,如果加上 order by,表示分组内从起点到当前行的平局值,不是全部的平局值。MIN,MAX 同理。

2. ROW_NUMBER、RANK、DENSE_RANK、NTILE

还是用上述的用户登录日志表:user_pv,里面的数据换成如下所示:

cookie1,2021-05-10,1
cookie1,2021-05-11,5
cookie1,2021-05-12,7
cookie1,2021-05-13,3
cookie1,2021-05-14,2
cookie1,2021-05-15,4
cookie1,2021-05-16,4
cookie2,2021-05-10,2
cookie2,2021-05-11,3
cookie2,2021-05-12,5
cookie2,2021-05-13,6
cookie2,2021-05-14,3
cookie2,2021-05-15,9
cookie2,2021-05-16,7

  • ROW_NUMBER()使用:

ROW_NUMBER()从1开始,按照顺序,生成分组内记录的序列。

SELECT 
cookieid,
createtime,
pv,
ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY pv desc) AS rn 
FROM user_pv;

结果如下:图片


  • RANK 和 DENSE_RANK 使用:

RANK() 生成数据项在分组中的排名,排名相等会在名次中留下空位。

DENSE_RANK()生成数据项在分组中的排名,排名相等会在名次中不会留下空位。

SELECT 
cookieid,
createtime,
pv,
RANK() OVER(PARTITION BY cookieid ORDER BY pv desc) AS rn1,
DENSE_RANK() OVER(PARTITION BY cookieid ORDER BY pv desc) AS rn2,
ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY pv DESC) AS rn3 
FROM user_pv 
WHERE cookieid = 'cookie1';

结果如下:图片


  • NTILE的使用:

有时会有这样的需求:如果数据排序后分为三部分,业务人员只关心其中的一部分,如何将这中间的三分之一数据拿出来呢?NTILE函数即可以满足。

ntile可以看成是:把有序的数据集合平均分配到指定的数量(num)个桶中, 将桶号分配给每一行。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差1。

然后可以根据桶号,选取前或后 n分之几的数据。数据会完整展示出来,只是给相应的数据打标签;具体要取几分之几的数据,需要再嵌套一层根据标签取出。

SELECT 
cookieid,
createtime,
pv,
NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime) AS rn1,
NTILE(3) OVER(PARTITION BY cookieid ORDER BY createtime) AS rn2,
NTILE(4) OVER(ORDER BY createtime) AS rn3
FROM user_pv 
ORDER BY cookieid,createtime;

结果如下:图片

3. LAG、LEAD、FIRST_VALUE、LAST_VALUE

讲解这几个窗口函数时还是以实例讲解,首先创建用户访问页面表:user_url

CREATE TABLE user_url (
cookieid string,
createtime string,  --页面访问时间
url string       --被访问页面
);

表中加入如下数据:

cookie1,2021-06-10 10:00:02,url2
cookie1,2021-06-10 10:00:00,url1
cookie1,2021-06-10 10:03:04,1url3
cookie1,2021-06-10 10:50:05,url6
cookie1,2021-06-10 11:00:00,url7
cookie1,2021-06-10 10:10:00,url4
cookie1,2021-06-10 10:50:01,url5
cookie2,2021-06-10 10:00:02,url22
cookie2,2021-06-10 10:00:00,url11
cookie2,2021-06-10 10:03:04,1url33
cookie2,2021-06-10 10:50:05,url66
cookie2,2021-06-10 11:00:00,url77
cookie2,2021-06-10 10:10:00,url44
cookie2,2021-06-10 10:50:01,url55

  • LAG的使用:

LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值。

第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)

SELECT cookieid,
createtime,
url,
ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,
LAG(createtime,1,'1970-01-01 00:00:00') OVER(PARTITION BY cookieid ORDER BY createtime) AS last_1_time,
LAG(createtime,2) OVER(PARTITION BY cookieid ORDER BY createtime) AS last_2_time 
FROM user_url;

结果如下:图片

解释:

last_1_time: 指定了往上第1行的值,default'1970-01-01 00:00:00'  cookie1第一行,往上1行为NULL,因此取默认值 1970-01-01 00:00:00cookie1第三行,往上1行值为第二行值,2021-06-10 10:00:02cookie1第六行,往上1行值为第五行值,2021-06-10 10:50:01
last_2_time: 指定了往上第2行的值,为指定默认值cookie1第一行,往上2行为NULLcookie1第二行,往上2行为NULLcookie1第四行,往上2行为第二行值,2021-06-10 10:00:02cookie1第七行,往上2行为第五行值,2021-06-10 10:50:01

  • LEAD的使用:

与LAG相反

LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值。

第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)

SELECT cookieid,
createtime,
url,
ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,
LEAD(createtime,1,'1970-01-01 00:00:00') OVER(PARTITION BY cookieid ORDER BY createtime) AS next_1_time,
LEAD(createtime,2) OVER(PARTITION BY cookieid ORDER BY createtime) AS next_2_time 
FROM user_url;

结果如下:图片


  • FIRST_VALUE的使用:

取分组内排序后,截止到当前行,第一个值。

SELECT cookieid,
createtime,
url,
ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,
FIRST_VALUE(url) OVER(PARTITION BY cookieid ORDER BY createtime) AS first1 
FROM user_url;

结果如下:图片


  • LAST_VALUE的使用:

取分组内排序后,截止到当前行,最后一个值。

SELECT cookieid,
createtime,
url,
ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,
LAST_VALUE(url) OVER(PARTITION BY cookieid ORDER BY createtime) AS last1 
FROM user_url;

结果如下:图片

如果想要取分组内排序后最后一个值,则需要变通一下:

SELECT cookieid,
createtime,
url,
ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,
LAST_VALUE(url) OVER(PARTITION BY cookieid ORDER BY createtime) AS last1,
FIRST_VALUE(url) OVER(PARTITION BY cookieid ORDER BY createtime DESC) AS last2 
FROM user_url 
ORDER BY cookieid,createtime;

注意上述SQL,使用的是 FIRST_VALUE 的倒序取出分组内排序最后一个值!

结果如下:图片

此处要特别注意order by

如果不指定ORDER BY,则进行排序混乱,会出现错误的结果

SELECT cookieid,
createtime,
url,
FIRST_VALUE(url) OVER(PARTITION BY cookieid) AS first2  
FROM user_url;

结果如下:图片

上述 url2 和 url55 的createtime即不属于最靠前的时间也不属于最靠后的时间,所以结果是混乱的。

4. CUME_DIST

先创建一张员工薪水表:staff_salary

CREATE EXTERNAL TABLE staff_salary (
dept string,
userid string,
sal int
);

表中加入如下数据:

d1,user1,1000
d1,user2,2000
d1,user3,3000
d2,user4,4000
d2,user5,5000

  • CUME_DIST的使用:

此函数的结果和order by的排序顺序有关系。

CUME_DIST:小于等于当前值的行数/分组内总行数。 order默认顺序 :正序

比如,统计小于等于当前薪水的人数,所占总人数的比例。

SELECT 
dept,
userid,
sal,
CUME_DIST() OVER(ORDER BY sal) AS rn1,
CUME_DIST() OVER(PARTITION BY dept ORDER BY sal) AS rn2 
FROM staff_salary;

结果如下:图片

解释:

rn1: 没有partition,所有数据均为1组,总行数为5,第一行:小于等于1000的行数为1,因此,1/5=0.2第三行:小于等于3000的行数为3,因此,3/5=0.6
rn2: 按照部门分组,dpet=d1的行数为3,第二行:小于等于2000的行数为2,因此,2/3=0.6666666666666666

5. GROUPING SETS、GROUPING_ID、CUBE、ROLLUP

这几个分析函数通常用于OLAP中,不能累加,而且需要根据不同维度上钻和下钻的指标统计,比如,分小时、天、月的UV数。

还是先创建一个用户访问表:user_date

CREATE TABLE user_date (
month STRING,
day STRING, 
cookieid STRING 
);

表中加入如下数据:

2021-03,2021-03-10,cookie1
2021-03,2021-03-10,cookie5
2021-03,2021-03-12,cookie7
2021-04,2021-04-12,cookie3
2021-04,2021-04-13,cookie2
2021-04,2021-04-13,cookie4
2021-04,2021-04-16,cookie4
2021-03,2021-03-10,cookie2
2021-03,2021-03-10,cookie3
2021-04,2021-04-12,cookie5
2021-04,2021-04-13,cookie6
2021-04,2021-04-15,cookie3
2021-04,2021-04-15,cookie2
2021-04,2021-04-16,cookie1

  • GROUPING SETS的使用:

grouping sets是一种将多个group by 逻辑写在一个sql语句中的便利写法。

等价于将不同维度的GROUP BY结果集进行UNION ALL。

SELECT 
month,
day,
COUNT(DISTINCT cookieid) AS uv,
GROUPING__ID 
FROM user_date 
GROUP BY month,day 
GROUPING SETS (month,day) 
ORDER BY GROUPING__ID;

注:上述SQL中的GROUPING__ID,是个关键字,表示结果属于哪一个分组集合,根据grouping sets中的分组条件month,day,1是代表month,2是代表day。

结果如下:图片

上述SQL等价于:

SELECT month,
NULL as day,
COUNT(DISTINCT cookieid) AS uv,
1 AS GROUPING__ID 
FROM user_date 
GROUP BY month UNION ALL SELECT NULL as month,
day,
COUNT(DISTINCT cookieid) AS uv,
2 AS GROUPING__ID 
FROM user_date 
GROUP BY day;

  • CUBE的使用:

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

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

结果如下:图片

上述SQL等价于:

SELECT NULL,NULL,COUNT(DISTINCT cookieid) AS uv,0 AS GROUPING__ID FROM user_dateUNION ALL SELECT month,NULL,COUNT(DISTINCT cookieid) AS uv,1 AS GROUPING__ID FROM user_date GROUP BY month UNION ALL SELECT NULL,day,COUNT(DISTINCT cookieid) AS uv,2 AS GROUPING__ID FROM user_date GROUP BY dayUNION ALL SELECT month,day,COUNT(DISTINCT cookieid) AS uv,3 AS GROUPING__ID FROM user_date GROUP BY month,day;

  • ROLLUP的使用:

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

比如,以month维度进行层级聚合:

SELECT 
month,
day,
COUNT(DISTINCT cookieid) AS uv,
GROUPING__ID  
FROM user_date 
GROUP BY month,day
WITH ROLLUP 
ORDER BY GROUPING__ID;

结果如下:图片

把month和day调换顺序,则以day维度进行层级聚合:

SELECT 
day,
month,
COUNT(DISTINCT cookieid) AS uv,
GROUPING__ID  
FROM user_date 
GROUP BY day,month 
WITH ROLLUP 
ORDER BY GROUPING__ID;

结果如下:图片

这里,根据日和月进行聚合,和根据日聚合结果一样,因为有父子关系,如果是其他维度组合的话,就会不一样。

窗口函数实际应用

1. 第二高的薪水

难度简单。

编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary)。

+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。

+---------------------+
| SecondHighestSalary |
+---------------------+
| 200                 |
+---------------------+

这道题可以用 row_number 函数解决。

参考代码:

SELECT*FROM(SELECT Salary, row_number() over(order by Salary desc) rk FROM Employee) t WHERE t.rk = 2;

更简单的代码:

SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1

OFFSET:偏移量,表示从第几条数据开始取,0代表第1条数据。

2. 分数排名

难度简单。

编写一个 SQL 查询来实现分数排名。

如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。

+----+-------+
| Id | Score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+

例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):

+-------+------+
| Score | Rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+

参考代码:

SELECT Score,
dense_rank() over(order by Score desc) as `Rank`
FROM Scores;

3. 连续出现的数字

难度中等。

编写一个 SQL 查询,查找所有至少连续出现三次的数字。

+----+-----+
| Id | Num |
+----+-----+
| 1  |  1  |
| 2  |  1  |
| 3  |  1  |
| 4  |  2  |
| 5  |  1  |
| 6  |  2  |
| 7  |  2  |
+----+-----+

例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。

+-----------------+
| ConsecutiveNums |
+-----------------+
| 1               |
+-----------------+

参考代码:

SELECT DISTINCT `Num` as ConsecutiveNums
FROM(SELECT Num,lead(Num, 1, null) over(order by id) n2,lead(Num, 2, null) over(order by id) n3 FROM Logs) t1
WHERE Num = n2 and Num = n3

4. 连续N天登录

难度困难。

写一个 SQL 查询, 找到活跃用户的 id 和 name,活跃用户是指那些至少连续 5 天登录账户的用户,返回的结果表按照 id 排序。

表 Accounts:

+----+-----------+
| id | name      |
+----+-----------+
| 1  | Winston   |
| 7  | Jonathan  |
+----+-----------+

表 Logins:

+----+-------------+
| id | login_date  |
+----+-------------+
| 7  | 2020-05-30  |
| 1  | 2020-05-30  |
| 7  | 2020-05-31  |
| 7  | 2020-06-01  |
| 7  | 2020-06-02  |
| 7  | 2020-06-02  |
| 7  | 2020-06-03  |
| 1  | 2020-06-07  |
| 7  | 2020-06-10  |
+----+-------------+

例如,给定上面的Accounts和Logins表,至少连续 5 天登录账户的是id=7的用户

+----+-----------+
| id | name      |
+----+-----------+
| 7  | Jonathan  |
+----+-----------+

思路:

  1. 去重:由于每个人可能一天可能不止登陆一次,需要去重

  2. 排序:对每个ID的登录日期排序

  3. 差值:计算登录日期与排序之间的差值,找到连续登陆的记录

  4. 连续登录天数计算:select id, count(*) group by id, 差值(伪代码)

  5. 取出登录5天以上的记录

  6. 通过表合并,取出id对应用户名

参考代码:

SELECT DISTINCT b.id, name
FROM(SELECT id, login_date,DATE_SUB(login_date, ROW_NUMBER() OVER(PARTITION BY id ORDER BY login_date)) AS diff FROM(SELECT DISTINCT id, login_date FROM Logins) a) b
INNER JOIN Accounts ac
ON b.id = ac.id
GROUP BY b.id, diff
HAVING COUNT(b.id) >= 5

注意点:

  1. DATE_SUB的应用:DATE_SUB (DATE, X),注意,X为正数表示当前日期的前X天;

  2. 如何找连续日期:通过排序与登录日期之间的差值,因为排序连续,因此若登录日期连续,则差值一致;

  3. GROUP BY和HAVING的应用:通过id和差值的GROUP BY,用COUNT找到连续天数大于5天的id,注意COUNT不是一定要出现在SELECT后,可以直接用在HAVING中

5. 给定数字的频率查询中位数

难度困难。

Numbers 表保存数字的值及其频率。

+----------+-------------+
|  Number  |  Frequency  |
+----------+-------------|
|  0       |  7          |
|  1       |  1          |
|  2       |  3          |
|  3       |  1          |
+----------+-------------+

在此表中,数字为 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 3,所以中位数是 (0 + 0) / 2 = 0。

+--------+
| median |
+--------|
| 0.0000 |
+--------+

请编写一个查询来查找所有数字的中位数并将结果命名为 median 。

参考代码:

select
avg(cast(number as float)) as median
from(select Number,Frequency,sum(Frequency) over(order by Number) - Frequency as prev_sum,sum(Frequency) over(order by Number) as curr_sum from Numbers) t1, (select sum(Frequency) as total_sum from Numbers) t2
where
t1.prev_sum <= (cast(t2.total_sum as float) / 2) 
and
t1.curr_sum >= (cast(t2.total_sum as float) / 2)

查看全文

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

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

相关文章:

图片

工作常用、面试必问:Hive 窗口函数汇总

在SQL中有一类函数叫做聚合函数,例如sum()、avg()、max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的。但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这……

【fluent UDF】并行模式下对单元和面的循环遍历:begin_c_loop、begin_c_loop_all的区别

Reference
小木虫论坛-奔跑鱼为避免原网页失效,此处将重点截图。 胡坤老师-流沙CAE-CFD之道-Fluent 并行UDF丨04 数据遍历宏
本文不详细讲解并行模式下:
1、网格单元的三种类型(内部单元和外部单元,外部单元又分为规则和扩展&……

Winform控件开发(27)——Label(史上最全)

前言:
Label一般用于显示文本或者作为"按钮使用",当作为显示文本使用时,通过设置label的Text属性实现,当作为“按钮使用时”,在label的单击事件下注册事件即可,下面详细介绍label的属性以及事件:
一、属性
1、Name 属性
该属性代表label类对象的名称,通过……

倾斜实景三维建模与BIM模型处理技术

倾斜实景三维建模与BIM模型处理技术
一、研究背景 ➢ 倾斜模型 ✓ 真实纹理,高分辨率 ✓ 真实坐标,高空间精度 ✓ 快速建模,低建模成本 ➢ BIM设计 BIM 技术作为建筑施工行业中的新技术,存在于建筑的全生命周期,服务……

代码随想录算法训练营第四十三天| 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零。

1049. 最后一块石头的重量 II
题目链接:力扣
题目要求: 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和……

ChatGPT写python代码实录

ChatGPT写python代码实录
print(hello world) 众所周知,咱们程序员学习编程是为了世界好。
所以,咱们就从hello world开始。 然后是一个杨辉三角 def generate_triangle(n):triangle []
​for i in range(n):row [1] * (i 1)for j in range(1, i):r……

OBCP第八章 OB运维、监控与异常处理-日志查询

日志概述
OceanBase数据库在运行过程中会自动生成日志;通过查看和分析日志,可以了解OceanBase数据库的启动和运行状态
日志名称日志路径说明启动和运行日志(observer.log)OBServer 服务器的 ~/appname/log 目录下OceanBase 数据……

UVM New() 函数

1. UVM 中的new()函数实际上是为数据或者句柄指定一个新的地址空间,简单理解就是新建一个地址空间,类似新建一个文件
2.需要使用新建的时候才可以使用new(),直接引用不需要使用new()函数
3.在refm会用到output_item,这个output_……

m_sequencer​与p_sequencer

1. uvm_sequence 属于UVM object ,uvm_sequencer 属于UVM complent, 但是sequence 需要与sequencer通信实现数据传输,因此需要中间媒介。m_sequencer 就是这一媒介,主要目的就是确保sequencer 和 sequence(m_sequencer是uvm_seque……

Python-类方法、静态方法

前言
Python中的类方法和静态方法是面向对象编程中常用的两种方法类型,它们的作用是为类的实例或类本身提供特定的功能。在本文中,我们将深入探讨这两种方法,包括其定义、区别、用法及使用场景
类方法
类方法是定义在类上的方法&#xff0……

ListView TableView ScrollView三者之Tableview

注意点:
1、其中的listView和Tableview都是继承自Scrollview
2、本文主要讲解的是tableview
3、代码部分引用的是在公司中做的产品
4、以上代码可以修改的地方:将cell改为继承自TableviewCell,这样可以直接创建cell。
5、代码中使用了函数的绑定和函……

c++中的std::shared_ptr和std::weak_ptr

std::share类型在c11提出,其意义:使用shared_ptr解决的主要问题是知道删除一个被多个对象共享的资源的正确时机,在本项目中所有的数据类均是使用智能指针来存储,就是为了解决这个问题。
一、std::shared_ptr采用的是引用计数来管……

std::pair的使用

待续。。。。。。…

cocos2d-x安卓启动页的背景图路径

启动页和icon的资源路径:工程名/proj.android/res/drawable/…

c++中的虚函数详解

//废话少说直接上代码,用一个测试来阐述虚函数:
#include<iostream> #include<stdlib.h>usingnamespace std;//有虚函数的类 class A{public:A();~A();virtual void f(){cout<<"this is A f()"<<endl;}virtual void ……

Flink Stream 处理数据倾斜

数据倾斜的场景
在数据源发生的数据倾斜。例如,Kafka 的分区,有的分区数据量特别的少,有的特别的多,这样在消费数据后,各个 subtask 拿到的数据量就有了差异。在 keyBy 之后,产生的数据倾斜。例如&#xf……

cocos2d-x中的触摸事件详解

屏蔽相关节点的方法。
注意吞噬触摸时候需要进行在ontouchbegan 中需要设置ture。
链接地址:
http://www.68idc.cn/help/buildlang/ask/20150309260641.html…

编程注意的问题

一、改Bug注意的问题 1、复现bug,明白功能或者是错误的现象 2、代码中打断点,确定Bug的位置,接着是确定bug的具体的原因。 3、理清楚Bug的关键点,提出解决方案,这里需要强调一下,一种方案不行,切……

c++文件的相互包含问题

A B两个c文件,A.cpp包含了B.h;B.h包含了A.h;两者不算是相互包含。…

std::string类的常用操作

整理c中std::string类的常用的操作,在此记下,以供以后查阅
1、从含有正整数的字符串中提取正整数字符串,原理:根据ASCII码值来判定
具体的代码如下:
#include <iostream>
#include <string>
usingn……

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注