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
连接两个数据流,并对连接后的数据流进行转换操作。
-
Connect:Connect 算子用于连接两个数据流,这两个数据流的类型可以不同。Connect 算子会将两个数据流连接成一个 ConnectedStreams 对象,但并不对元素做任何转换操作。Connect 算子通常用于需要将两个不同类型的数据流进行关联处理的场景。
-
CoMap:CoMap 算子用于对 ConnectedStreams 中的每一个数据流应用一个 map 函数,将它们分别转换为另一种类型。CoMap 会将两个数据流中的元素分别转换为不同的类型,因此在使用 CoMap 时需要分别指定两个不同的 map 函数。
-
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");
上述事例有两个输入数据流 inputStream1
和 inputStream2
,它们的元素类型分别为 Type1
和 Type2
。对这两个数据流进行连接转换操作,并输出连接后的结果。首先使用 keyBy
对两个数据流进行分区,然后使用 join
算子将两个分区后的数据流按照指定的条件进行连接。在 join
方法中,我们需要指定连接条件和窗口分配器,并通过 apply
方法应用一个 JoinFunction
对连接后的数据进行转换操作。在 JoinFunction
的 join
方法中,我们可以编写具体的连接转换逻辑,然后返回转换后的结果。
Split / Select:将一个数据流拆分为多个数据流,然后对不同的数据流进行选择操作。
此功能根据条件将流拆分为两个或多个流。 当您获得混合流并且您可能希望单独处理每个数据流时,可以使用此方法。
11.Apply(窗口中的元素自定义转换)
WindowedStream → DataStream
AllWindowedStream → DataStream
当使用 Flink 的 apply
方法时,将一个自定义的函数应用于流中的每个元素,并生成一个新的流。这个自定义的函数可以是 MapFunction
、FlatMapFunction
、FilterFunction
等接口的实现。
// 创建输入数据流
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);}}}}
}
在这个示例中,首先创建了两个简单的数据集firstDataSet
和secondDataSet
,然后将它们转换为Flink的DataSet
对象。接着使用CoGroup
算子对这两个数据集进行分组连接操作,其中通过where
和equalTo
指定了连接字段,通过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();}
}
在这个示例中,首先创建了两个简单的数据集firstDataSet
和secondDataSet
,然后将它们转换为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();}
}
在这个示例中,首先创建了两个简单的数据集firstDataSet
和secondDataSet
,然后将它们转换为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();}}
}
在这个示例中,首先创建了两个数据流firstStream
和secondStream
,这些数据流可以来自各种数据源(例如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 算子将数据流拆分为三个不同的流:category1
、category2
和 other
。接着使用 Select 算子选择了category1
和category2
两个流,并对它们分别应用了自定义的 Mapper 函数和 Filter 函数进行处理。最后将处理后的结果合并为一个流,并打印出来。
更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)
相关文章:
Flink—— Flink Data transformation(转换)
Flink数据算子转换有很多类型,各位看官看好,接下来,演示其中的十八种类型。 1.Map(映射转换) DataStream → DataStream 将函数作用在集合中的每一个元素上,并返回作用后的结果,其中输入是一个数据流&…...
前端读取文件当文件选择相同文件名的文件,内容不会变化
前端读取文件当文件选择相同文件名的文件,内容不会变化 今天遇到个奇怪的bug,使用打开文件,并选择文件时,正常情况会读取文件信息。 但是如果先选择相同的文件名,则内容不会发生变化。 先说结论 只要不使用事件中e…...

PHP 服装销售管理系统mysql数据库web结构layUI布局apache计算机软件工程网页wamp
一、源码特点 PHP 服装销售管理系统是一套完善的web设计系统mysql数据库 ,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 php服装销售管理系统1 二、功能介绍 (1)员工管理:对员工信息…...

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

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

ModStartBlog v8.5.0 评论开关布局调整,系统后台全面优化
ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场,后台一键快速安装 …...

django|报错SQLite 3.8.3 or later is required的解决方案
迁移原同事写的程序,到新服务器上边。运行报错。解决方案有三种 降低django版本升级sqlite3,不低于3.8.3版本修改django源码 方案一、降低django版本 卸载高版本django pip uninstall django安装低版本,如 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系列都在中国生产!
近几年来,国内供应链逐渐外迁,而拥有庞大劳动力市场的印度却成为了香饽饽,逐渐获得越来越多企业的重视,就连苹果公司也将其视为发展的重要战略要地。 自从苹果扩大印度生产iPhone规模后,很快流言四起,各种负…...

Oracle 安装及 Spring 使用 Oracle
参考内容: docker安装oracle数据库史上最全步骤(带图文) 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++)
目录 题目: 思路: 代码: 结果 题目: 思路: 详细思路都在代码注释里 。 代码: #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:Data truncation: Invalid JSON text 5、MySQL:Duplicate entry ‘xx‘ for key ‘xxxx…...
基于UNI-APP实现适配器并保证适配器和实现的调用一致
概述 前端功能的实现是基于不同的环境采用不同的实现方式的。一种是企业微信小程序,需要基于企业微信框架实现。一种是移动APP,需要基于uni-app的中底层实现。为了调用方便,需要将两种实现统一在一种适配器中,调用者只需要指定环…...

使用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] (仅发行版 21 支持预览语言功能) 解决…...
js中的跳转都有哪些格式
location.href "URL" :用于在当前窗口中加载其他页面。 例如:location.href "https://www.google.com" location.replace("URL"):用于在当前窗口中加载其他页面,但不保留原页面的历史记录&#…...
无重复字符的最长子串
题目 添加链接描述 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2:输入: s "bbbbb" 输出…...

C语言--输入10个数字,要求输出其中值最大的元素和该数字是第几个数
今天小编带大家了解一下什么是“打擂台”算法。 一.思路分析 可以定义一个数组arr,长度为10,用来存放10个数字,设计一个函数Max,用来求两个数中的较大值, 定义一个临时变量tmparr[0],保存临时最大的值,下标…...
如何做好功能测试,提升测试质量和效率?
要做好功能测试并提升测试质量和效率,可以考虑以下几个方面: 1. 明确测试目标和需求 在开始功能测试之前,首先要明确测试的目标和需求,包括测试的范围、重点、预期结果等。这有助于为测试工作提供清晰的方向和指导。 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…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...