5、flink任务中可以使用哪些转换算子(Transformation)

1、什么是Flink中的转换算子

        在使用 Flink DataStream API 开发流式计算任务时,可以将一个或多个 DataStream 转换成新的 DataStream,在应用程序中可以将多个数据转换算子合并成一个复杂的数据流拓扑图。


2、常用的转换算子 

        Flink提供了功能各异的转换算子,Map,FlatMap,Filter,KeyBy,Reduce,Window,WindowAll...
通过操作各种转换算子,来获取新的DataStream及子类的实例,来完成计算需求。

Tips: 下面测试用例基于 Flink1.17.0、java1.8 编写


3、基本转换算子(map/ filter/ flatMap)

3.1 Map

功能说明:

DataStream[T] → DataStream[R]
输入一个元素同时输出一个元素,可以对元素的数据类型和内容做转换,好比SQL中的UDF函数

代码示例:

package com.baidu.datastream.transform;import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class Map {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 2.使用 Map 算子// 方式1:使用 Lambda表达式env.fromElements("刘备", "张飞", "关羽", "赵云", "马超", "黄忠").map(value -> value + "_").print();// 方式2:使用 MapFunction实现类/**  TODO MapFunction<T, O>*   功能说明:*      对元素做1:1映射转换*   泛型说明:*      @T : 输入数据类型*      @O : 输出数据类型* */MapFunction<String, Integer> mapFunction = new MapFunction<String, Integer>() {@Overridepublic Integer map(String value) throws Exception {return value.length();}};env.fromElements("刘备", "张飞", "关羽", "赵云", "马超", "黄忠").map(mapFunction).print();// 3.触发程序执行env.execute();}
}

执行结果:


 3.2 FlatMap 

功能说明:

DataStream[T] → DataStream[R]
输入一个元素同时产生零个、一个或多个元素,好比SQL中的UDTF(1对多)函数

 代码示例:

package com.baidu.datastream.transform;import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;public class FlatMap {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 2.使用 FlatMap 算子// 方式:使用 flatMapFunction实现类/**  TODO flatMapFunction<T, O>*   功能说明:*      对输入元素做1:多的转换(好比SQL中的UDTF函数)*   泛型说明:*      @T : 输入数据类型*      @O : 输出数据类型* */FlatMapFunction<String, String> flatMapFunction = new FlatMapFunction<String, String>() {@Overridepublic void flatMap(String value, Collector<String> out) throws Exception {for (String s : value.split("_")) {out.collect(s);}}};env.fromElements("刘_备", "张_飞", "关_羽", "赵_云", "马_超", "黄_忠").flatMap(flatMapFunction).print();// 3.触发程序执行env.execute();}
}

执行结果:


3.3 Filter

功能说明:

DataStream[T] → DataStream[T]
为每个元素执行一个逻辑判断,并保留那些判断为 true 的元素,好比SQL中的where

代码示例:

package com.baidu.datastream.transform;import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class Filter {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 2.使用 Filter 算子// 方式1:使用 Lambda表达式env.fromElements("刘备", "张飞", "关羽", "赵云", "马超", "黄忠").filter(value -> value.equals("刘备")).print();// 方式2:使用 FilterFunction实现类/**  TODO FilterFunction<T, O>*   功能说明:*      对元素过滤处理*   泛型说明:*      @T : 输入数据类型* */FilterFunction<String> filterFunction = new FilterFunction<String>() {@Overridepublic boolean filter(String value) throws Exception {return value.equals("张飞");}};env.fromElements("刘备", "张飞", "关羽", "赵云", "马超", "黄忠").filter(filterFunction).print();// 3.触发程序执行env.execute();}
}

执行结果:


4、聚合算子

4.1 KeyBy(按键分区)

功能说明:

DataStream[T] → KeyedStream[T,K]
根据指定的字段(key),将数据划分到不相交的分区中。相同key的元素会被分到同一个分区中。

分区规则:
          分区编号 =  指定字段(key) 的哈希值 % 分区个数(并行度)   

思考:

        1、哪些 数据类型 不能作为分区的key?

                  数组类型不能作为key     

                  当key的类型为bean类型时,bean类必须要重写hashCode方法

 代码示例:

package com.baidu.datastream.transform;import com.baidu.bean.FlinkUser;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class KeyBy {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(3);// 2.使用 KeyBy 算子// 方式1:使用 Lambda表达式// TODO key的类型为 StringKeyedStream<String, String> stringKeyedStream = env.fromElements("蜀_刘备", "蜀_关羽", "魏_曹操", "吴_孙权", "吴_孙坚", "吴_孙策").keyBy(value -> value.split("_")[0]);stringKeyedStream.print();// TODO key的类型为 bean (需重写hashCode方法)KeyedStream<FlinkUser, FlinkUser> userKeyedStream = env.fromElements(new FlinkUser(1L, "x", 100L), new FlinkUser(2L, "x", 110L), new FlinkUser(3L, "y", 120L), new FlinkUser(4L, "y", 130L), new FlinkUser(5L, "z", 140L)).keyBy(user -> user);// TODO key的类型为 数组(不支持)
//        KeyedStream<String, String[]> arrayKeyedStream = env.fromElements("蜀_刘备", "蜀_关羽", "魏_曹操", "吴_孙权", "吴_孙坚", "吴_孙策")
//                .keyBy(value -> value.split("_"));// 方式2:使用 KeySelector实现类/** TODO KeySelector<IN, KEY>*   功能说明:*       从输入的数据中提取key,然后根据 `key的hashcode%并行度` 进行分区*       注意:这里的分区是逻辑分区*   泛型说明:*       @IN  : 输入数据类型*       @KEY : key的数据类型*   重要提示:*       什么类型的数据不能作为key呢?*          1.当 POJO 类且没有重写 hashCode() 方法而是依赖依赖于 Object.hashCode() 实现时*          2.任意类型的数组* */KeySelector<FlinkUser, String> keySelector = new KeySelector<FlinkUser, String>() {@Overridepublic String getKey(FlinkUser value) throws Exception {return value.name;}};KeyedStream<FlinkUser, String> userNameKeyedStream = env.fromElements(new FlinkUser(1L, "x", 100L), new FlinkUser(2L, "x", 110L), new FlinkUser(3L, "y", 120L), new FlinkUser(4L, "y", 130L), new FlinkUser(5L, "z", 140L)).keyBy(keySelector);// max("字段名称") pojo类一定要含有空参构造//userNameKeyedStream.sum("id").print();// 3.触发程序执行env.execute();}
}

执行结果:


4.2 Reduce

功能说明:

KeyedStream[T,K] → DataStream[T]
在相同key的数据流上`滚动`执行聚合操作。将当前元素与上次一次聚合后得到的值(保存的状态值)组合然后输出新值,并将这个值作为状态进行保存。

Reduce函数的弊端:
        聚合前数据类型 = 聚合后数据类型,不能修改数据类型
        不能提供初始值进行聚合操作,当只有一个元素时,不会触发reduce函数

代码示例:

package com.baidu.datastream.transform;import org.apache.flink.api.common.RuntimeExecutionMode;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.functions.ReduceFunction;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.api.java.tuple.Tuple;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class Reduce {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(4);// 2.使用 Reduce 算子/** TODO ReduceFunction<T>*   功能说明:*       对相同key中的元素进行聚合操作(依次聚合)*   泛型说明:*       输入数据和输出数据的类型*   重要说明:*       这种聚合方式不能修改value的数据类型** */ReduceFunction<Tuple2<String, Integer>> reduceFunction = new ReduceFunction<Tuple2<String, Integer>>() {@Overridepublic Tuple2<String, Integer> reduce(Tuple2<String, Integer> value1, Tuple2<String, Integer> value2) throws Exception {return new Tuple2(value1.f0, value1.f1 + value2.f1);}};// 统计每个国家出现的次数env.fromElements("蜀_刘备", "蜀_关羽", "魏_曹操", "吴_孙权", "吴_孙坚", "吴_孙策").map(new MapFunction<String, Tuple2<String, Integer>>() {@Overridepublic Tuple2<String, Integer> map(String value) throws Exception {return new Tuple2(value.split("_")[0], 1);}}).keyBy(new KeySelector<Tuple2<String, Integer>, String>() {@Overridepublic String getKey(Tuple2<String, Integer> value) throws Exception {return value.f0;}}).reduce(reduceFunction).print();// 3.触发程序执行env.execute();}
}

运行结果:


 4.3 sum、min、max、minBy、maxBy

功能说明:

KeyedStream[T,K] → DataStream[T]
在相同key的数据流上`滚动`执行相应聚合操作。

min、minBy的区别:
             min:聚合状态中保存的是第一个元素的非聚合字段
         minBy:聚合状态中保存的是当前元素的非聚合字段

代码示例:

package com.baidu.datastream.transform;import com.baidu.bean.FlinkUser;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class SumMinMaxMinByMaxBy {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(1);KeyedStream<FlinkUser, String> userKeyedStream = env.fromElements(new FlinkUser(1L, "x", 100L),new FlinkUser(2L, "x", 110L),new FlinkUser(3L, "x", 120L),new FlinkUser(4L, "x", 130L),new FlinkUser(5L, "y", 140L)).keyBy(user -> user.name);/** TODO max("")、max(num)*   功能说明:*      根据指定的字段,做聚合操作*   怎样指定聚合字段:*      当 value类型为 pojo时,通过 max("字段名称") 来指定字段*      当 value类型为 tuple时,通过 max(num) 来指定字段*   重点说明:*      当 value类型为pojo时,必须实现空参构造方法,才能提取字段* *///userKeyedStream.max("id").print();//userKeyedStream.min("id").print();//userKeyedStream.sum("id").print();//userKeyedStream.maxBy("id").print();userKeyedStream.minBy("id").print();env.execute();}
}

5、物理分区算子

Flink提供了将数据重新分区的方法,当任务发生数据倾斜时,这个算子会很有用。

5.1 shuffle - 随机分区

功能说明:

        DataStream[T] → DataStream[T]
        将元素随机地均匀分配到下游分区

Tips:
        因为是完全随机,当输入相同时,每次执行的结果可能会不同

代码示例:

package com.baidu.datastream.transform;import com.baidu.bean.FlinkUser;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class Shuffle {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(3);KeyedStream<FlinkUser, String> userKeyedStream = env.fromElements(new FlinkUser(1L, "x", 100L),new FlinkUser(2L, "x", 110L),new FlinkUser(3L, "x", 120L),new FlinkUser(4L, "x", 130L),new FlinkUser(5L, "x", 140L),new FlinkUser(6L, "x", 150L)).keyBy(user -> user.name);/** TODO 问题:由于 keyBy 算子,导致数据倾斜(key相同,导致数据都被同一个并行子任务处理)*    我们可以使用 shuffle 算子将数据均匀的在分配到其他并行子任务中去* 重点提示:*    shuffle 算子只能操作 DataStream,不能操作 KeyedStream* */userKeyedStream.sum("id").shuffle().print();env.execute();}
}

运行结果:

 5.2 rebalance - 轮询分区

功能说明:

        DataStream[T] → DataStream[T]
        使用Round-Robin负载均衡算法,将输入的数据平均的分配到下游分区中去。   

 代码示例:

package com.baidu.datastream.transform;import com.baidu.bean.FlinkUser;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class Rebalance {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(3);KeyedStream<FlinkUser, String> userKeyedStream = env.fromElements(new FlinkUser(1L, "x", 100L),new FlinkUser(2L, "x", 110L),new FlinkUser(3L, "x", 120L),new FlinkUser(4L, "x", 130L),new FlinkUser(5L, "x", 140L),new FlinkUser(6L, "x", 150L)).keyBy(user -> user.name);/** TODO 问题:由于 keyBy 算子,导致数据倾斜(key相同,导致数据都被同一个并行子任务处理)*    我们可以使用 rebalance 算子将数据均匀的在分配到其他并行子任务中去* 重点提示:*    rebalance 算子只能操作 DataStream,不能操作 KeyedStream* */userKeyedStream.sum("id").rebalance().print();env.execute();}
}

运行结果:

5.3 rescale - 重缩分区

功能说明:

        DataStream[T] → DataStream[T]
        使用Round-Robin负载均衡算法,将以分区为单位将输入的数据平均的分配到下游分区中去。

和rebalance的区别:

          rebalance将输入数据作为一个整体,根据数据输入的顺序随机分发到下游分区(涉及到了网络传输)
          rescale将以上游分区为单位,随机的分配到下游分区中去

使用场景:    

         当source算子为可并发数据源时(如kafka,5个分区),设置5个Task来读取分别读取每个分区的数据
    此时,可以使用rescale来分发到下游实现负载均衡,这样可以做到数据只在本地传输而不是网络传输

5.4 global - 全局分区

功能说明:

        DataStream[T] → DataStream[T]
        将元素分发到下游的一个分区中去 

5.5 broadcast - 广播分区

 功能说明:

        DataStream[T] → DataStream[T]
        将元素广播到下游的每个分区 

Tips:
        数据被广播后,会在下游算子的每个分区中都保留一份,可以将数据进行重复处理

代码示例:

package com.baidu.datastream.transform;import com.baidu.bean.FlinkUser;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class Broadcast {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(3);KeyedStream<FlinkUser, String> userKeyedStream = env.fromElements(new FlinkUser(1L, "x", 100L),new FlinkUser(2L, "x", 110L),new FlinkUser(3L, "x", 120L),new FlinkUser(4L, "x", 130L),new FlinkUser(5L, "x", 140L),new FlinkUser(6L, "x", 150L)).keyBy(user -> user.name);userKeyedStream.sum("id").broadcast().print();env.execute();}
}

运行结果:

 5.6  自定义分区

功能说明:

        DataStream[T] → DataStream[T]
        使用用户定义的 Partitioner 将元素分发到下游算子的分区中去

代码示例:

package com.baidu.datastream.transform;import com.baidu.bean.FlinkUser;
import org.apache.flink.api.common.functions.Partitioner;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class PartitionCustom {public static void main(String[] args) throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(3);KeyedStream<FlinkUser, String> userKeyedStream = env.fromElements(new FlinkUser(1L, "x", 100L),new FlinkUser(2L, "x", 110L),new FlinkUser(3L, "x", 120L),new FlinkUser(4L, "x", 130L),new FlinkUser(5L, "x", 140L),new FlinkUser(6L, "x", 150L)).keyBy(user -> user.name);/**  TODO Partitioner<K>*   功能说明:*       自定义分区器,根据输入的数据获取分区编号*   泛型说明:*       @K : key的数据类型* */Partitioner<Long> partitioner = new Partitioner<Long>() {@Overridepublic int partition(Long key, int numPartitions) {if (key == 1L || key == 2L) {return 0;} else if (key == 3L || key == 4L) {return 1;} else {return 2;}}};/** TODO KeySelector<IN, KEY>*  功能说明:*       key提取器,根据输入的数据,获取key*  泛型说明:*       @IN  : 输入数据类型*       @KEY : 输出数据类型(key)* */KeySelector<FlinkUser, Long> keySelector = new KeySelector<FlinkUser, Long>() {@Overridepublic Long getKey(FlinkUser value) throws Exception {return value.id;}};userKeyedStream.sum("id").partitionCustom(partitioner, keySelector).print();env.execute();}
}

运行结果:


6、分流

        在处理数据的时候,经常会将一条流或者一个表根据某些条件拆分成多条流或者多个表

flink中提供了分流的方式:1、使用filter算子分流   2、使用侧输出流分流

 6.1 使用filter算子分流 - 不推荐

这种分流方式的弊端:

        需要将原始流复制多份,并对每一份做一次判断,效率很低 (多次读取,多次判断)

代码示例:

    // 通过 filter 分流public static void ByFilter() throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 根据国家,将 totalStream 分为三股流DataStreamSource<String> totalStream = env.fromElements("蜀_刘备", "蜀_关羽", "魏_曹操", "吴_孙权", "吴_孙坚", "吴_孙策");SingleOutputStreamOperator<String> weiStream = totalStream.filter(e -> e.contains("魏"));SingleOutputStreamOperator<String> shuStream = totalStream.filter(e -> e.contains("蜀"));SingleOutputStreamOperator<String> wuStream = totalStream.filter(e -> e.contains("吴"));weiStream.print();shuStream.print();wuStream.print();// 3.触发程序执行env.execute();}

6.2 使用侧输出流分流 - 推荐

        避免了使用filter算子的弊端,指定source读取一次,判断一次即可完成分流操作

代码示例:

    // 通过 侧输入流 分流public static void ByOutputTag() throws Exception {// 1.获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 根据国家,将 totalStream 分为三股流DataStreamSource<String> totalStream = env.fromElements("蜀_刘备", "蜀_关羽", "魏_曹操", "吴_孙权", "吴_孙坚", "吴_孙策");// 初始化侧输出流OutputTag weiOutputTag = new OutputTag("wei", Types.STRING);OutputTag shuOutputTag = new OutputTag("shu", Types.STRING);OutputTag wuOutputTag = new OutputTag("wu", Types.STRING);// 通过 ProcessFunction向 侧输出流发送数据SingleOutputStreamOperator<String> process = totalStream.process(new ProcessFunction<String, String>() {@Overridepublic void processElement(String value, ProcessFunction<String, String>.Context ctx, Collector<String> out) throws Exception {// 往侧输出流中发送数据if (value.contains("魏")) {ctx.output(weiOutputTag, value);} else if (value.contains("蜀")) {ctx.output(shuOutputTag, value);} else if (value.contains("吴")) {ctx.output(wuOutputTag, value);}}});SideOutputDataStream weiStream = process.getSideOutput(weiOutputTag);SideOutputDataStream shuStream = process.getSideOutput(shuOutputTag);SideOutputDataStream wuStream = process.getSideOutput(wuOutputTag);weiStream.print();shuStream.print();wuStream.print();// 3.触发程序执行env.execute();}

7、合并流

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

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

相关文章

[论文笔记]ON LAYER NORMALIZATION IN THE TRANSFORMER ARCHITECTURE

引言 这是论文ON LAYER NORMALIZATION IN THE TRANSFORMER ARCHITECTURE的阅读笔记。本篇论文提出了通过Pre-LN的方式可以省掉Warm-up环节,并且可以加快Transformer的训练速度。 通常训练Transformer需要一个仔细设计的学习率warm-up(预热)阶段:在训练开始阶段学习率需要设…

JDK 1.6与JDK 1.8的区别

ArrayList使用默认的构造方式实例 jdk1.6默认初始值为10jdk1.8为0,第一次放入值才初始化&#xff0c;属于懒加载 Hashmap底层 jdk1.6与jdk1.8都是数组链表 jdk1.8是链表超过8时&#xff0c;自动转为红黑树 静态方式不同 jdk1.6是先初始化static后执行main方法。 jdk1.8是懒加…

设置PHP的fpm的系统性能参数pm.max_children

1 介绍 PHP从Apache module换成了Fpm&#xff0c;跑了几天突然发现网站打不开了。 页面显示超时&#xff0c;检查MySQL、Redis一众服务都正常。 进入Fpm容器查看日志&#xff0c;发现了如下的错误信息&#xff1a; server reached pm.max_children setting (5), consider r…

python中的svm:介绍和基本使用方法

python中的svm&#xff1a;介绍和基本使用方法 支持向量机&#xff08;Support Vector Machine&#xff0c;简称SVM&#xff09;是一种常用的分类算法&#xff0c;可以用于解决分类和回归问题。SVM通过构建一个超平面&#xff0c;将不同类别的数据分隔开&#xff0c;使得正负样…

2023全国大学生数学建模竞赛A题B题C题D题E题思路+模型+代码+论文

目录 一. 2023国赛数学建模思路&#xff1a; 赛题发布后会第一时间发布选题建议&#xff0c;思路&#xff0c;模型代码等 详细思路获取见文末名片&#xff0c;9.7号第一时间更新 二.国赛常用的模型算法&#xff1a; 三、算法简介 四.超重要&#xff01;&#xff01;&…

msvcp140.dll丢失的解决方法,如何预防msvcp140.dll丢失

在电脑操作系统中经常会弹出类似msvcp140.dll丢失的错误提示窗口&#xff0c;导致软件无法正常运行。为什么会出现msvcp140.dll丢失的情况呢&#xff1f;出现这种情况应该如何解决呢&#xff1f;小编有三种解决方法分享给大家。 一.msvcp140.dll丢失的原因 1.安装过程中受损:在…

前端框架学习-ES6新特性(尚硅谷web笔记)

ECMASript是由 Ecma 国际通过 ECMA-262 标准化的脚本程序设计语言。javaScript也是该规范的一种实现。 新特性目录 笔记出处&#xff1a;b站ES6let 关键字const关键字变量的解构赋值模板字符串简化对象写法箭头函数rest参数spread扩展运算符Promise模块化 ES8async 和 await E…

云原生周刊:Kubernetes v1.28 新特性一览 | 2023.8.14

推荐一个 GitHub 仓库&#xff1a;Fast-Kubernetes。 Fast-Kubernetes 是一个涵盖了 Kubernetes 的实验室&#xff08;LABs&#xff09;的仓库。它提供了关于 Kubernetes 的各种主题和组件的详细内容&#xff0c;包括 Kubectl、Pod、Deployment、Service、ConfigMap、Volume、…

CF1013B And 题解

题目传送门 题目意思&#xff1a; 给你一个长度为 n n n 的序列 a i a_i ai​&#xff0c;再给一个数 x x x。每一步你可以将序列中的一个数与上 x x x。请问最少要多少步才可以使得序列中出现两个相同的数&#xff0c;如果无解输出 − 1 -1 −1。 思路&#xff1a; 首…

Vue页面刷新常用的4种方法

Vue项目里,有时候我们需要刷新页面,重新加载页面数据,常用方法如下: 方法一:location.reload() 方法全局刷新 使用 location.reload() 方法可以简单地实现当前页面的刷新,这个方法会重新加载当前页面,类似于用户点击浏览器的刷新按钮。 在 Vue 中,可以将该方法绑定到…

题解 | #M.Fair Equation# 2023牛客暑期多校10

M.Fair Equation 签到题 题目大意 给定一个式子 A B C ABC ABC &#xff0c;其中正整数 A , B , C ≤ 1 0 6 A,B,C\le 10^6 A,B,C≤106 问能否在 A , B , C A,B,C A,B,C 其中一个数的某一位置&#xff08;可以是开头和结尾&#xff09;插入一个数字&#xff0c;使得等式…

Elasticsearch 查询之Function Score Query

前言 ES 的主查询评分模式分为两种&#xff0c;是信息检索领域的重要算法&#xff1a; TF-IDF 算法 和 BM25 算法。 Elasticsearch 从版本 5.0 开始引入了 BM25 算法作为默认的文档评分&#xff08;relevance scoring&#xff09;算法。在此之前&#xff0c;Elasticsearch 使…

sip网络号角喇叭 sip音柱 POE供电广播音箱 ip网络防水对讲终端 sip网络功放

SV-7042TP网络号角喇叭 一、描述 SV-7042TP是我司的一款SIP网络号角喇叭&#xff0c;具有10/100M以太网接口&#xff0c;内置有一个高品质扬声器&#xff0c;将网络音源通过自带的功放和喇叭输出播放&#xff0c;可达到功率30W。SV-7042TP作为SIP系统的播放终端&#xff0c;可…

【脚踢数据结构】常见树总结(图码结和版)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;软件配置等领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff01;送给自己和读者的…

如何构造不包含字母和数字的webshell

利用不含字母与数字进行绕过 1.异或进行绕过 2.取反进行绕过 3.利用php语法绕过 利用不含字母与数字进行绕过 基本代码运行思路理解 <?php echo "A"^""; ?> 运行结果为! 我们可以看到&#xff0c;输出的结果是字符"!"。之所以会…

C++:字符串哈希

字符串哈希 给定一个长度为 n n n的字符串&#xff0c;再给定 m m m个询问&#xff0c;每个询问包含四个整数 l 1 , r 1 , l 2 , r 2 l_1,r_1,l_2,r_2 l1​,r1​,l2​,r2​&#xff0c;请你判断 [ l 1 , r 1 ] [l_1,r_1] [l1​,r1​]和 [ l 2 , r 2 ] [l_2,r_2] [l2​,r2​]这…

“深入理解Java虚拟机(JVM):背后的工作原理解析“

标题&#xff1a;深入理解Java虚拟机&#xff08;JVM&#xff09;&#xff1a;背后的工作原理解析 摘要&#xff1a;本文将深入探讨Java虚拟机&#xff08;JVM&#xff09;的工作原理&#xff0c;包括内存管理、垃圾回收、即时编译器等关键概念&#xff0c;以及如何优化代码以…

React 18 更新 state 中的数组

参考文章 更新 state 中的数组 数组是另外一种可以存储在 state 中的 JavaScript 对象&#xff0c;它虽然是可变的&#xff0c;但是却应该被视为不可变。同对象一样&#xff0c;当想要更新存储于 state 中的数组时&#xff0c;需要创建一个新的数组&#xff08;或者创建一份已…

vue2,使用element中的Upload 上传文件,自定义上传http-request上传,上传附件支持多选,多个文件只发送一次请求

复制直接使用&#xff0c;组件根据multiple是否多选来返回附件内容&#xff0c;支持多选就返回数据附件&#xff0c;则返回一个附件对象。 //uploadFiles.vue<template><div><el-uploadclass"avatar-uploader"action"#":accept"accep…

对比 VPN 与远程桌面软件,为什么远程桌面更优越

数字格局不断演变&#xff0c;我们的工作和连接方式也在不断变化。企业纷纷转向远程运营&#xff0c;有关推进向远程过渡的最佳技术的争论从未停止。争论的焦点通常是虚拟专用网络&#xff08;VPN&#xff09;和远程桌面软件。 长期以来&#xff0c;VPN 一直被用作访问公司网络…