Flink Table与其他类型的转换

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. 基于字段名称
    1. 基于字段位置
//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" )

猜你喜欢

转载自blog.csdn.net/liuwei0376/article/details/123820080