任何程序都可以抽象成输入、处理、输出三部分,flink中将输入抽象成source,输出抽象成sink,中间处理则对应SQL/API,SQL对用户友好,抽象层次更高,同时也导致缺乏灵活性,表达力更弱。
使用Flink中DataStream转换相关的Operater Function比如map,filter等函数编写流式应用,是一种过程式思维,大部分时候使用SQL申明式语言也能实现业务需求。
下面的Demo结合SQL以及面向对象的表达思维,将POJO对象注册成source表,SQL表达业务逻辑,sink表示各种输出目的地,可灵活组合各种source和sink。
Source
KafKaTableSource有一个继承自AbstractSchema的POJO实例成员变量,表示SQL查询的表结构,实现StreamTableSource接口将POJO实例对应的kafka Topic包装成DataStream,实现DefinedRowtimeAttributes接口指定event_time字段
UDFRegister
注册工程中实现的UDF
Sink
将SQL执行结果保存到目的地,有ConsoleTableSink/JDBCTableSink/HbaseTableSink/KafTableSink等多种实现