說明
- 本文屬於實戰,講解 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;
/***
*
* @Description Table API And SQl實例一:將DataStream註冊爲動態表或視圖,再使用sql進行統計查詢。
*/
public class DataStreamToTableAndView {
public static void main(String[] args) throws Exception {
//TODO 1. env環境準備
StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
EnvironmentSettings settings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build();
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env,settings);
//TODO 2. source
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)
));
//TODO 3. transformation 將DataStream數轉換Table和View,然後查詢
Table tableA=tableEnv.fromDataStream(orderA,$("user"),$("product"),$("amount")); //註冊表
tableEnv.createTemporaryView("tableB",orderB,$("user"),$("product"),$("amount")); //註冊視圖
/**
* 查詢:tableA中amount>2 和tableB中amount>1定時護甲併合並。
*/
String sql="select * from "+tableA+" where amount>2 union select * from tableB where amount>1 ";
// sql="select * from "+tableA+" where amount>2 ";
Table resultTable=tableEnv.sqlQuery(sql);
System.out.println("結果表約束:");
resultTable.printSchema();
System.out.println("表名:"+resultTable);
//將table轉爲DataStream
// DataStream<Order> resultDs=tableEnv.toAppendStream(resultTable, Order.class); //僅insert 操作修改動態表數據
/**
* retract 流包含兩種類型的 message: add messages 和 retract messages 。通過將INSERT 操作編碼爲 add message、將 DELETE 操作編碼爲 retract message、
* 將 UPDATE 操作編碼爲更新(先前)行的 retract message 和更新(新)行的 add message,將動態錶轉換爲 retract 流。下圖顯示了將動態錶轉換爲 retract 流的過程。
*/
DataStream<Tuple2<Boolean, Order>> resultDsTwo=tableEnv.toRetractStream(resultTable, Order.class); //
//TODO 4. sink
resultDsTwo.print();
//TODO 5. execute
env.execute("");
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Order{
public Long user;
public String product;
public int amount;
}
}
總結
- Flink 支持table和視圖開發,功能上各有特色,使用上看個人習慣。
- 個人傾向於Table開發。但整體上table接口相比傳統java編碼風格有很大不同,使用上需要適應。另外各個版本Flink接口變動較大,舊版本大量接口廢棄,希望後期能穩定下來。不然後期版本升級,大量功能接口升級,無異於二次開發。