Flink之TableAPI和SQL(1):基本功能描述

相关文章链接

Flink之TableAPI和SQL(1):基本功能描述

Flink之TableAPI和SQL(2):表和外部系统的连接方式

Flink之TableAPI和SQL(3):通过TableAPI和SQL表的一些操作(包括查询,过滤,聚集等)

Flink之TableAPI和SQL(4):表的Sink实现

Flink之TableAPI和SQL(5):表的时间特性

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")

 

posted on 2020-12-02 15:42  电光闪烁  阅读(436)  评论(0编辑  收藏  举报

导航