构建数据源
package com.cnic.source;
import org.apache.flink.api.java.tuple.Tuple3;
import java.util.Arrays;
import java.util.List;
/**
* @Description 公共示例数据
*/
public class DataSource {
/**
* 示例数据集合
* Tuple3 是一个固定3个属性变量的实体类,分别用f0,f1,f2表示三个构造传参与变量
* @return
*/
public static List<Tuple3<String,String,Integer>> getTuple3ToList(){
//Tuple3<f0,f1,f2> = Tuple3<姓名,性别(man男,girl女),年龄>
return Arrays.asList(
new Tuple3<>("张三", "man", 20),
new Tuple3<>("李四", "girl", 24),
new Tuple3<>("王五", "man", 29),
new Tuple3<>("刘六", "girl", 32),
new Tuple3<>("伍七", "girl", 18),
new Tuple3<>("吴八", "man", 30)
);
}
}
主题代码:
package com.cnic.coding;
import com.cnic.source.DataSource;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.windowing.WindowFunction;
import org.apache.flink.streaming.api.windowing.windows.GlobalWindow;
import org.apache.flink.util.Collector;
import java.util.Iterator;
import java.util.List;
/**
* Apply:对窗口内的数据流进行处理
*/
public class Apply {
public static void main(String[] args) throws Exception {
/***
* 遍历集合,分别打印不同性别的总人数与年龄之和
*/
// 创建执行环境
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
List<Tuple3<String, String, Integer>> tuple3List = DataSource.getTuple3ToList();
SingleOutputStreamOperator<String> dataStream = env.fromCollection(tuple3List)
.keyBy((KeySelector<Tuple3<String, String, Integer>, String>) k -> k.f1)
// 按数量窗口滚动,每3个输入窗口数据流,计算一次
.countWindow(3)
// appley只能基于windowed窗口Stream进行调用
.apply(
// WindowFunction<IN,OUT,KEY,W extends Window>
new WindowFunction<Tuple3<String, String, Integer>, String, String, GlobalWindow>() {
/**
* 处理窗口数据集合
* @param s 从keyBy里面返回的key值
* @param window 窗口类型
* @param input 从窗口获取的所有分区数据流
* @param out 输出数据流对象
* @throws Exception
*/
@Override
public void apply(String s, GlobalWindow window, Iterable<Tuple3<String, String, Integer>> input, Collector<String> out) throws Exception {
Iterator<Tuple3<String, String, Integer>> iterator = input.iterator();
int total = 0;
int i = 0;
while (iterator.hasNext()) {
Tuple3<String, String, Integer> tuple3 = iterator.next();
total += tuple3.f2;
i++;
}
out.collect(s + "共:" + i + "人,累计总年龄:" + total);
}
});
dataStream.print();
env.execute("flink Filter job");
}
}
打印结果:
girl共:3人,累计总年龄:74
man共:3人,累计总年龄:79