timeWindowAll時間滾動窗口(不分區時間滾動窗口【滑動窗口與滾動窗口的區別,在於滑動窗口會有數據元素重疊可能,而滾動窗口不存在元素重疊】)
示例環境
java.version: 1.8.x
flink.version: 1.11.1
示例數據源 (項目碼雲下載)
TimeWindowAll.java
import com.flink.examples.DataSource;
import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.RichSourceFunction;
import org.apache.flink.streaming.api.windowing.time.Time;
import java.util.List;
/**
* @Description 不分區時間滾動窗口
*/
public class TimeWindowAll {
/*
窗口在處理流數據時,通常會對流進行分區;
數據流劃分爲:
keyed(根據key劃分不同數據流區)
non-keyed(指沒有按key劃分的數據流區,指所有原始數據流)
*/
/**
* 遍歷集合,返回指定時間滾動窗口下最大年齡數據記錄
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//env.setParallelism(1);
DataStream<Tuple3<String, String, Integer>> inStream = env.addSource(new MyRichSourceFunction());
DataStream<Tuple3<String, String, Integer>> dataStream = inStream
//按時間窗口滑動,對前6秒內的輸入數據流,計算一次
.timeWindowAll(Time.seconds(6))
//注意:計算變量爲f2
.maxBy(2);
dataStream.print();
env.execute("flink TimeWindow job");
}
/**
* 模擬數據持續輸出
*/
public static class MyRichSourceFunction extends RichSourceFunction<Tuple3<String, String, Integer>> {
@Override
public void run(SourceContext<Tuple3<String, String, Integer>> ctx) throws Exception {
List<Tuple3<String, String, Integer>> tuple3List = DataSource.getTuple3ToList();
for (Tuple3 tuple3 : tuple3List){
ctx.collect(tuple3);
//1秒鐘輸出一個
Thread.sleep(1 * 1000);
}
}
@Override
public void cancel() {
try{
super.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
打印結果
2> (王五,man,29)