分享
说明
- 本文属于实战,讲解 Flink1.12 版本java代码注册表和视图的实现方法,开发环境搭建,参考上篇文章,这里不再赘述。
资料
- 官方Flink 1.12中文版Table API&SQL文档地址
实现
讲解
- 代码结构分为5部分,
- 准备环境 env
- 数据输入 source
- 数据处理 transformation
- 数据输出 sink
- 启动任务 execute
代码
import static org.apache.flink.table.api.Expressions.$;
import java.util.Arrays;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
public class DataStreamToTableAndView {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
EnvironmentSettings settings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build();
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env,settings);
DataStream<Order> orderA=env.fromCollection(Arrays.asList(
new Order(1L,"beer",3),
new Order(1L,"diaper",4),
new Order(3L,"rubber",2)
));
DataStream<Order> orderB=env.fromCollection(Arrays.asList(
new Order(2L,"beer",3),
new Order(2L,"diaper",3),
new Order(3L,"rubber",1)
));
Table tableA=tableEnv.fromDataStream(orderA,$("user"),$("product"),$("amount"));
tableEnv.createTemporaryView("tableB",orderB,$("user"),$("product"),$("amount"));
String sql="select * from "+tableA+" where amount>2 union select * from tableB where amount>1 ";
Table resultTable=tableEnv.sqlQuery(sql);
System.out.println("结果表约束:");
resultTable.printSchema();
System.out.println("表名:"+resultTable);
DataStream<Tuple2<Boolean, Order>> resultDsTwo=tableEnv.toRetractStream(resultTable, Order.class);
resultDsTwo.print();
env.execute("");
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Order{
public Long user;
public String product;
public int amount;
}
}
总结
- Flink 支持table和视图开发,功能上各有特色,使用上看个人习惯。
- 个人倾向于Table开发。但整体上table接口相比传统java编码风格有很大不同,使用上需要适应。另外各个版本Flink接口变动较大,旧版本大量接口废弃,希望后期能稳定下来。不然后期版本升级,大量功能接口升级,无异于二次开发。