changelogStream
在动态表的概念中,其输出结果不是一个简单的“结果记录”不断追加的状态,而是一个需要对“前序”结果进行修正的状态;为了能向下游传递其输出结果的动态信息,flink 设计了一种 DataStream,叫做changelogStream(改变日志流)
changelogStream 的本质
- changelogStream 依然是一个 DataStream
- 与普通 stream 不同的是,changelog 流中的数据类型是 Row
- 而在 Row 中,有一个属性 RowKind 来标识一行数据属于哪种“更新类型”(+I/-U/+U/-D)
表=>流
示例
// 将视图表转Table对象,再转为流
DataStream<Row> dataStream = tenv.toChangelogStream(tenv.from("topn_odd"));
dataStream.print();
流=>表
示例
// 1,zs,male,18
DataStreamSource<String> s1 = env.socketTextStream("hdp01", 9999);
SingleOutputStreamOperator<Person> s2 = s1.map(s -> {
String[] split = s.split(",");
return new Person(Integer.parseInt(split[0]), split[1], split[2], Integer.parseInt(split[3]));
});
// 把流变成表
tenv.createTemporaryView("tab", s2); // 注册了sql表名,后续可以用sql语句查询
Table table = tenv.fromDataStream(s2); // 得到table对象,后续可以用api进行查询
创建视图
// 方式一
Sting sql1 = "select * fron tab";
Table tmp = tenv.sqlQuery(sql1);
tenv.createTemporaryView("tmp", tmp); // Table对象转视图表
tenv.executeSql("select * from tmp where age % 2 = 1").print();
// 方式二
String sql2 = "create temporary view topn_view" +
"as" +
"SELECT" +
" id," +
" name," +
" age," +
" gender," +
" rn" +
"FROM" +
"(\n" +
"select" +
" id," +
" name," +
" age," +
" gender," +
" row_number() over(partition by gender order by age desc) as rn" +
"from abc" +
") o" +
"where rn<=3";
tenv.executeSql(sql2);