相关文章链接
Flink之TableAPI和SQL(2):表和外部系统的连接方式
Flink之TableAPI和SQL(3):通过TableAPI和SQL表的一些操作(包括查询,过滤,聚集等)
Flink之TableAPI和SQL(4):表的Sink实现
1、创建执行环境
创建flink的执行环境,并基于flink的环境来创建table的运行环境
2、流、表以及catalog注册表之间的转换
1、通过tableEnv表运行环境,将流转为表
2、通过tableEnv表运行环境,将 表 注册到catalog中(注册之后,可以直接使用sql,表名为传入的字符串)
3、通过tableEnv表运行环境,将 流 注册到catalog中(注册之后,可以直接使用sql,表名为传入的字符串)
4、将catalog中注册的表 转换成 Table表
5、将Table表通过追加等方式转换成流(只有转换完成后才能进行输出打印等操作)
3、TableAPI以及SQL的使用
1、TableAPI要使用Table类型的来执行
2、sql使用tableEnv(表环境)来执行,当注册到catalog中的表 可以直接使用sql查询
3、当没有注册时可以通过使用拼接的方式来使用sql
4、表的打印输出
打印表结构 和 表(打印表需要将表 转换 成流才能打印)
5、执行任务
具体实现如下代码所示:
// 1、创建执行环境 // 1.1、创建flink的执行环境 val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment // 1.2、设置并行度 env.setParallelism(2) // 1.3、基于flink的执行环境 创建 表的执行环境(流处理表环境) val tableEnv: StreamTableEnvironment = StreamTableEnvironment.create(env) // 2、创建流,通过流转表,将表注册到到catalog中,将catalog中的注册表进行转换,表转流并进行打印 // 2.1、创建流(将字符串转成样例类 SensorReading ) val sensorStream: DataStream[SensorReading] = env.readTextFile("D:\Project\IDEA\bigdata-study\flink-demo\src\main\resources\source.txt") .map(data => { val fields: Array[String] = data.split(",") SensorReading(fields(0), fields(1).trim.toLong, fields(2).trim.toDouble) }) // 2.2、通过tableEnv表运行环境,将流转为表 val sensorTable: Table = tableEnv.fromDataStream(sensorStream) // 2.3、通过tableEnv表运行环境,将 表 注册到catalog中(注册之后,可以直接使用sql,表名为传入的字符串) tableEnv.createTemporaryView("sensorTable_1", sensorTable) // 2.4、通过tableEnv表运行环境,将 流 注册到catalog中(注册之后,可以直接使用sql,表名为传入的字符串) tableEnv.createTemporaryView("sensorTable_2", sensorStream) // 2.5、将catalog中注册的表 转换成 Table表 val outputTable: Table = tableEnv.from("sensorTable_2") // 2.6、将Table表通过追加等方式转换成流(只有转换完成后才能进行输出打印等操作) val outputStream: DataStream[Row] = outputTable.toAppendStream[Row] //泛型传入Row或者元组 // 3、执行TableAPI或者sql,进行查询 // 3.1、TableAPI要使用Table类型的来执行 val resultTable: Table = sensorTable .select('id, 'temperature) // 可以使用 单引号 + 变量名 .filter('id === "sensor_1") // 在TableAPI中,等于使用 === // 3.2、sql使用tableEnv(表环境)来执行,当注册到catalog中的表 可以直接使用sql查询 val resultSqlTable_1: Table = tableEnv.sqlQuery("select id, temperature from sensorTable_2 where id = 'sensor_1'") // 3.3、当没有注册时可以通过使用拼接的方式来使用sql val resultSqlTable_2: Table = tableEnv.sqlQuery("select id, temperature from " + sensorTable + " where id = 'sensor_1'") // 4、打印表结构 和 表(打印表需要将表 转换 成流才能打印) resultSqlTable_2.printSchema() resultSqlTable_2.toAppendStream[Row].print() // 5、启动执行器,执行任务 env.execute("BasicTableDemo")