下面有两种API,分别是Apache社区的原生Flink API,还有一种是经过阿里优化过的一种APi,叫做Blink,两种API对于Batch和Stream有一些区别
package flinkjava.Task.TableTask;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.TableEnvironment;
import org.apache.flink.table.api.java.BatchTableEnvironment;
import org.apache.flink.table.api.java.StreamTableEnvironment;
public class task1 {
public static void main(String[] args) {
/****************************/
/*** flink stream query ***/
/****************************/
EnvironmentSettings fsSettings = EnvironmentSettings.newInstance().useOldPlanner().inStreamingMode().build();
StreamExecutionEnvironment fsenv = StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment fsTabEnv = StreamTableEnvironment.create(fsenv,fsSettings);
/****************************/
/*** flink Batch query ***/
/****************************/
ExecutionEnvironment fbEnv = ExecutionEnvironment.getExecutionEnvironment();
BatchTableEnvironment fbTableEnv = BatchTableEnvironment.create(fbEnv);
/****************************/
/*** blink stream query ***/
/****************************/
StreamExecutionEnvironment bsEnv = StreamExecutionEnvironment.getExecutionEnvironment();
EnvironmentSettings bsSettings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build();
StreamTableEnvironment bsTableEnv = StreamTableEnvironment.create(bsEnv,bsSettings);
/****************************/
/*** blink Batch query ***/
/****************************/
EnvironmentSettings bbSettings = EnvironmentSettings.newInstance().useBlinkPlanner().inBatchMode().build();
TableEnvironment bbTableEnv = TableEnvironment.create(bbSettings);
// bsTableEnv.fromDataStream();
}
}
下面就将Flink和Blink两种Planner来分别写一写API。
/****************************/
/*** flink Batch query ***/
/****************************/
ExecutionEnvironment fbEnv = ExecutionEnvironment.getExecutionEnvironment();
BatchTableEnvironment fbTableEnv = BatchTableEnvironment.create(fbEnv);
/**********************************************/
/*** 在某个catalog下的某个database下创建Table ***/
/**********************************************/
Schema orderSchema = new Schema().field("oid", DataTypes.STRING())
.field("productname", DataTypes.STRING())
.field("time", DataTypes.STRING());
Schema paySchema = new Schema().field("pid", DataTypes.STRING())
.field("type", DataTypes.STRING())
.field("ptime", DataTypes.STRING());
fbTableEnv.connect(new FileSystem().path("/Users/ongbo/Maven/bin/FlinkDemo/src/main/resources/orders.txt"))
.withFormat(new Csv().fieldDelimiter(',').lineDelimiter("\n"))
.withSchema(orderSchema)
.registerTableSource("ordersource");
//使用connect可以从一个文件或者Kafka等其他外部系统来创建一个表
fbTableEnv.connect(new FileSystem().path("/Users/ongbo/Maven/bin/FlinkDemo/src/main/resources/payments.txt"))
.withFormat(new Csv().fieldDelimiter(',').lineDelimiter("\n"))
.withSchema(paySchema)
.createTemporaryTable("paytable");
Table ordertable = fbTableEnv.from("ordersource").select("*");
Table paytable = fbTableEnv.from("paytable").select("*");
//基于paytable在default_catalog.default_database注册一个临时view
fbTableEnv.createTemporaryView("exampleview",paytable);
//基于paytable在default_catalog.other_database注册一个临时view
fbTableEnv.createTemporaryView("other_database.exampleview",paytable);
//基于paytable在default_catalog.default_database注册一个view,那个``里面的内容不会被转成某个catalog下的某个database
fbTableEnv.createTemporaryView("`example.view`",paytable);
/**********************************************/
/*** 查询 ***/
/**********************************************/
try {
//使用API,这里就需要一个明确的对象Table
Table filterResult = ordertable.filter("oid='1'").select("*");
fbTableEnv.toDataSet(filterResult,Row.class).print();
//使用SQL语句,这里的话可以是某个注册之后的表path,比如上面注册的各种临时view和source表
Table SQLQueryResult = fbTableEnv.sqlQuery("select * from ordersource where oid='1'");
fbTableEnv.toDataSet(SQLQueryResult,Row.class).print();
// fbTableEnv.sqlUpdate("insert into paytable values('23','23','23')");
Table SQLQueryResult2 = fbTableEnv.sqlQuery("select * from paytable where pid='1'");
fbTableEnv.toDataSet(SQLQueryResult2,Row.class).print();
} catch (Exception e) {
e.printStackTrace();
}
Table和DataSet之间可以相互转换的
分别是fromDataset和toDataSet
/**********************************************/
/*** 转换 DataSet ->>> Table ***/
/**********************************************/
DataSet<Row> rowDataSet = fbTableEnv.toDataSet(SQLQueryResult2, Row.class);
Table datasetTable = fbTableEnv.fromDataSet(rowDataSet);
//分别转换成Row,POJO,还有TupleTypeInfo
fbTableEnv.toDataSet(datasetTable,Row.class).print();
fbTableEnv.toDataSet(datasetTable, payments.class).print();
fbTableEnv.toDataSet(datasetTable, new TupleTypeInfo<>(Types.STRING,Types.STRING,Types.STRING)).print();
**执行效果分别是Row,POJO,以及Tuple格式的
其实还支持了scala中的case类,以及AtomicField,但是这个只有一个字段。
/****************************/
/*** flink stream query ***/
/****************************/
EnvironmentSettings fsSettings = EnvironmentSettings.newInstance().useOldPlanner().inStreamingMode().build();
StreamExecutionEnvironment fsenv = StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment fsTabEnv = StreamTableEnvironment.create(fsenv,fsSettings);
fsenv.setParallelism(1);
/****************************/
/*** 开始创建一个表吧 ***/
/*** 应该也可以使用connect等等 ***/
/****************************/
DataStreamSource<order> orderDataStreamSource = fsenv.addSource(new orderSource());
DataStreamSource<payment> paymentDataStreamSource = fsenv.addSource(new paysource());
Table orderTable = fsTabEnv.fromDataStream(orderDataStreamSource).as("orderid,productname,timestampo");
Table payTable = fsTabEnv.fromDataStream(paymentDataStreamSource).as("payid,paytype,timestampp");
//创建一个临时表,也可以使用connect去create和register
// fsTabEnv.createTemporaryView("tempviewOrder",orderTable);
// Table selectTable = fsTabEnv.sqlQuery("select * from tempviewOrder where orderid>10 and orderid<20");
Table selectResult = orderTable.select("*");
fsTabEnv.toAppendStream(selectResult,Row.class).print();
fsTabEnv.toRetractStream(selectResult,Row.class).print();
Table转换成Stream有两种方式,一种是Append追加模式,另一种是Retract模式。
Append针对于那种insert的操作,即对以前的数据不更改,直接插入新的数据
而Retract会通过标志位,实现对数据的动态更新,比如是删除还是更新
这个Blink Planner要和上面的Flink Planner要区别开来了,前面的Flink是会区分DataSet和DataStream的,他们的各种查询语句,插入都会转换成对应的“批”处理程序或者“流”处理程序,而在Blink里面,就统一流批了,所以的DataSet都会看成Stream,所以就不会存在Table去转换成DataSet,总而言之,在Blink里面,你就当做只有Table和DataStream在谈恋爱,而DataSet只是第三者。而作为第三者与现任的区别就是现任DataStream的表是动态的,而DataSet是静态的,但是也可以当做统一流去处理的