Apache Flink提供了两种顶层的关系型API,分别为Table API和SQL,Flink通过Table API&SQL实现了批流统一。其中Table API是用于Scala和Java的语言集成查询API,它允许以非常直观的方式组合关系运算符(例如select,where和join)的查询。
将DataStream或者DataSet转化为Table对象
可以直接将DataStream或者DataSet转换为Table对象,之后可以使用Table API进行查询操作。
下面演示DataStream的转换,对于DataSet的转换类似。
// 获取StreamTableEnvironment
StreamTableEnvironment tableEnv = ...;
DataStream<Tuple2<Long, String>> stream = ...
// 将DataStream转换为Table对象,默认的字段为"f0", "f1"
Table table1 = tableEnv.fromDataStream(stream);
// 将DataStream转换为Table对象,默认的字段为"myLong", "myString"
Table table2 = tableEnv.fromDataStream(stream, "myLong, myString");
将表转换为DataStream或者DataSet
当将Table转为DataStream或者DataSet时,需要指定DataStream或者DataSet的数据类型。通常最方便的数据类型是row类型,Flink提供了很多的数据类型供用户选择,具体包括Row、POJO、样例类、Tuple和原子类型。
DataStream与DataSet
DataStream API和DataSet API是流处理和批处理的应用程序接口,当程序在编译时,生成JobGraph。编译完成后,根据API的不同,优化器(批或流)会生成不同的执行计划。根据部署方式的不同,优化后的JobGraph被提交给了executors去执行。
Flink SQL
flink的keyby和partition by
over partition by
# 解析多字符串
# http://apache-flink.147419.n8.nabble.com/Flink-SQL-Array-JSON-td4851.html
LATERAL TABLE