当前位置: 首页 > news >正文

Flink—— Flink Data transformation(转换)

        Flink数据算子转换有很多类型,各位看官看好,接下来,演示其中的十八种类型。

1.Map(映射转换)

        DataStream → DataStream

        将函数作用在集合中的每一个元素上,并返回作用后的结果,其中输入是一个数据流,输出的也是一个数据流:

DataStream<Integer> dataStream = //加载数据源
dataStream.map(new MapFunction<Integer, Integer>() {@Overridepublic Integer map(Integer age) throws Exception {return 2 + age;}
});

2.Flatmap(扁平映射转换)

        DataStream → DataStream

        FlatMap 将集合中的每个元素变成一个或多个元素,并返回扁平化之后的结果,即采用一条记录并输出零个,一个或多个记录。

//加载数据源dataStream.flatMap(new FlatMapFunction<String, String>() {@Overridepublic void flatMap(String value, Collector<String> out)throws Exception {for(String word: value.split(",")){out.collect(word);}}
});

3.Filter(过滤转换)

        DataStream → DataStream

        按照指定的条件对集合中的元素进行过滤,过滤出返回true/符合条件的元素。

// 过滤出年龄大于18的数据
dataStream.filter(new FilterFunction<Integer>() {@Overridepublic boolean filter(Integer age) throws Exception {return age > 18;}
});

Keyby(分组转换)

        DataStream → KeyedStream

        按照指定的key来对流中的数据进行分组,在逻辑上是基于 key 对流进行分区。在内部,它使用 hash 函数对流进行分区。它返回 KeyedDataStream 数据流。

KeyedStream<Student, Integer> keyBy = student.keyBy(new KeySelector<Student, Integer>() {@Overridepublic Integer getKey(Student value) throws Exception {return value.age;}
});

4.Reduce(归约转换)

        KeyedStream → DataStream

        对集合中的元素进行聚合,Reduce 返回单个的结果值,并且 reduce 操作每处理一个元素总是创建一个新值。常用的方法有 average, sum, min, max, count,使用 reduce 方法都可实现。

keyedStream.reduce(new ReduceFunction<Integer>() {@Overridepublic Integer reduce(Integer value1, Integer value2)throws Exception {return value1 * value2;}
});

5.Aggregations(聚合转换)

        KeyedStream → DataStream

        在分组后的数据集上进行聚合操作,如求和、计数、最大值、最小值等。这些函数可以应用于 KeyedStream 以获得 Aggregations 聚合。

DataStream<Tuple2<String, Integer>> dataStream = ...;  // 加载数据源dataStream.keyBy(0) // 对元组的第一个元素进行分组  .sum(1); // 对元组的第二个元素求和

6.Window(分组开窗转换)

KeyedStream → WindowedStream

        Flink 定义数据片段以便(可能)处理无限数据流。 这些切片称为窗口,将数据流划分为不重叠的窗口,并在每个窗口上执行转换操作,常用于对时间窗口内的数据进行处理。 此切片有助于通过应用转换处理数据块。 要对流进行窗口化,需要分配一个可以进行分发的键和一个描述要对窗口化流执行哪些转换的函数,

        要将流切片到窗口,我们可以使用 Flink 自带的窗口分配器。 我们有选项,如 tumbling windows, sliding windows, global 和 session windows。 Flink 还允许您通过扩展 WindowAssginer 类来编写自定义窗口分配器。

inputStream.keyBy(0).window(Time.seconds(10));

        上述案例是数据分组后,是以 10 秒的时间窗口聚合:

7.WindowAll(开窗转换)

        DataStream → AllWindowedStream

        类似于 Window 操作,但是对整个数据流应用窗口操作而不是对每个 key 分别应用。

        windowAll 函数允许对常规数据流进行分组。 通常,这是非并行数据转换,因为它在非分区数据流上运行。 唯一的区别是它们处理窗口数据流。 所以窗口缩小就像 Reduce 函数一样,Window fold 就像 Fold 函数一样,并且还有聚合。

        // 创建一个简单的数据流  DataStream<Tuple2<String, Integer>> dataStream = ...; // 请在此处填充你的数据源  // 定义一个 ReduceFunction,用于在每个窗口内进行求和操作  ReduceFunction<Tuple2<String, Integer>> reduceFunction = new ReduceFunction<Tuple2<String, Integer>>() {  @Override  public Tuple2<String, Integer> reduce(Tuple2<String, Integer> value1, Tuple2<String, Integer> value2) throws Exception {  return new Tuple2<>(value1.f0, value1.f1 + value2.f1);  }  };  // 使用 WindowAll 方法,指定时间窗口和 ReduceFunction  dataStream.windowAll(Time.of(5, TimeUnit.SECONDS), reduceFunction)  .print(); // 输出结果到 stdout (for debugging)  

8.Union(合并转换)

        DataStream* → DataStream

        将多个数据流合并为一个数据流。union算子可以合并多个同类型的数据流,并生成同类型的数据流,即可以将多个DataStream[T]合并为一个新的DataStream[T]。数据将按照先进先出(First In First Out)的模式合并,且不去重

//通过一些 key 将同一个 window 的两个数据流 join 起来。inputStream.join(inputStream1).where(0).equalTo(1).window(Time.seconds(5))     .apply (new JoinFunction () {...});
// 以上示例是在 5 秒的窗口中连接两个流,其中第一个流的第一个属性的连接条件等于另一个流的第二个属性。

9.Connect / CoMap / CoFlatMap(连接转换)

        DataStream,DataStream → DataStream

        连接两个数据流,并对连接后的数据流进行转换操作。

  1. Connect:Connect 算子用于连接两个数据流,这两个数据流的类型可以不同。Connect 算子会将两个数据流连接成一个 ConnectedStreams 对象,但并不对元素做任何转换操作。Connect 算子通常用于需要将两个不同类型的数据流进行关联处理的场景。

  2. CoMap:CoMap 算子用于对 ConnectedStreams 中的每一个数据流应用一个 map 函数,将它们分别转换为另一种类型。CoMap 会将两个数据流中的元素分别转换为不同的类型,因此在使用 CoMap 时需要分别指定两个不同的 map 函数。

  3. CoFlatMap:CoFlatMap 算子和 CoMap 类似,也是用于对 ConnectedStreams 中的每一个数据流应用一个 flatMap 函数,将它们分别转换为另一种类型。不同之处在于,CoFlatMap 生成的元素个数可以是 0、1 或多个,因此适用于需要将每个输入元素转换为零个、一个或多个输出元素的情况。

// 创建两个数据流
DataStream<Type1> dataStream1 = ... // 从某个地方获取 Type1 类型的数据流
DataStream<Type2> dataStream2 = ... // 从某个地方获取 Type2 类型的数据流// 使用 Connect 算子连接两个数据流
ConnectedStreams<Type1, Type2> connectedStreams = dataStream1.connect(dataStream2);// 使用 CoMap 对每个数据流进行单独的转换
SingleOutputStreamOperator<ResultType1> resultStream1 = connectedStreams.map(new CoMapFunction<Type1, ResultType1>() {@Overridepublic ResultType1 map1(Type1 value) throws Exception {// 对 Type1 数据流的转换逻辑// ...return transformedResult1;}
});SingleOutputStreamOperator<ResultType2> resultStream2 = connectedStreams.map(new CoMapFunction<Type2, ResultType2>() {@Overridepublic ResultType2 map2(Type2 value) throws Exception {// 对 Type2 数据流的转换逻辑// ...return transformedResult2;}
});// 使用 CoFlatMap 对连接后的数据流进行转换
SingleOutputStreamOperator<ResultType> resultStream = connectedStreams.flatMap(new CoFlatMapFunction<Type1, Type2, ResultType>() {@Overridepublic void flatMap1(Type1 value, Collector<ResultType> out) throws Exception {// 对 Type1 数据流的转换逻辑// 将转换后的结果发射出去out.collect(transformedResult1);}@Overridepublic void flatMap2(Type2 value, Collector<ResultType> out) throws Exception {// 对 Type2 数据流的转换逻辑// 将转换后的结果发射出去out.collect(transformedResult2);}
});// 执行任务
env.execute("Connect and CoMap Example");

10.Join(连接转换)

        KeyedStream,KeyedStream → DataStream

        可以使用 join 算子来实现两个数据流的连接转换操作

java
// 创建两个数据流
DataStream<Type1> inputStream1 = ... // 从某个地方获取 Type1 类型的数据流
DataStream<Type2> inputStream2 = ... // 从某个地方获取 Type2 类型的数据流// 使用 keyBy 将两个数据流按照相同的字段进行分区
KeyedStream<Type1, KeyType> keyedStream1 = inputStream1.keyBy(<keySelector>);
KeyedStream<Type2, KeyType> keyedStream2 = inputStream2.keyBy(<keySelector>);// 使用 join 进行连接转换
SingleOutputStreamOperator<OutputType> resultStream = keyedStream1.join(keyedStream2).where(<keySelector1>).equalTo(<keySelector2>).window(<windowAssigner>).apply(new JoinFunction<Type1, Type2, OutputType>() {@Overridepublic OutputType join(Type1 value1, Type2 value2) throws Exception {// 执行连接转换逻辑// ...return transformedResult;}});// 执行任务
env.execute("Join Example");

        上述事例有两个输入数据流 inputStream1inputStream2,它们的元素类型分别为 Type1Type2。对这两个数据流进行连接转换操作,并输出连接后的结果。首先使用 keyBy 对两个数据流进行分区,然后使用 join 算子将两个分区后的数据流按照指定的条件进行连接。在 join 方法中,我们需要指定连接条件和窗口分配器,并通过 apply 方法应用一个 JoinFunction 对连接后的数据进行转换操作。在 JoinFunctionjoin 方法中,我们可以编写具体的连接转换逻辑,然后返回转换后的结果。

Split / Select:将一个数据流拆分为多个数据流,然后对不同的数据流进行选择操作。

此功能根据条件将流拆分为两个或多个流。 当您获得混合流并且您可能希望单独处理每个数据流时,可以使用此方法。

11.Apply(窗口中的元素自定义转换)

        WindowedStream → DataStream
        AllWindowedStream → DataStream

        当使用 Flink 的 apply 方法时,将一个自定义的函数应用于流中的每个元素,并生成一个新的流。这个自定义的函数可以是 MapFunctionFlatMapFunctionFilterFunction 等接口的实现。

// 创建输入数据流
DataStream<Type1> inputStream = ... // 从某个地方获取 Type1 类型的数据流// 使用 apply 方法应用自定义函数
SingleOutputStreamOperator<OutputType> resultStream = inputStream.apply(new MyMapFunction());// 定义自定义的 MapFunction
public class MyMapFunction implements MapFunction<Type1, OutputType> {@Overridepublic OutputType map(Type1 value) {// 执行转换操作OutputType transformedValue = ... // 对输入元素进行一些转换操作return transformedValue;}
}// 执行任务
env.execute("Apply Example");

12.Iterate(迭代转换)

        DataStream → IterativeStream → DataStream

        允许在数据流上进行迭代计算,通常用于实现迭代算法。iterate函数允许您定义一个迭代处理的核心逻辑,并通过closeWith方法指定迭代结束的条件。

        // 定义迭代逻辑DataSet<Long> iteration = initialInput.iterate(1000)  // 指定迭代上限.map(new MapFunction<Long, Long>() {@Overridepublic Long map(Long value) throws Exception {// 迭代处理逻辑,这里简单地加1return value + 1;}});// 指定迭代结束条件DataSet<Long> result = iteration.closeWith(iteration.filter(value -> value >= 10));

        在这个示例中,使用iterate函数来定义迭代逻辑,其中map函数对每个元素进行加1操作。接着,我们使用closeWith方法来指定迭代结束的条件,即当元素的值大于等于10时结束迭代。

        需要注意的是,在实际的迭代处理中,需要根据具体业务逻辑来定义迭代的处理过程和结束条件。另外,还需要注意迭代过程中的性能和资源消耗,以及迭代次数的控制,避免出现无限循环等问题。

13.CoGroup(分组连接转换)

        DataStream,DataStream → DataStream

        将两个或多个数据流中的元素进行连接操作,通常基于相同的键进行连接。

import org.apache.flink.api.common.functions.CoGroupFunction;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;import java.util.ArrayList;
import java.util.List;public class CoGroupExample {public static void main(String[] args) throws Exception {final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();// 创建第一个数据集List<Tuple2<Integer, String>> firstDataSet = new ArrayList<>();firstDataSet.add(new Tuple2<>(1, "A"));firstDataSet.add(new Tuple2<>(2, "B"));// 创建第二个数据集List<Tuple2<Integer, String>> secondDataSet = new ArrayList<>();secondDataSet.add(new Tuple2<>(1, "X"));secondDataSet.add(new Tuple2<>(3, "Y"));// 将数据集转化为Flink的DataSetorg.apache.flink.api.java.DataSet<Tuple2<Integer,String>> first = env.fromCollection(firstDataSet);org.apache.flink.api.java.DataSet<Tuple2<Integer,String>> second = env.fromCollection(secondDataSet);// 使用CoGroup算子进行连接first.coGroup(second).where(0) // 第一个数据集的连接字段.equalTo(0) // 第二个数据集的连接字段.with(new MyCoGroupFunction()) // 指定自定义的CoGroupFunction.print();env.execute();}// 自定义CoGroupFunctionpublic static class MyCoGroupFunction implements CoGroupFunction<Tuple2<Integer, String>, Tuple2<Integer, String>, String> {@Overridepublic void coGroup(Iterable<Tuple2<Integer, String>> first, Iterable<Tuple2<Integer, String>> second, Collector<String> out) {List<String> valuesFromFirst = new ArrayList<>();for (Tuple2<Integer, String> t : first) {valuesFromFirst.add(t.f1);}List<String> valuesFromSecond = new ArrayList<>();for (Tuple2<Integer, String> t : second) {valuesFromSecond.add(t.f1);}// 对两个数据集的分组进行连接操作for (String s1 : valuesFromFirst) {for (String s2 : valuesFromSecond) {out.collect(s1 + "-" + s2);}}}}
}

        在这个示例中,首先创建了两个简单的数据集firstDataSetsecondDataSet,然后将它们转换为Flink的DataSet对象。接着使用CoGroup算子对这两个数据集进行分组连接操作,其中通过whereequalTo指定了连接字段,通过with方法指定了自定义的CoGroupFunction。最后,在CoGroupFunction中实现了对两个数据集分组的连接逻辑,并通过Collector将结果输出。

14.Cross(笛卡尔积转换)

        计算两个数据流的笛卡尔积。

        DataStream,DataStream → DataStream

import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.tuple.Tuple2;import java.util.ArrayList;
import java.util.List;public class CrossExample {public static void main(String[] args) throws Exception {final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();// 创建第一个数据集List<Integer> firstDataSet = new ArrayList<>();firstDataSet.add(1);firstDataSet.add(2);// 创建第二个数据集List<String> secondDataSet = new ArrayList<>();secondDataSet.add("A");secondDataSet.add("B");// 将数据集转化为Flink的DataSetDataSet<Integer> first = env.fromCollection(firstDataSet);DataSet<String> second = env.fromCollection(secondDataSet);// 使用Cross算子进行笛卡尔积操作DataSet<Tuple2<Integer, String>> result = first.cross(second);// 打印结果result.print();env.execute();}
}

        在这个示例中,首先创建了两个简单的数据集firstDataSetsecondDataSet,然后将它们转换为Flink的DataSet对象。接着使用Cross算子对这两个数据集进行笛卡尔积操作,得到了一个包含所有可能组合的新数据集。

15.Project(投影转换)

        DataStream → DataStream

        对数据集进行投影操作,选择特定的字段或属性。Project算子用于从数据集中选择或投影出特定的字段。

import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.tuple.Tuple3;import java.util.ArrayList;
import java.util.List;public class ProjectExample {public static void main(String[] args) throws Exception {final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();// 创建数据集List<Tuple3<Integer, String, Double>> inputDataSet = new ArrayList<>();inputDataSet.add(new Tuple3<>(1, "Alice", 1000.0));inputDataSet.add(new Tuple3<>(2, "Bob", 1500.0));inputDataSet.add(new Tuple3<>(3, "Charlie", 2000.0));// 将数据集转化为Flink的DataSetDataSet<Tuple3<Integer, String, Double>> input = env.fromCollection(inputDataSet);// 使用Project算子进行字段投影DataSet<Tuple2<Integer, String>> projectedDataSet = input.project(0, 1); // 选择字段0和字段1// 打印结果projectedDataSet.print();env.execute();}
}

        在这个示例中,首先创建了一个包含整数、字符串和双精度浮点数的元组数据集inputDataSet。然后将它们转换为Flink的DataSet对象。接着使用Project算子对数据集进行字段投影,选择了字段0和字段1。最后打印出了字段投影后的结果。

16.Connect(连接转换)

        DataStream,DataStream → ConnectedStreams

        connect提供了和union类似的功能,用来连接两个数据流,它与union的区别在于:connect只能连接两个数据流,union可以连接多个数据流。connect所连接的两个数据流的数据类型可以不一致,union所连接的两个数据流的数据类型必须一致。
        两个DataStream经过connect之后被转化为ConnectedStreams,ConnectedStreams会对两个流的数据应用不同的处理方法,且双流之间可以共享状态。

import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.tuple.Tuple2;import java.util.ArrayList;
import java.util.List;public class ConnectExample {public static void main(String[] args) throws Exception {final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();// 创建第一个数据集List<Integer> firstDataSet = new ArrayList<>();firstDataSet.add(1);firstDataSet.add(2);firstDataSet.add(3);// 创建第二个数据集List<String> secondDataSet = new ArrayList<>();secondDataSet.add("A");secondDataSet.add("B");secondDataSet.add("C");// 将数据集转化为Flink的DataSetDataSet<Integer> first = env.fromCollection(firstDataSet);DataSet<String> second = env.fromCollection(secondDataSet);// 使用Map将Integer类型转换为Tuple2类型DataSet<Tuple2<Integer, String>> firstMapped = first.map(new MapFunction<Integer, Tuple2<Integer, String>>() {@Overridepublic Tuple2<Integer, String> map(Integer value) {return new Tuple2<>(value, "default");}});// 使用Connect算子将两个数据集连接在一起DataSet<Tuple2<Integer, String>> connectedDataSet = firstMapped.connect(second).map(new MapFunction<Integer, Tuple2<Integer, String>>() {@Overridepublic Tuple2<Integer, String> map(Integer value) {return new Tuple2<>(value, "connected");}});// 打印结果connectedDataSet.print();env.execute();}
}

        在这个示例中,首先创建了两个简单的数据集firstDataSetsecondDataSet,然后将它们转换为Flink的DataSet对象。接着使用Map算子将第一个数据集中的整数类型转换为Tuple2类型。然后使用Connect算子将转换后的第一个数据集与第二个数据集连接在一起,最后再对连接后的数据集进行处理。最终打印出了连接后的结果。

17.IntervalJoin(时间窗口连接转换)

        KeyedStream,KeyedStream → DataStream

    IntervalJoin算子用于在两个数据流之间执行基于时间窗口的连接操作。

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.api.common.functions.JoinFunction;
import org.apache.flink.streaming.api.datastream.IntervalJoinOperator;
import org.apache.flink.streaming.api.windowed.TimeWindow;
import org.apache.flink.streaming.api.windowing.time.Time;public class IntervalJoinExample {public static void main(String[] args) throws Exception {final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 创建第一个数据流DataStream<Tuple2<String, Integer>> firstStream = ... // 从数据源获取第一个数据流// 创建第二个数据流DataStream<Tuple2<String, String>> secondStream = ... // 从数据源获取第二个数据流// 定义时间窗口大小Time windowSize = Time.seconds(10);// 使用IntervalJoin算子进行时间窗口连接IntervalJoinOperator<Tuple2<String, Integer>, Tuple2<String, String>, String> joinedStream = firstStream.intervalJoin(secondStream).between(Time.seconds(-3), Time.seconds(3)) // 定义连接窗口范围.upperBoundExclusive() // 指定上界为不包含.lowerBoundExclusive() // 指定下界为不包含.process(new MyIntervalJoinFunction());// 打印结果joinedStream.print();// 执行任务env.execute("Interval Join Example");}// 自定义IntervalJoinFunctionpublic static class MyIntervalJoinFunction implements JoinFunction<Tuple2<String, Integer>, Tuple2<String, String>, String> {@Overridepublic String join(Tuple2<String, Integer> first, Tuple2<String, String> second) {// 在这里实现连接后的处理逻辑return "Joined: " + first.toString() + " and " + second.toString();}}
}

        在这个示例中,首先创建了两个数据流firstStreamsecondStream,这些数据流可以来自各种数据源(例如Kafka、Socket等)。然后使用IntervalJoin算子将这两个数据流在时间窗口上进行连接操作,通过定义连接窗口的范围来指定两个数据流之间的连接条件。最后定义了自定义的JoinFunction来处理连接后的数据。最终打印出了连接后的结果,并执行Flink任务。

18.Split / Select(拆分和选择转换

       DataStream  → DataStream

        Split 和 Select 算子用于将单个数据流拆分为多个流,并选择其中的部分流进行处理。

import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class SplitSelectExample {public static void main(String[] args) throws Exception {final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 创建数据流DataStream<String> inputDataStream = ... // 从数据源获取数据流// 使用 Split 算子将数据流拆分为多个流SplitStream<String> splitStream = inputDataStream.split(new OutputSelector<String>() {@Overridepublic Iterable<String> select(String value) {List<String> output = new ArrayList<>();if (value.contains("category1")) {output.add("category1");} else if (value.contains("category2")) {output.add("category2");} else {output.add("other");}return output;}});// 选择拆分后的流中的部分流进行处理DataStream<String> category1Stream = splitStream.select("category1");DataStream<String> category2Stream = splitStream.select("category2");// 对每个流进行进一步处理DataStream<String> processedCategory1Stream = category1Stream.map(new MyMapperFunction());DataStream<String> processedCategory2Stream = category2Stream.filter(new MyFilterFunction());// 将处理后的结果合并为一个流DataStream<String> resultStream = processedCategory1Stream.union(processedCategory2Stream);// 打印结果resultStream.print();// 执行任务env.execute("Split and Select Example");}// 自定义 Mapper 函数public static class MyMapperFunction implements MapFunction<String, String> {@Overridepublic String map(String value) {// 在这里实现对流中元素的转换操作return "Processed Category1: " + value;}}// 自定义 Filter 函数public static class MyFilterFunction implements FilterFunction<String> {@Overridepublic boolean filter(String value) {// 在这里实现过滤逻辑return value.length() > 10;}}
}

        在这个示例中,首先创建了一个输入数据流inputDataStream,然后使用 Split 算子将数据流拆分为三个不同的流:category1category2other。接着使用 Select 算子选择了category1category2两个流,并对它们分别应用了自定义的 Mapper 函数和 Filter 函数进行处理。最后将处理后的结果合并为一个流,并打印出来。

更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)

相关文章:

Flink—— Flink Data transformation(转换)

Flink数据算子转换有很多类型&#xff0c;各位看官看好&#xff0c;接下来&#xff0c;演示其中的十八种类型。 1.Map&#xff08;映射转换&#xff09; DataStream → DataStream 将函数作用在集合中的每一个元素上,并返回作用后的结果&#xff0c;其中输入是一个数据流&…...

前端读取文件当文件选择相同文件名的文件,内容不会变化

前端读取文件当文件选择相同文件名的文件&#xff0c;内容不会变化 今天遇到个奇怪的bug&#xff0c;使用打开文件&#xff0c;并选择文件时&#xff0c;正常情况会读取文件信息。 但是如果先选择相同的文件名&#xff0c;则内容不会发生变化。 先说结论 只要不使用事件中e…...

PHP 服装销售管理系统mysql数据库web结构layUI布局apache计算机软件工程网页wamp

一、源码特点 PHP 服装销售管理系统是一套完善的web设计系统mysql数据库 &#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php服装销售管理系统1 二、功能介绍 (1)员工管理&#xff1a;对员工信息…...

用于图像处理的高斯滤波器 (LoG) 拉普拉斯

一、说明 欢迎来到拉普拉斯和高斯滤波器的拉普拉斯的故事。LoG是先进行高斯处理&#xff0c;继而进行拉普拉斯算子的图像处理算法。用拉普拉斯具有过零功能&#xff0c;实现边缘岭脊提取。 二、LoG算法简述 在这篇博客中&#xff0c;让我们看看拉普拉斯滤波器和高斯滤波器的拉普…...

【h5 uniapp】 滚动 滚动条,数据跟着变化

uniapp项目 需求&#xff1a; 向下滑动时&#xff0c;数据增加&#xff0c;上方的日历标题日期也跟着变化 向上滑动时&#xff0c;上方的日历标题日期跟着变化 实现思路&#xff1a; 初次加载目前月份的数据 以及下个月的数据 this.getdate()触底加载 下个月份的数据 onReach…...

ModStartBlog v8.5.0 评论开关布局调整,系统后台全面优化

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装 …...

django|报错SQLite 3.8.3 or later is required的解决方案

迁移原同事写的程序&#xff0c;到新服务器上边。运行报错。解决方案有三种 降低django版本升级sqlite3&#xff0c;不低于3.8.3版本修改django源码 方案一、降低django版本 卸载高版本django pip uninstall django安装低版本&#xff0c;如 pip install django2.1.7注意&…...

通达OA get_datas.php前台sql注入-可获取数据库session登入后台漏洞复现 [附POC]

文章目录 通达OA get_datas.php前台sql注入-可获取数据库session登入后台漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 通达OA get_datas.php前台sql注入-可获取数据库session登入后台漏洞复现…...

苹果官方:所有国行iPhone 15系列都在中国生产!

近几年来&#xff0c;国内供应链逐渐外迁&#xff0c;而拥有庞大劳动力市场的印度却成为了香饽饽&#xff0c;逐渐获得越来越多企业的重视&#xff0c;就连苹果公司也将其视为发展的重要战略要地。 自从苹果扩大印度生产iPhone规模后&#xff0c;很快流言四起&#xff0c;各种负…...

Oracle 安装及 Spring 使用 Oracle

参考内容&#xff1a; docker安装oracle数据库史上最全步骤&#xff08;带图文&#xff09; Mac下oracle数据库客户端 Docker安装Oracle docker能安装oracle吗 Batch script for add a auto-increased primary key for exist table with records Docker 安装 Oracle11g 注意&a…...

element-ui 表格 点击选中

element-ui 表格 点击选中 复制element ui 表格 <template><el-table:data"tableData"style"width: 100%"><el-table-columnprop"date"label"日期"width"180"></el-table-column><el-table-col…...

畅通工程之局部最小花费问题 (C++)

目录 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 结果 题目&#xff1a; 思路&#xff1a; 详细思路都在代码注释里 。 代码&#xff1a; #include<iostream>//无向图邻接矩阵 #include<map> #include<algorithm> #define mvnum 1005 using …...

Sql 异常 + Error

目录 1、Sql 异常 1、SQL Error 1、 Out of sort memory,consider increasing server sort buffer size 2、MySQL排序规则不同关联报错 3、MySQL ....LIMIT 15 4、MySQL&#xff1a;Data truncation: Invalid JSON text 5、MySQL:Duplicate entry ‘xx‘ for key ‘xxxx…...

基于UNI-APP实现适配器并保证适配器和实现的调用一致

概述 前端功能的实现是基于不同的环境采用不同的实现方式的。一种是企业微信小程序&#xff0c;需要基于企业微信框架实现。一种是移动APP&#xff0c;需要基于uni-app的中底层实现。为了调用方便&#xff0c;需要将两种实现统一在一种适配器中&#xff0c;调用者只需要指定环…...

使用jdk21预览版 --enable-preview

异常 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile (default-compile) on project sb3: Compilation failure [ERROR] --enable-preview 一起使用时无效 [ERROR] &#xff08;仅发行版 21 支持预览语言功能&#xff09; 解决…...

js中的跳转都有哪些格式

location.href "URL" &#xff1a;用于在当前窗口中加载其他页面。 例如&#xff1a;location.href "https://www.google.com" location.replace("URL")&#xff1a;用于在当前窗口中加载其他页面&#xff0c;但不保留原页面的历史记录&#…...

无重复字符的最长子串

题目 添加链接描述 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 示例 2:输入: s "bbbbb" 输出…...

C语言--输入10个数字,要求输出其中值最大的元素和该数字是第几个数

今天小编带大家了解一下什么是“打擂台”算法。 一.思路分析 可以定义一个数组arr&#xff0c;长度为10&#xff0c;用来存放10个数字&#xff0c;设计一个函数Max&#xff0c;用来求两个数中的较大值&#xff0c; 定义一个临时变量tmparr[0],保存临时最大的值&#xff0c;下标…...

如何做好功能测试,提升测试质量和效率?

要做好功能测试并提升测试质量和效率&#xff0c;可以考虑以下几个方面&#xff1a; 1. 明确测试目标和需求 在开始功能测试之前&#xff0c;首先要明确测试的目标和需求&#xff0c;包括测试的范围、重点、预期结果等。这有助于为测试工作提供清晰的方向和指导。 2. 制定详细…...

高德地图添加信息弹窗,信息弹窗是单独的组件

//弹窗组件 <template><el-card class"box-card" ref"boxCard" v-if"showCard"><div slot"header" class"clearfix"><div class"title">{{ model.pointName }}</div><div class…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

负载均衡器》》LVS、Nginx、HAproxy 区别

虚拟主机 先4&#xff0c;后7...

如何通过git命令查看项目连接的仓库地址?

要通过 Git 命令查看项目连接的仓库地址&#xff0c;您可以使用以下几种方法&#xff1a; 1. 查看所有远程仓库地址 使用 git remote -v 命令&#xff0c;它会显示项目中配置的所有远程仓库及其对应的 URL&#xff1a; git remote -v输出示例&#xff1a; origin https://…...

边缘计算网关提升水产养殖尾水处理的远程运维效率

一、项目背景 随着水产养殖行业的快速发展&#xff0c;养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下&#xff0c;而且难以实现精准监控和管理。为了提升尾水处理的效果和效率&#xff0c;同时降低人力成本&#xff0c;某大型水产养殖企业决定…...