Flink SQL --命令行的使用(02)

1、窗口函数: 
1、创建表:
-- 创建kafka 表
CREATE TABLE bid (
    bidtime  TIMESTAMP(3),
    price  DECIMAL(10, 2) ,
    item  STRING,
    WATERMARK FOR bidtime AS bidtime
) WITH (
  'connector' = 'kafka',
  'topic' = 'bid', -- 数据的topic
  'properties.bootstrap.servers' = 'master:9092,node1:9092,node2:9092', -- broker 列表
  'properties.group.id' = 'testGroup', -- 消费者组
  'scan.startup.mode' = 'latest-offset', -- 读取数据的位置earliest-offset latest-offset
  'format' = 'csv' -- 读取数据的格式
);

kafka-console-producer.sh --broker-list master:9092,node1:9092,node2:9092 --topic bid
2020-04-15 08:05:00,4.00,C
2020-04-15 08:07:00,2.00,A
2020-04-15 08:09:00,5.00,D
2020-04-15 08:11:00,3.00,B
2020-04-15 08:13:00,1.00,E
2020-04-15 08:17:00,6.00,F
2、滚动窗口:
        1、滚动的事件时间窗口:
-- TUMBLE: 滚动窗口函数,函数的作用时在原表的基础上增加[窗口开始时间,窗口结束时间,窗口时间]
-- TABLE;表函数,将里面函数的结果转换成动态表
SELECT * FROM 
TABLE(
   TUMBLE(TABLE bid, DESCRIPTOR(bidtime), INTERVAL '10' MINUTES)
);


-- 在基于窗口函数提供的字段进行聚合计算
-- 实时统计每隔商品的总的金额,每隔10分钟统计一次
SELECT 
    item,
    window_start,
    window_end,
    sum(price) as sum_price
FROM 
TABLE(
    -- 滚动的事件时间窗口
   TUMBLE(TABLE bid, DESCRIPTOR(bidtime), INTERVAL '10' MINUTES)
)
group by item,window_start,window_end;
        2、滚动的处理时间窗口:
CREATE TABLE words (
    word  STRING,
    proctime as PROCTIME() -- 定义处理时间,PROCTIME:获取处理时间的函数
) WITH (
  'connector' = 'kafka',
  'topic' = 'words', -- 数据的topic
  'properties.bootstrap.servers' = 'master:9092,node1:9092,node2:9092', -- broker 列表
  'properties.group.id' = 'testGroup', -- 消费者组
  'scan.startup.mode' = 'latest-offset', -- 读取数据的位置earliest-offset latest-offset
  'format' = 'csv' -- 读取数据的格式
);

kafka-console-producer.sh --broker-list master:9092,node1:9092,node2:9092 --topic words
java
spark

-- 在flink SQL中处理时间和事件时间的sql语法没有区别
SELECT * FROM 
TABLE(
   TUMBLE(TABLE words, DESCRIPTOR(proctime), INTERVAL '5' SECOND)
);


SELECT 
    word,window_start,window_end,
    count(1) as c
FROM 
TABLE(
   TUMBLE(TABLE words, DESCRIPTOR(proctime), INTERVAL '5' SECOND)
)
group by 
    word,window_start,window_end
3、滑动窗口:
-- HOP: 滑动窗口函数
-- 滑动窗口一条数据可能会落到多个窗口中

SELECT * FROM 
TABLE(
   HOP(TABLE bid, DESCRIPTOR(bidtime),INTERVAL '5' MINUTES, INTERVAL '10' MINUTES)
);


-- 每隔5分钟计算最近10分钟所有商品总的金额
SELECT 
     window_start,
     window_end,
     sum(price) as sum_price
FROM 
TABLE(
   HOP(TABLE bid, DESCRIPTOR(bidtime),INTERVAL '5' MINUTES, INTERVAL '10' MINUTES)
)
group by 
    window_start,window_end
4、会话窗口:
CREATE TABLE words (
    word  STRING,
    proctime as PROCTIME() -- 定义处理时间,PROCTIME:获取处理时间的函数
) WITH (
  'connector' = 'kafka',
  'topic' = 'words', -- 数据的topic
  'properties.bootstrap.servers' = 'master:9092,node1:9092,node2:9092', -- broker 列表
  'properties.group.id' = 'testGroup', -- 消费者组
  'scan.startup.mode' = 'latest-offset', -- 读取数据的位置earliest-offset latest-offset
  'format' = 'csv' -- 读取数据的格式
);

kafka-console-producer.sh --broker-list master:9092,node1:9092,node2:9092 --topic words
java
spark

select 
    word,
    SESSION_START(proctime,INTERVAL '5' SECOND) as window_start,
    SESSION_END(proctime,INTERVAL '5' SECOND) as window_end,
    count(1) as c
from 
    words
group by 
    word,SESSION(proctime,INTERVAL '5' SECOND);
2、OVER聚合:
        1、批处理:

在Flink中的批处理的模式,over函数和hive是一致的。

SET 'execution.runtime-mode' = 'batch';
-- 有界流
CREATE TABLE students_hdfs_batch (
    sid STRING,
    name STRING,
    age INT,
    sex STRING,
    clazz STRING
)WITH (
  'connector' = 'filesystem',           -- 必选:指定连接器类型
  'path' = 'hdfs://master:9000/data/student',  -- 必选:指定路径
  'format' = 'csv'                     -- 必选:文件系统连接器指定 format
);

-- row_number,sum,count,avg,lag,lead,max,min
-- 需要注意的是sum,sum在有排序的是聚合,在没有排序的是全局聚合。
--  获取每隔班级年龄最大的前两个学生

select * 
from(
    select 
    *,
    row_number() over(partition by clazz order by age desc) as r
    from 
    students_hdfs_batch
) as a
where r <=2
        2、流处理:

flink流处理中over聚合使用限制

        1、order by 字段必须是时间字段升序排序或者使用over_number时可以增加条件过滤

        2、在流处理里面,Flink中目前只支持按照时间属性升序定义的over的窗口。因为在批处理中,数据量的大小是固定的,不会有新的数据产生,所以在做排序的时候,只需要一次排序,所以排序字段可以随便指定,但是在流处理中,数据量是源源不断的产生,当每做一次排序的时候,就需要将之前的数据都取出来存储,随着时间的推移,数据量会不断的增加,在做排序时计算量非常大。但是按照时间的顺序,时间是有顺序的,可以减少计算的代价。

        3、也可以选择top N 也可以减少计算量。

        4、在Flink中做排序时,需要考虑计算代价的问题,一般使用的排序的字段是时间字段。

SET 'execution.runtime-mode' = 'streaming'; 
-- 创建kafka 表
CREATE TABLE students_kafka (
    sid STRING,
    name STRING,
    age INT,
    sex STRING,
    clazz STRING,
    proctime as PROCTIME()
) WITH (
  'connector' = 'kafka',
  'topic' = 'students', -- 数据的topic
  'properties.bootstrap.servers' = 'master:9092,node1:9092,node2:9092', -- broker 列表
  'properties.group.id' = 'testGroup', -- 消费者组
  'scan.startup.mode' = 'earliest-offset', -- 读取数据的位置earliest-offset latest-offset
  'format' = 'csv' -- 读取数据的格式
);
-- 在流处理模式下,flink只能按照时间字段进行升序排序

-- 如果按照一个普通字段进行排序,在流处理模式下,每来一条新的数据都需重新计算之前的顺序,计算代价太大
-- 在row_number基础上增加条件,可以限制计算的代价不断增加

select * from (
select 
    *,
    row_number() over(partition by clazz order by age desc) as r
from 
    students_kafka
)
where r <= 2;


-- 在流处理模式下,flink只能按照时间字段进行升序排序
select 
*,
sum(age) over(partition by clazz order by proctime)
from 
students_kafka


-- 时间边界
-- RANGE BETWEEN INTERVAL '10' SECOND PRECEDING AND CURRENT ROW 
select 
*,
sum(age) over(
    partition by clazz
    order by proctime
    -- 统计最近10秒的数据
    RANGE BETWEEN INTERVAL '10' SECOND PRECEDING AND CURRENT ROW
)
from 
students_kafka /*+ OPTIONS('scan.startup.mode' = 'latest-offset') */;


-- 数据边界
--ROWS BETWEEN 10 PRECEDING AND CURRENT ROW
select 
*,
sum(age) over(
    partition by clazz
    order by proctime
    -- 统计最近10秒的数据
   ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
)
from 
students_kafka /*+ OPTIONS('scan.startup.mode' = 'latest-offset') */;


kafka-console-producer.sh --broker-list master:9092,node1:9092,node2:9092 --topic students

1500100003,tom,22,女,理科六班
3、Order  By:

在使用order by进行排序的时候,排序的字段中必须使用到时间字段:

-- 排序字段必须带上时间升序排序,使用到时间字段:proctime
select * from 
students_kafka
order by proctime,age;

-- 限制排序的计算代价,避免全局排序,在使用限制的时候,在做排序的时候,就只需要对限制的进行排序,减少了计算的代价。

select * 
from 
students_kafka
order by age
limit 10;
4、row_number去重
CREATE TABLE students_kafka (
    sid STRING,
    name STRING,
    age INT,
    sex STRING,
    clazz STRING,
    proctime as PROCTIME()
) WITH (
  'connector' = 'kafka',
  'topic' = 'students', -- 数据的topic
  'properties.bootstrap.servers' = 'master:9092,node1:9092,node2:9092', -- broker 列表
  'properties.group.id' = 'testGroup', -- 消费者组
  'scan.startup.mode' = 'earliest-offset', -- 读取数据的位置earliest-offset latest-offset
  'format' = 'csv' -- 读取数据的格式
);
kafka-console-producer.sh --broker-list master:9092,node1:9092,node2:9092 --topic students
1500100003,tom,22,女,理科六班

select * from (
select 
sid,name,age,
row_number() over(partition by sid order by proctime) as r
from students_kafka /*+ OPTIONS('scan.startup.mode' = 'latest-offset') */
) 
where r = 1;
5、JOIN

Regular Joins: 主要用于批处理,如果在流处理上使用,状态会越来越大

Interval Join: 主要用于双流join

Temporal Joins:用于流表关联时态表(不同时间状态不一样,比如汇率表)

Lookup Join:用于流表关联维表(不怎么变化的表)

        1、Regular Joins
                1、批处理:
CREATE TABLE students_hdfs_batch (
    sid STRING,
    name STRING,
    age INT,
    sex STRING,
    clazz STRING
)WITH (
  'connector' = 'filesystem',           -- 必选:指定连接器类型
  'path' = 'hdfs://master:9000/data/student',  -- 必选:指定路径
  'format' = 'csv'                     -- 必选:文件系统连接器指定 format
);

CREATE TABLE score_hdfs_batch (
    sid STRING,
    cid STRING,
    score INT
)WITH (
  'connector' = 'filesystem',           -- 必选:指定连接器类型
  'path' = 'hdfs://master:9000/data/score',  -- 必选:指定路径
  'format' = 'csv'                     -- 必选:文件系统连接器指定 format
);

SET 'execution.runtime-mode' = 'batch';

-- inner join
select a.sid,a.name,b.score from 
students_hdfs_batch as a
inner join
score_hdfs_batch as b
on a.sid=b.sid;

-- left join
select a.sid,a.name,b.score from 
students_hdfs_batch as a
left join
score_hdfs_batch as b
on a.sid=b.sid;

-- full join
select a.sid,a.name,b.score from 
students_hdfs_batch as a
full join
score_hdfs_batch as b
on a.sid=b.sid;
        2、流处理:

CREATE TABLE students_kafka (
    sid STRING,
    name STRING,
    age INT,
    sex STRING,
    clazz STRING
)WITH (
    'connector' = 'kafka',
    'topic' = 'students', -- 数据的topic
    'properties.bootstrap.servers' = 'master:9092,node1:9092,node2:9092', -- broker 列表
    'properties.group.id' = 'testGroup', -- 消费者组
    'scan.startup.mode' = 'latest-offset', -- 读取数据的位置earliest-offset latest-offset
    'format' = 'csv', -- 读取数据的格式
    'csv.ignore-parse-errors' = 'true' -- 如果数据解析异常自动跳过当前行
);
kafka-console-producer.sh --broker-list master:9092,node1:9092,node2:9092 --topic students
1500100001,tom,22,女,文科六班
1500100002,tom1,24,男,文科六班
1500100003,tom2,22,女,理科六班

CREATE TABLE score_kafka (
    sid STRING,
    cid STRING,
    score INT
)WITH (
    'connector' = 'kafka',
    'topic' = 'scores', -- 数据的topic
    'properties.bootstrap.servers' = 'master:9092,node1:9092,node2:9092', -- broker 列表
    'properties.group.id' = 'testGroup', -- 消费者组
    'scan.startup.mode' = 'latest-offset', -- 读取数据的位置earliest-offset latest-offset
    'format' = 'csv', -- 读取数据的格式
    'csv.ignore-parse-errors' = 'true'
);
kafka-console-producer.sh --broker-list master:9092,node1:9092,node2:9092 --topic scores
1500100001,1000001,98
1500100001,1000002,5
1500100001,1000003,137


SET 'execution.runtime-mode' = 'streaming'; 

-- 使用常规关联方式做流处理,flink会将两个表的数据一直保存在状态中,状态会越来越大
-- 可以设置状态有效期避免状态无限增大
SET 'table.exec.state.ttl' = '5000';

-- full join
select a.sid,b.sid,a.name,b.score from 
students_kafka as a
full join
score_kafka as b
on a.sid=b.sid;
注意:以为在使用流处理的join的时候,首先流处理模式中,会将两张表中的实时数据存入当状态中

假设:前提是流处理模式,需要将两张实时的表中的姓名和成绩关联在一起,此时使用到join,当过了很长一段时间假设是一年,依旧可以将学生姓名和成绩关联在一起,原因就是之前的数据都会存储在状态中,但是也会产生问题,随着时间的推移,状态中的数据会越来越多。可能会导致任务失败。

可以通过参数指定保存状态的时间,时间一过,状态就会消失,数据就不存在:

-- 使用常规关联方式做流处理,flink会将两个表的数据一直保存在状态中,状态会越来越大
-- 可以设置状态有效期避免状态无限增大
SET 'table.exec.state.ttl' = '5000';



  'csv.ignore-parse-errors' = 'true' 
-- 如果数据解析异常自动跳过当前行
2、Interval Join

两个表在join时只关联一段时间内的数据,之前的数据就不需要保存在状态中,可以避免状态无限增大

CREATE TABLE students_kafka_time (
    sid STRING,
    name STRING,
    age INT,
    sex STRING,
    clazz STRING,
    ts TIMESTAMP(3),
    WATERMARK FOR ts AS ts - INTERVAL '5' SECOND
)WITH (
    'connector' = 'kafka',
    'topic' = 'students', -- 数据的topic
    'properties.bootstrap.servers' = 'master:9092,node1:9092,node2:9092', -- broker 列表
    'properties.group.id' = 'testGroup', -- 消费者组
    'scan.startup.mode' = 'latest-offset', -- 读取数据的位置earliest-offset latest-offset
    'format' = 'csv', -- 读取数据的格式
    'csv.ignore-parse-errors' = 'true' -- 如果数据解析异常自动跳过当前行
);
kafka-console-producer.sh --broker-list master:9092,node1:9092,node2:9092 --topic students
1500100001,tom,22,女,文科六班,2023-11-10 17:10:10
1500100001,tom1,24,男,文科六班,2023-11-10 17:10:11
1500100001,tom2,22,女,理科六班,2023-11-10 17:10:12

CREATE TABLE score_kafka_time (
    sid STRING,
    cid STRING,
    score INT,
    ts TIMESTAMP(3),
    WATERMARK FOR ts AS ts - INTERVAL '5' SECOND
)WITH (
    'connector' = 'kafka',
    'topic' = 'scores', -- 数据的topic
    'properties.bootstrap.servers' = 'master:9092,node1:9092,node2:9092', -- broker 列表
    'properties.group.id' = 'testGroup', -- 消费者组
    'scan.startup.mode' = 'latest-offset', -- 读取数据的位置earliest-offset latest-offset
    'format' = 'csv', -- 读取数据的格式
    'csv.ignore-parse-errors' = 'true'
);
kafka-console-producer.sh --broker-list master:9092,node1:9092,node2:9092 --topic scores
1500100001,1000001,98,2023-11-10 17:10:09
1500100001,1000002,5,2023-11-10 17:10:11
1500100001,1000003,137,2023-11-10 17:10:12

-- a.ts BETWEEN b.ts - INTERVAL '5' SECOND AND b.ts
-- a表数据的时间需要在b表数据的时间减去5秒到b表数据时间的范围内
SELECT a.sid,b.sid,a.name,b.score
FROM students_kafka_time a, score_kafka_time b
WHERE a.sid = b.sid
AND a.ts BETWEEN b.ts - INTERVAL '5' SECOND AND b.ts
3、Temporal Joins

        1、用于流表关联时态表,比如订单表和汇率表的关联

        2、每一个时间数据都会存在不同的状态,如果只是用普通的关联,之恶能关联到最新的数

-- 订单表
CREATE TABLE orders (
    order_id    STRING, -- 订单编号
    price       DECIMAL(32,2), --订单金额
    currency    STRING, -- 汇率编号
    order_time  TIMESTAMP(3), -- 订单时间
    WATERMARK FOR order_time AS order_time -- 水位线
) WITH (
  'connector' = 'kafka',
  'topic' = 'orders', -- 数据的topic
  'properties.bootstrap.servers' = 'master:9092,node1:9092,node2:9092', -- broker 列表
  'properties.group.id' = 'testGroup', -- 消费者组
  'scan.startup.mode' = 'latest-offset', -- 读取数据的位置earliest-offset latest-offset
  'format' = 'csv' -- 读取数据的格式
);

kafka-console-producer.sh --broker-list master:9092,node1:9092,node2:9092 --topic orders
001,100,CN,2023-11-11 09:48:10
002,200,CN,2023-11-11 09:48:11
003,300,CN,2023-11-11 09:48:14
004,400,CN,2023-11-11 09:48:16
005,500,CN,2023-11-11 09:48:18

-- 汇率表
CREATE TABLE currency_rates (
    currency STRING, -- 汇率编号
    conversion_rate DECIMAL(32, 2), -- 汇率
    update_time TIMESTAMP(3),  -- 汇率更新时间
    WATERMARK FOR update_time AS update_time, -- 水位线
    PRIMARY KEY(currency) NOT ENFORCED -- 主键
) WITH (
  'connector' = 'kafka',
  'topic' = 'currency_rates', -- 数据的topic
  'properties.bootstrap.servers' = 'master:9092,node1:9092,node2:9092', -- broker 列表
  'properties.group.id' = 'testGroup', -- 消费者组
  'scan.startup.mode' = 'earliest-offset', -- 读取数据的位置earliest-offset latest-offset
  'format' = 'canal-json' -- 读取数据的格式
);

insert into currency_rates 
values
('CN',7.2,TIMESTAMP'2023-11-11 09:48:05'),
('CN',7.1,TIMESTAMP'2023-11-11 09:48:10'),
('CN',6.9,TIMESTAMP'2023-11-11 09:48:15'),
('CN',7.4,TIMESTAMP'2023-11-11 09:48:20');

kafka-console-consumer.sh --bootstrap-server  master:9092,node1:9092,node2:9092 --from-beginning --topic currency_rates

-- 如果使用常规关联方式,取的时最新的汇率,不是对应时间的汇率
select a.order_id,b.* from 
orders as a
left join
currency_rates as b
on a.currency=b.currency;


-- 时态表join
-- FOR SYSTEM_TIME AS OF orders.order_time: 使用订单表的时间到汇率表中查询对应时间的数据
SELECT 
     order_id,
     price,
     conversion_rate,
     order_time
FROM orders
LEFT JOIN currency_rates FOR SYSTEM_TIME AS OF orders.order_time
ON orders.currency = currency_rates.currency;

 4、Look Join:主要是用来关联维度表。维度表:指的是数据不怎么变化的表。

        1、传统的方式是将数据库中的数据都读取到流表中,当来一条数据就会取关联一条数据。如果数据库中学生表更新了,flink不知道,关联不到最新的数据。

        2、Look Join使用的原理:是当流表中的数据发生改变的时候,就会使用关联字段维表的数据源中查询数据。

优化:

        在使用的时候可以使用缓存,将数据进行缓存,但是随着时间的推移,缓存的数量就会越来大,此时就可以对缓存设置一个过期时间。可以在建表的时候设置参数:

 'lookup.cache.max-rows' = '1000', -- 缓存的最大行数
 'lookup.cache.ttl' = '20000' -- 缓存过期时间
-- 学生表
CREATE TABLE students_jdbc (
    id BIGINT,
    name STRING,
    age BIGINT,
    gender STRING,
    clazz STRING,
    PRIMARY KEY (id) NOT ENFORCED -- 主键
) WITH (
    'connector' = 'jdbc',
    'url' = 'jdbc:mysql://master:3306/student',
    'table-name' = 'students',
    'username' ='root',
    'password' ='123456',
    'lookup.cache.max-rows' = '1000', -- 缓存的最大行数
    'lookup.cache.ttl' = '20000' -- 缓存过期时间
);

-- 分数表
CREATE TABLE score_kafka (
    sid BIGINT,
    cid STRING,
    score INT,
    proc_time as PROCTIME()
)WITH (
    'connector' = 'kafka',
    'topic' = 'scores', -- 数据的topic
    'properties.bootstrap.servers' = 'master:9092,node1:9092,node2:9092', -- broker 列表
    'properties.group.id' = 'testGroup', -- 消费者组
    'scan.startup.mode' = 'latest-offset', -- 读取数据的位置earliest-offset latest-offset
    'format' = 'csv', -- 读取数据的格式
    'csv.ignore-parse-errors' = 'true'
);
kafka-console-producer.sh --broker-list master:9092,node1:9092,node2:9092 --topic scores
1500100001,1000001,98
1500100001,1000002,5
1500100001,1000003,137


-- 使用常规关联方式,关联维度表
-- 1、任务在启动的时候会将维表加载到flink 的状态中,如果数据库中学生表更新了,flink不知道,关联不到最新的数据
select 
b.id,b.name,a.score
from 
score_kafka as a
left join 
students_jdbc as b
on a.sid=b.id; 


-- lookup join 
-- FOR SYSTEM_TIME AS OF a.proc_time : 使用关联字段到维表中查询最新的数据
-- 优点: 流表每来一条数据都会去mysql中查询,可以关联到最新的数据
-- 每次查询mysql会降低性能
select 
b.id,b.name,a.score
from 
score_kafka as a
left join 
students_jdbc FOR SYSTEM_TIME AS OF a.proc_time  as b
on a.sid=b.id; 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

产品速递 | 璞华采云端,打造降本增效的企业采购订单协同平台

为应对快速变化的市场环境&#xff0c;企业需要建立起更加敏捷、灵活的采购体系&#xff0c;利用数字化手段提高工作效率、降低潜在风险&#xff0c;将是企业构筑新时代竞争壁垒的关键要素。 而控制采购成本对一个企业的经营业绩至关重要。采购成本下降不仅体现在企业现金流出的…

正交试验DOE

它原本是日本学者为了质量管理而设计的试验。后来被用在算法的参数设计上&#xff0c;可以利用部分的试验确定出最合理的参数组合。 举个例子&#xff0c;比如遗传算法中的种群数pop&#xff0c;交叉概率pr&#xff0c;变异概率pm&#xff0c;以及迭代次数N&#xff0c;每个参…

字符串和内存函数(1)

文章目录 目录1. 前言2. 函数介绍2.1 strlen2.2 strcpy2.3 strcat2.4 strcmp2.5 strncpy2.6 strncat2.7 strncmp2.8 strstr2.9 strtok2.10 strerror2.11 字符分类函数2.12 字符转换函数 目录 求字符串长度函数长度不受限制的字符串函数长度受限制的字符串函数字符串查找函数错…

1.0.0 IGP高级特性简要介绍(OSPF-下篇)

二、OSPF_精细的路由控制 1.OSPF数据库上限 简介 ​ OSPF技术要求同一个区域内的路由器保存着相同的LSDB信息。 ​ 但随着网络上路由数量不断增加&#xff0c;一些路由器由于系统资源有限&#xff0c;不能再承载如此多的路由信息&#xff0c;这种状态就被称为数据库超限&am…

蓝桥杯每日一题2023.11.13

题目描述 蓝桥杯大赛历届真题 - C 语言 B 组 - 蓝桥云课 (lanqiao.cn) 题目分析 由于每次吹灭的蜡烛与年龄相同故我们想到使用前缀和可以让我们求出各个区间的和&#xff0c;我们将每个区间都枚举一遍&#xff0c;如果符合要求就输出区间开始的位置&#xff08;答案&#xff…

基于GoogleNet深度学习网络的花朵类型识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1. GoogleNet网络结构 4.2. 基于GoogleNet的花朵类型识别 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .............................…

sql查询查看数据库空间使用情况

SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)", TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),990.99) || % "使…

Ansys Electronics Desktop仿真——HFSS线圈寄生电阻,电感

利用ANSYS Electronics Desktop&#xff0c;可在综合全面、易于使用的设计平台中集成严格的电磁场分析和系统电路仿真。按需求解器技术让您能集成电磁场仿真器和电路及系统级仿真&#xff0c;以探索完整的系统性能。 HFSS&#xff08;High Frequency Structure Simulator&#…

如何使用软路由R4S+iStoreOS实现远程访问内网电脑桌面

软路由R4SiStoreOS实现公网远程桌面局域网内电脑 文章目录 软路由R4SiStoreOS实现公网远程桌面局域网内电脑简介一、配置远程桌面公网地址二、家中使用永久固定地址 访问公司电脑**具体操作方法是&#xff1a;** 简介 上篇教程我们介绍了如何在iStoreOS中安装Cpolar&#xff0…

RE切入点:选择SLI,设定SLO

还是先来复习下上节课讲的“系统可用性”的两种计算方式&#xff0c;一种是从故障角度出发&#xff0c;以时长维度对系统进行稳定性评估&#xff1b;另一种是从成功请求占比角度出发&#xff0c;以请求维度对系统进行稳定性评估。同时&#xff0c;我们还讲到&#xff0c;在 SRE…

Layer 2 真的为以太坊扩容了吗?

构建一个安全、对用户友好的去中心化网络的愿景&#xff0c;依赖于关键基础设施的发展。这个愿景由一个共享的经济框架支持&#xff0c;得到了亿万人的拥护。Layer 2 的扩展解决方案在构建这一基础和增强以太坊的能力方面起着至关重要的作用。这些项目相互协作&#xff0c;形成…

cpcd 使用

cpcd 是支持多协议融合的一种解决方案&#xff0c;应用场景是一个无线模块支持大于一种协议栈&#xff0c;通过cpcd 可以分发不同协议&#xff0c;使用说明主要查看readme.md 文件说明 编译 使用cpcd 4.3.2 提示需要安装mbedtls 编译成功了 运行 关闭加密&#xff0c;通信…

STM32GPIO——上拉、下拉电阻

如上两个图所示&#xff0c;标号2都为上拉、下拉电阻部分&#xff0c;阻值约为30k~50k欧&#xff0c;通过对应开关进行控制&#xff0c;开关由寄存器控制。 当引脚外部的器件没有干扰引脚的电压时&#xff0c;即没有外部的上、下拉电压&#xff0c;引脚的电平由引脚内部上、下…

Day02_《MySQL索引与性能优化》

文章目录 一、SQL执行顺序二、索引简介1、关于索引2、索引的类型Btree 索引Btree 索引 三、Explain简介四、Explain 详解1、id2、select_type3、table4、type5、possible_keys6、key7、key_len8、ref9、rows10、Extra11、小案例 五、索引优化1、单表索引优化2、两表索引优化3、…

软件测试小妙招:postman接口测试导入导出操作详解

前言 postman中的集合脚本&#xff0c;环境变量、全局变量全部都可以导出&#xff0c;然后分享给团队成员&#xff0c;导出后的脚本可以通过newman生成测试报告。另外还可以将浏览器&#xff0c;抓包工具&#xff0c;接口文档(swagger)中的数据包导入到postman中&#xff0c;并…

3D造型渲染软件DAZ Studio mac中文版介绍

DAZ Studio mac是一款3D造型和渲染软件&#xff0c;由 Daz 3D 公司开发。它允许用户创建、编辑、动画化并渲染精美的数字图像与动画。DAZ Studio 还提供了一个虚拟的3D艺术家工作室环境&#xff0c;让用户可以轻松地设置场景、布置角色和应用材质。 用户可以通过 DAZ Studio 中…

通付盾Web3专题 | SharkTeam:Web3安全实践与创新

在Web3领域&#xff0c;安全漏洞、黑客攻击已愈发成为用户和投资者重点关注的领域。如何保障加密资产的安全&#xff0c;Web3黑暗森林中又有哪些新的攻击模式产生&#xff0c;SharkTeam将从一线进行分享和讨论。 我们先来看一下2023年1月到8月的安全事件数量和损失的数据统计。…

腾讯云3年优惠服务器在哪买?3年优惠服务器优势

腾讯云最近推出了一项非常划算的优惠活动&#xff0c;即为三年轻量应用服务器提供特价购买。这次的优惠活动包括两种配置&#xff1a;2核2G4M和2核4G5M&#xff0c;分别售价为540元和756元&#xff0c;并且可以一次性购买三年。对于需要稳定运行、性能要求较高的用户来说&#…

2011年12月21日 Go生态洞察:了解Go社区

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…