(二)flink的Table API 与 SQL-DataStream或DataSet与Table相互转换

文章目录

      • DataStream或DataSet 转换为Table
        • DataStream注册成Table
          • 通过registerDataStream转换成table
          • 使用fromDataStream转换成table
        • DataSet转换成Table
      • Table转换成DataStream或DataSet
        • Table转换为DataStream
        • Table转换为DataSet

table api是DataStream或DataSet更高一层的抽象

DataStream或DataSet 转换为Table

目前有两种方式将DataStream或DataSet 转换为Table
一种是通过注册Table的方式,将DataSet或DataStream数据集注册成CataLog中的表,然后可以直接使用Flink SQL操作注册好的Table,这种方式需要指定表名和包含的字段名称,Flink会自动推断出Table中的字段类型
一种是转换的方式,将DataSet或DataStream数据集转换成Table结构,然后可以使用Table API操作创建好的Table

DataStream注册成Table

通过registerDataStream转换成table

注意表名需要唯一

    val env = StreamExecutionEnvironment.getExecutionEnvironment
    val tabEnv = StreamTableEnvironment.create(env)
    import org.apache.flink.api.scala._ //需要隐式转换
    val stream = env.fromElements((192,"f1"),(110,"f2"))
    //注册成表table01,并且默认字段为f1和f2
    tabEnv.registerDataStream("table01",stream)
    //注册成table-2,字段名为field1以及field2
    tabEnv.registerDataStream("table02",stream,'field01,'field02)
使用fromDataStream转换成table

字段名称需要指定,字段类型flink自动推断,转换完成后可以使用TableAPI操作创建好的Table

   val table1 = tabEnv.fromDataStream(stream)
   val table2 = tabEnv.fromDataStream(stream,'fd1,'fd2)

DataSet转换成Table

雷同只是更改了registerDataSet

import org.apache.flink.api.scala._
import org.apache.flink.table.api._
import org.apache.flink.table.api.scala._

object DataSet2Table {
  def main(args: Array[String]): Unit = {
    //需要隐式转换
    val env = ExecutionEnvironment.getExecutionEnvironment
    val tEnv = BatchTableEnvironment.create(env)

    val dataSet = env.fromElements((192,"f1"),(110,"f2"))
    //注册成表tab01,并且默认字段为f1和f2
    tEnv.registerDataSet("tab01",dataSet)
    //注册成table-2,字段名为f1以及f2
    tEnv.registerDataSet("tab01",dataSet,'f1,'f2)
  }
}

fromDataSet

//指定字段f1,f2
 val table1 = tEnv.fromDataSet(dataSet,'f1,'f2)
 //未指定字段 默认f0,f1
 val table2 = tEnv.fromDataSet(dataSet)

Table转换成DataStream或DataSet

Table转换为DataStream或DataSet数据集,需要在转换过程指明目标数据集的字段类型,Flink目前支持从Table中转换Row,POJO,Case Class,Tuple,Atomic Type等数据类型,Row对象类型最简单,无需定义任何数据结构

Table转换为DataStream

在流式计算过程中数据不断的动态更新,将Table转换成DataStream需要指定数据输出的模式,目前Flink支持Append Model 和 Retract Model
Append Model

采用追加方式只将Insert 更新变化的数据写入DataStream中

import org.apache.flink.types.Row

object Table2Stream {
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    val tabEnv = StreamTableEnvironment.create(env)
    import org.apache.flink.api.scala._ //需要隐式转换
    val stream = env.fromElements((192, "f1"), (110, "f2"))

    val table = tabEnv.fromDataStream(stream)
    //未知类型转换为Row
    val dsRow: DataStream[Row] = tabEnv.toAppendStream[Row](table)
    //对于类型已知,可以指定Tuple中格式
    val dsRow2: DataStream[(Long, String)] = tabEnv.toAppendStream[(Long, String)](table)
   env.execute()

  }
}

Retract Model

数据会根据一个Boolean标记当前是Insert操作还是Delete 操作更新的数据,实际应用中比较常见
返回的数据类型中Tuple中第一个元祖True为INSET 操作,False 为DELETE 操作更新的数据

val retractStream = tabEnv.toRetractStream[Row](table)

Table转换为DataSet

由于数据为静态数据集,可以直接调用toDataSet方法转换,可以使用Row或自定义数据类型,但是要与Table中数据结构类型一致

import org.apache.flink.api.scala._
import org.apache.flink.table.api.scala._
import org.apache.flink.types.Row

object Table2DataSet {
  def main(args: Array[String]): Unit = {
    //需要隐式转换
    val env = ExecutionEnvironment.getExecutionEnvironment
    val tEnv = BatchTableEnvironment.create(env)
    val dataSet = env.fromElements((192, "f1"), (110, "f2"))
    val table = tEnv.fromDataSet(dataSet)
    tEnv.toDataSet[Row](table).print()
    env.execute()
  }
}

你可能感兴趣的:(flink)