流批一体计算引擎-9-[Flink]中的数量窗与时间窗

1 数量窗

1.1 数量滚动窗口

0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows)

1.1.1 代码分析

Tumbling Count Windows是指按元素个数计数的滚动窗口。
滚动窗口是指没有元素重叠的窗口。
(1)构造了一个KeyedStream,用于存储word_count_data中的数据。

word_count_data = [("A",), ("A", ), ("B", ), ("A",)]
def word_count():env = StreamExecutionEnvironment.get_execution_environment()env.set_runtime_mode(RuntimeExecutionMode.STREAMING)env.set_parallelism(1)  # 将所有数据写到一个文件source_type_info = Types.TUPLE([Types.STRING()])# 从列表生成source,指定列表中每个元素的类型source = env.from_collection(word_count_data, source_type_info)# 按键分组keyed_stream = source.key_by(lambda i: i[0])

我们并没有让Source是流的形式,是因为为了降低例子复杂度。但是我们将runntime mode设置为流(STREAMING)模式。

(2)定义一个Reduce类,用于对元组中的数据进行计算。
这个类需要继承于WindowFunction,并实现相应方法(本例中是apply)。
apply会计算一个相同key的元素个数。

class SumWindowFunction(WindowFunction[tuple, tuple, str, CountWindow]):def apply(self, key: str, window: CountWindow, inputs: Iterable[tuple]):print(inputs, window)return [(key, len(inputs))]

(3)keyed_stream.count_window(2)将此keyyedstream窗口转换为滚动计数窗口或滑动计数窗口。

out_type_info = Types.TUPLE([Types.STRING(), Types.INT()])reduced = (keyed_stream.count_window(2).apply(SumWindowFunction(), out_type_info))

1.1.2 整体代码

from typing import Iterable
from pyflink.common import Types
from pyflink.datastream import StreamExecutionEnvironment, RuntimeExecutionMode, WindowFunction
from pyflink.datastream.window import CountWindowclass SumWindowFunction(WindowFunction[tuple, tuple, str, CountWindow]):def apply(self, key: str, window: CountWindow, inputs: Iterable[tuple]):print(inputs, window)return [(key, len(inputs))]word_count_data = [("A",), ("A", ), ("B", ), ("A",)]
def word_count():env = StreamExecutionEnvironment.get_execution_environment()env.set_runtime_mode(RuntimeExecutionMode.STREAMING)env.set_parallelism(1)  # 将所有数据写到一个文件source_type_info = Types.TUPLE([Types.STRING()])# 从列表生成source,指定列表中每个元素的类型source = env.from_collection(word_count_data, source_type_info)# 按键分组keyed_stream = source.key_by(lambda i: i[0])# reducingout_type_info = Types.TUPLE([Types.STRING(), Types.INT()])reduced = (keyed_stream.count_window(4).apply(SumWindowFunction(), out_type_info))# # define the sinkreduced.print()# submit for executionenv.execute()if __name__ == '__main__':word_count()

1.1.3 结果

(1)window=1,
A的个数是3,被3个窗口承载
B的个数是1,被1个窗口承载
在这里插入图片描述

(2)window=2
A的个数是3,但是会产生两个窗口,第一个窗口承载了前两个元素,第二个窗口当前只有一个元素。于是第一个窗口进行了Reduce计算,得出一个(A,2);第二个窗口还没进行reduce计算,就没有展现出结果;
B的个数是1,被1个窗口承载,只有一个元素,还没进行reduce计算,没有展示结果。
在这里插入图片描述
(3)window=3
A的个数是3,被1个窗口承载,有3个元素;
B的个数是1,被1个窗口承载,只有一个元素,还没进行reduce计算,没有展示结果。
在这里插入图片描述
(4)window=4
A的个数是3,被1个窗口承载,只有3个元素,还没进行reduce计算,没有展示结果。
B的个数是1,被1个窗口承载,只有1个元素,还没进行reduce计算,没有展示结果。
输出空

1.2 数量滑动窗口

0基础学习PyFlink——个数滑动窗口(Sliding Count Windows)

1.2.1 整体代码

“滑动”是指这个窗口沿着一定的方向,按着一定的速度“滑行”。
滚动窗口,则是一个个“衔接着”,而不是像上面那样交错着。
它们的相同之处就是:只有窗口内的事件数量到达窗口要求的数值时,这些窗口才会触发计算。

from typing import Iterable
from pyflink.common import Types
from pyflink.datastream import StreamExecutionEnvironment, RuntimeExecutionMode, WindowFunction
from pyflink.datastream.window import CountWindowclass SumWindowFunction(WindowFunction[tuple, tuple, str, CountWindow]):def apply(self, key: str, window: CountWindow, inputs: Iterable[tuple]):print(inputs, window)return [(key, len(inputs))]word_count_data = [("A",), ("A", ), ("B", ), ("A",)]
def word_count():env = StreamExecutionEnvironment.get_execution_environment()env.set_runtime_mode(RuntimeExecutionMode.STREAMING)env.set_parallelism(1)  # 将所有数据写到一个文件source_type_info = Types.TUPLE([Types.STRING()])# 从列表生成source,指定列表中每个元素的类型source = env.from_collection(word_count_data, source_type_info)# 按键分组keyed_stream = source.key_by(lambda i: i[0])# reducingout_type_info = Types.TUPLE([Types.STRING(), Types.INT()])reduced = (keyed_stream.count_window(2,1).apply(SumWindowFunction(), out_type_info))# # define the sinkreduced.print()# submit for executionenv.execute()if __name__ == '__main__':word_count()

1.2.2 结果

(1)window=1,slide=1
在这里插入图片描述

(2)window=2,slide=1
在这里插入图片描述
(3)window=1,slide=2
在这里插入图片描述

2 时间窗

2.1 时间滚动窗口(处理时间)

参考0基础学习PyFlink——时间滚动窗口(Tumbling Time Windows)
对于数量滚动窗口,如果窗口内元素数量没有达到窗口大小时,计算个数的函数是不会被调用的。
如果想让不满足数量的窗口,也执行计算,就可以使用时间滚动窗口。
它不依赖于窗口中元素的个数,而是窗口的时间,即窗口时间到了,计算就会进行。

2.1.1 代码分析

(1)构造了一个KeyedStream,用于存储word_count_data中的数据。

word_count_data = [("A",), ("A", ), ("B", ), ("A",), ("A", ), ("B", ), ("A",)]
def word_count():env = StreamExecutionEnvironment.get_execution_environment()env.set_runtime_mode(RuntimeExecutionMode.STREAMING)env.set_parallelism(1)  # 将所有数据写到一个文件source_type_info = Types.TUPLE([Types.STRING()])# 从列表生成source,指定列表中每个元素的类型source = env.from_collection(word_count_data, source_type_info)# 按键分组keyed_stream = source.key_by(lambda i: i[0])

我们并没有让Source是流的形式,是因为为了降低例子复杂度。但是我们将runntime mode设置为流(STREAMING)模式。

(2)定义一个Reduce类,用于对元组中的数据进行计算。
这个类需要继承于WindowFunction,并实现相应方法(本例中是apply)。
apply会计算一个相同key的元素个数。

class SumWindowFunction(WindowFunction[tuple, tuple, str, TimeWindow]):def apply(self, key: str, window: TimeWindow, inputs: Iterable[tuple]):print(inputs, window)return [(key, len(inputs))]

(3)这儿我们的Window使用的是滚动时间窗口(处理时间),其中参数Time.milliseconds(2)是指窗口时长,即2毫秒一个窗口。

 # reducingout_type_info = Types.TUPLE([Types.STRING(), Types.INT()])reduced = (keyed_stream\.window(TumblingProcessingTimeWindows.of(Time.milliseconds(2)))\.apply(SumWindowFunction(), out_type_info))# define the sinkreduced.print()# submit for executionenv.execute()

2.1.2 整体代码

from typing import Iterable
from pyflink.common import Types, Time
from pyflink.datastream import StreamExecutionEnvironment, RuntimeExecutionMode, WindowFunction
from pyflink.datastream.window import TimeWindow, TumblingProcessingTimeWindowsclass SumWindowFunction(WindowFunction[tuple, tuple, str, TimeWindow]):def apply(self, key: str, window: TimeWindow, inputs: Iterable[tuple]):print(inputs, window)return [(key, len(inputs))]word_count_data = [("A",), ("A", ), ("B", ), ("A",), ("A", ), ("B", ), ("A",)]def word_count():env = StreamExecutionEnvironment.get_execution_environment()env.set_runtime_mode(RuntimeExecutionMode.STREAMING)env.set_parallelism(1)  # 将所有数据写到一个文件source_type_info = Types.TUPLE([Types.STRING()])# 从列表生成source,指定列表中每个元素的类型source = env.from_collection(word_count_data, source_type_info)# 按键分组keyed_stream = source.key_by(lambda i: i[0])# reducingout_type_info = Types.TUPLE([Types.STRING(), Types.INT()])reduced = (keyed_stream\.window(TumblingProcessingTimeWindows.of(Time.milliseconds(2)))\.apply(SumWindowFunction(), out_type_info))# define the sinkreduced.print()# submit for executionenv.execute()if __name__ == '__main__':word_count()

2.1.3 结果

运行多次代码可以得到不同的结果。
可以发现结果并不稳定。但是可以发现,每个元素都参与了计算,而不像数量滚动窗口那样部分数据没有被触发计算。
这是因为每次运行时,CPU等系统资源的繁忙程度是不一样的,这就影响了最后的运行结果。
(1)第一次运行
在这里插入图片描述
(2)第二次运行
在这里插入图片描述
(3)第三次运行
在这里插入图片描述

2.2 时间滑动窗口(处理时间)

0基础学习PyFlink——时间滑动窗口(Sliding Time Windows)

2.2.1 整体代码

from typing import Iterable
from pyflink.common import Types, Time
from pyflink.datastream import StreamExecutionEnvironment, RuntimeExecutionMode, WindowFunction
from pyflink.datastream.window import TimeWindow, SlidingProcessingTimeWindowsclass SumWindowFunction(WindowFunction[tuple, tuple, str, TimeWindow]):def apply(self, key: str, window: TimeWindow, inputs: Iterable[tuple]):print(inputs, window)return [(key, len(inputs))]word_count_data = [("A",), ("A", ), ("B", ), ("A",), ("A", ), ("B", ), ("A",)]def word_count():env = StreamExecutionEnvironment.get_execution_environment()env.set_runtime_mode(RuntimeExecutionMode.STREAMING)env.set_parallelism(1)  # 将所有数据写到一个文件source_type_info = Types.TUPLE([Types.STRING()])# 从列表生成source,指定列表中每个元素的类型source = env.from_collection(word_count_data, source_type_info)# 按键分组keyed_stream = source.key_by(lambda i: i[0])# reducingout_type_info = Types.TUPLE([Types.STRING(), Types.INT()])reduced = (keyed_stream\.window(SlidingProcessingTimeWindows.of(Time.milliseconds(2),Time.milliseconds(1)))\.apply(SumWindowFunction(), out_type_info))# define the sinkreduced.print()# submit for executionenv.execute()if __name__ == '__main__':word_count()

2.2.2 结果

运行两次上述代码,我们发现每次都不同,而且有重叠计算的元素。
(1)第一次运行
A:9,B:3
在这里插入图片描述
(2)第二次运行
A:7,B:3
在这里插入图片描述

4.3 时间滚动窗口(事件时间)

0基础学习PyFlink——事件时间和运行时间的窗口
使用的是运行时间(Tumbling ProcessingTimeWindows)作为窗口的参考时间,得到的结果是不稳定的。
这是因为每次运行时,CPU等系统资源的繁忙程度是不一样的,这就影响了最后的运行结果。
为了让结果稳定,我们可以不依赖运行时间(ProcessingTime),而使用不依赖于运行环境,只依赖于数据的事件时间(EventTime)。

一般,我们需要大数据处理的数据,往往存在一个字段用于标志该条数据的“顺序”。
这个信息可以是单调递增的ID,也可以是不唯一的时间戳,我们可以将这类信息看做事件发生的时间。

那如何让输入的数据中的“事件时间”参与到窗口时长的计算中呢?这儿就要引入时间戳和Watermark(水位线)的概念
假如我们把数据看成一张纸上的内容,水位线则是这张纸的背景。它并不影响纸上内容的表达,只是系统要用它来做更多的事情。
将数据中表达“顺序”的数据转换成时间戳,我们可以使用水位线单调递增时间戳分配器

2.3.1 代码分析

(1)构造了一个Stream,用于存储word_count_data中的数据。

word_count_data = [("A","2024-06-04 08:10:11.100"),("A", "2024-06-04 08:10:11.101"),("B", "2024-06-04 08:10:11.102"),("A","2024-06-04 08:10:11.103")]
def word_count():env = StreamExecutionEnvironment.get_execution_environment()env.set_runtime_mode(RuntimeExecutionMode.STREAMING)env.set_parallelism(1)  # 将所有数据写到一个文件source_type_info = Types.TUPLE([Types.STRING(),Types.STRING()])source = env.from_collection(word_count_data, source_type_info)

(2)定制策略

class ElementTimestampAssigner(TimestampAssigner):def extract_timestamp(self, value, record_timestamp)-> int:time_str = value[1]dt = datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S.%f")ts_s = dt.timestamp()  # 时间戳,单位秒ts_ms = int(ts_s * 1000)  # 时间戳,单位毫秒return ts_ms
# 定义水位线策略
watermark_strategy = WatermarkStrategy.for_monotonous_timestamps() \.with_timestamp_assigner(ElementTimestampAssigner())

for_monotonous_timestamps会分配一个水位线单调递增时间戳分配器,然后使用with_timestamp_assigner告知输入数据中“顺序”字段的值。这样系统就会根据这个字段的值生成一个单调递增的时间戳。这个时间戳相对顺序就和输入数据一样,是稳定的。
(3)运行策略
然后对原始数据使用该策略,这样source_with_wartermarks中的数据就包含了时间戳。

# 对原始数据使用该策略
source_with_wartermarks = source.assign_timestamps_and_watermarks(watermark_strategy)

(4)使用TumblingEventTimeWindows,即事件时间(EventTime)窗口,而不是运行时间(ProcessingTime)窗口。

# reducing
out_type_info = Types.TUPLE([Types.STRING(), Types.INT()])
reduced = (source_with_wartermarks.key_by(lambda i: i[0])\.window(TumblingEventTimeWindows.of(Time.milliseconds(2)))\.apply(SumWindowFunction(), out_type_info))# # define the sink
reduced.print()# submit for execution
env.execute()

2.3.2 整体代码

from typing import Iterable
from pyflink.common import Types, Time, WatermarkStrategy
from pyflink.common.watermark_strategy import TimestampAssigner
from pyflink.datastream import StreamExecutionEnvironment, RuntimeExecutionMode, WindowFunction
from pyflink.datastream.window import TimeWindow,  TumblingEventTimeWindows
import datetimeclass SumWindowFunction(WindowFunction[tuple, tuple, str, TimeWindow]):def apply(self, key: str, window: TimeWindow, inputs: Iterable[tuple]):print(inputs, window)return [(key, len(inputs))]class ElementTimestampAssigner(TimestampAssigner):def extract_timestamp(self, value, record_timestamp)-> int:time_str = value[1]dt = datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S.%f")ts_s = dt.timestamp()  # 时间戳,单位秒ts_ms = int(ts_s * 1000)  # 时间戳,单位毫秒return ts_msword_count_data = [("A","2024-06-04 08:10:11.100"),("A", "2024-06-04 08:10:11.110"),("B", "2024-06-04 08:10:11.102"),("A","2024-06-04 08:10:11.103")]
def word_count():env = StreamExecutionEnvironment.get_execution_environment()env.set_runtime_mode(RuntimeExecutionMode.STREAMING)env.set_parallelism(1)  # 将所有数据写到一个文件source_type_info = Types.TUPLE([Types.STRING(),Types.STRING()])source = env.from_collection(word_count_data, source_type_info)# 定义水位线策略watermark_strategy = WatermarkStrategy.for_monotonous_timestamps() \.with_timestamp_assigner(ElementTimestampAssigner())# 对原始数据使用该策略source_with_wartermarks = source.assign_timestamps_and_watermarks(watermark_strategy)# reducingout_type_info = Types.TUPLE([Types.STRING(), Types.INT()])reduced = (source_with_wartermarks.key_by(lambda i: i[0])\.window(TumblingEventTimeWindows.of(Time.milliseconds(2)))\.apply(SumWindowFunction(), out_type_info))# # define the sinkreduced.print()# submit for executionenv.execute()if __name__ == '__main__':word_count()

2.3.3 结果

数据乱序也没关系,会自动排序。
在这里插入图片描述

在这里插入图片描述

2.4 时间滑动窗口(事件时间)

2.4.1 整体代码

from typing import Iterable
from pyflink.common import Types, Time, WatermarkStrategy
from pyflink.common.watermark_strategy import TimestampAssigner
from pyflink.datastream import StreamExecutionEnvironment, RuntimeExecutionMode, WindowFunction
from pyflink.datastream.window import TimeWindow,  SlidingEventTimeWindows
import datetimeclass SumWindowFunction(WindowFunction[tuple, tuple, str, TimeWindow]):def apply(self, key: str, window: TimeWindow, inputs: Iterable[tuple]):print(inputs, window)return [(key, len(inputs))]class ElementTimestampAssigner(TimestampAssigner):def extract_timestamp(self, value, record_timestamp)-> int:time_str = value[1]dt = datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S.%f")ts_s = dt.timestamp()  # 时间戳,单位秒ts_ms = int(ts_s * 1000)  # 时间戳,单位毫秒return ts_msword_count_data = [("A","2024-06-04 08:10:11.100"),("A", "2024-06-04 08:10:11.110"),("B", "2024-06-04 08:10:11.102"),("A","2024-06-04 08:10:11.103")]
def word_count():env = StreamExecutionEnvironment.get_execution_environment()env.set_runtime_mode(RuntimeExecutionMode.STREAMING)env.set_parallelism(1)  # 将所有数据写到一个文件source_type_info = Types.TUPLE([Types.STRING(),Types.STRING()])source = env.from_collection(word_count_data, source_type_info)# 定义水位线策略watermark_strategy = WatermarkStrategy.for_monotonous_timestamps() \.with_timestamp_assigner(ElementTimestampAssigner())# 对原始数据使用该策略source_with_wartermarks = source.assign_timestamps_and_watermarks(watermark_strategy)# reducingout_type_info = Types.TUPLE([Types.STRING(), Types.INT()])reduced = (source_with_wartermarks.key_by(lambda i: i[0])\.window(SlidingEventTimeWindows.of(Time.milliseconds(4),Time.milliseconds(2)))\.apply(SumWindowFunction(), out_type_info))# # define the sinkreduced.print()# submit for executionenv.execute()if __name__ == '__main__':word_count()

2.4.2 结果

在这里插入图片描述

3 pyflink中文乱码的问题

pyflink遇到的问题

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

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

相关文章

铸铁机械5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

铸铁机械5G智能工厂工业物联数字孪生平台,推进制造业数字化转型。工业物联数字孪生平台以5G技术为基础,通过工业物联网连接铸铁机械生产过程中的各个环节,运用数字孪生技术构建虚拟工厂,实现生产过程的实时监测、模拟与优化&#…

【因果推断python】28_面板数据和固定效应2

目录 固定效应 固定效应 为了方面后面更正式地讲述,让我们首先看一下我们拥有的数据。按照我们的例子,我们将尝试估计婚姻对收入的影响。我们的数据包含多年以来多个个体 (nr) 的这两个变量,married 和lwage。请注意,工资采用对数…

java之IO流和集合框架的笔记

1 File类的使用 1.1 概述 File类及本章下的各种流,都定义在java.io包下。 一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录(俗称文件夹),与平台无关。(体会万事万物皆对象) File 能新建、删…

10_Transformer预热---注意力机制(Attention)

1.1 什么是注意力机制(attention) 注意力机制(Attention Mechanism)是一种在神经网络中用于增强模型处理特定输入特征的能力的技术。它最早被应用于自然语言处理(NLP)任务中,特别是在机器翻译中,如Google的…

Shell脚本和变量

文章目录 Shell脚本shell的解释器Shell的作用Shell脚本的构成Shell的执行方式 重定向操作变量变量的类型:变量名的规范变量值的规范整数运算 + - / %小数运算 小数运算 Shell脚本 脚本就是可运行的代码的集合,脚本语言&#xff…

hadoop_概念

前言: 本篇文章仅用于个人学习笔记,仅限于参考,内容如有侵权,请联系删除,谢谢! 一:大数据简介 大数据概念 : 指无法在一定时间范围内用常规软件工具进行捕管理和处理的数据集合,…

30岁迷茫?AI赛道,人生新起点

前言 30岁,对于许多人来说,是一个人生的分水岭。在这个年纪,有些人可能已经在某个领域取得了不小的成就,而有些人则可能开始对未来的职业方向感到迷茫。如果你正处于这个阶段,那么你可能会问自己:30岁转行…

lubuntu / ubuntu 配置静态ip

一、查看原始网络配置信息 1、获取网卡名称 ifconfig 2、查询网关IP route -n 二、编辑配置文件 去/etc/netplan目录找到配置文件,配置文件名一般为01-network-manager-all.yaml sudo vim /etc/netplan/01-network-manager-all.yaml文件打开后内容如下 # This …

美团强势领涨恒指,港股即将迎来触底反弹?

恒指早间低开低走,持续低位徘徊,一度试探万八关口,最低见17994点,市场情绪表现疲弱,大型科技股普遍走低,但主要指数午后回升,恒生科技指数率先转涨,美团(3690.HK)涨超4%领涨成分股&a…

网络数据库后端相关面试题(其三)

18, 传输控制协议tcp和用户数据报协议udp有哪些区别 第一,tcp是面向字节流的,基本的传输单位是tcp报文段;而udp是面向报文的,基本传输单位是用户数据报。 第二, tcp注重安全可靠性,连接双方在…

1997-2022年各省农村居民人均可支配收入数据(无缺失)

1997-2022年各省农村居民人均可支配收入数据(无缺失) 1、时间:1997-2022年 2、来源:国家统计局、统计年鉴 3、范围:31省 4、指标:农村居民人均可支配收入 5、缺失情况:无缺失 6、指标解释…

数据结构---力扣225.用队列实现栈(C

1.链接:. - 力扣(LeetCode)【点击即可跳转】 思路: 栈 是 后进先出 队列 是 先进先出 (始终保持一个队列为空的思路) 入数据: 往 不为空的队列 中入 出数据: 把不为空的队列数…

Java使用Hutool工具类轻松生成验证码

一、效果展示 二、Hutool工具类实现验证码生成 2.1 引入依赖 <!--hutool工具包--> <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.15</version> </dependency2.2 简单实现方…

如何实现单例模式及不同实现方法分析-设计模式

这是 一道面试常考题&#xff1a;&#xff08;经常会在面试中让手写一下&#xff09; 什么是单例模式 【问什么是单例模式时&#xff0c;不要答非所问&#xff0c;给出单例模式有两种类型之类的回答&#xff0c;要围绕单例模式的定义去展开。】 单例模式是指在内存中只会创建…

C文件操作

目录 1. 为什么要使用文件 2. 什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3. 二进制文件和文本文件 ​编辑4.文件的打开和关闭 4.1 流和标准流 4.1.1 流 4.1.2 标准流 4.2 文件指针 4.3 文件的打开和关闭 5. 文件的顺序读写 5.1 顺序读写函数介绍 5.1.1 …

Python pandas openpyxl excel合并单元格,设置边框,背景色

Python pandas openpyxl excel合并单元格&#xff0c;设置边框&#xff0c;背景色 1. 效果图2. 源码参考 当涉及到比较复杂的设置背景色时&#xff0c;需要根据一些结果去对另一些单元格进行设置时&#xff0c;在行列上只能设置一种颜色&#xff0c;否则会被覆盖&#xff1b; 比…

Query传递的参数需不需要加注解?加什么?为什么有的时候要加有的时候不加?

Query传递过来的参数可以加&#xff0c;也可以不加注解。如果要加&#xff0c;是在传递的参数名和后端的变量名不一致的情况下&#xff0c;要加RequestParam如果传递过来的参数名和后端的变量名一致&#xff0c;则可以不加RequestParam。 传递过来的数据如果是通过 Query 方式…

Linux ldd和ldconfig

ldconfig ldconfig 查看默认库路径和ld.so.conf包含的库路径&#xff0c;来建立运行时动态装载的库查找路径。 ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),…

代码随想录算法训练营第五十五 | ● 583. 两个字符串的删除操作 ● 72. 编辑距离

583. 两个字符串的删除操作 https://programmercarl.com/0583.%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C.html class Solution { public:int minDistance(string word1, string word2) {vector<vector<int>> d…

48.HTTP 规范规定,跟随重定向时必须使用 GET 方法

起因&#xff1a; 今天在练习一个Django功能时&#xff0c;把form的method设置为POST&#xff0c;但是实际提交时&#xff0c;一直是GET方法。最后&#xff0c;从下面这张图发现了端倪&#xff1a; 第一次是method是POST方法&#xff0c;被重定向时&#xff0c;变成了GET。 继…