1. 将DataStream转换成Table
//DataStream可直接转换为Table,方便调用Table api做各种转换、输出操作
val dataStream: DataStream[YourModelObject] = ...
val table: Table = tableEnv.fromDataStream(dataStream)
//转换后的Table schema 与DataStream中定义的属性一一对应, 亦可显式指定出来,如:
val dataStream: DataStream[YourModelObject] = ...
val table: Table = tableEnv.fromDataStream(dataStream, 'id, 'timestamp, 'temperature)
2. 将DataStream中数据类型, 与Table的schema的对应关系
有两种类型:
- 基于字段名称
- 基于字段位置
//1.基于名称(name-based)
val table: Table = tableEnv.fromDataStream(dataStream, 'temperature, 'id as 'myId, 'timestamp as 'ts)
//2.基于位置(position-based)
val table: Table = tableEnv.fromDataStream(dataStream, 'ts, 'myId)
3.为DataStream或Table数据创建一个临时视图
//1.基于DataStream创建临时视图
tableEnv.createTemporaryView("sensorDataStream", dataStream)
//2.基于Table创建临时视图
tableEnv.createTemporaryView("sensorTable", sensorTable)
4. Table表输出
表的输出是通过把数据写入到具体的TableSink来实现.
TableSink是一个通用java接口, 可以支持不同的数据落地存储方式: 文件、RDBMS、KV-DB、MQ等.
在api的表现上, 为: 使用 Table.insertinto()方法, 将一个Table写入到已经注册过的TableSink里.
tableEnv.connect(...).createTemporaryTable("outputTable")
val resultTable: Table = ...
resultTable.insertInto("outputTable")
//例如:
//3.1 使用table api
//做简单转换
val simpleTramsformTable = sensorTable
//scala里的表达式写法(Expression)
.select( 'id, 'temper )
.filter( 'id === "sensor1" )
// 输出到文件中
val outputPath = "D:\\IdeaProject-ws-3\\FlinkTutorialScala\\src\\main\\resources\\input\\sensor_output.txt"
tableEnv.connect( new FileSystem().path( outputPath ) )
.withFormat( new Csv() )
.withSchema(
new Schema()
.field( "id", DataTypes.STRING() )
.field( "temper", DataTypes.DOUBLE() )
)
.createTemporaryTable( "outputTable" )
simpleTramsformTable.insertInto( "outputTable" )