目前有两种方式将DataStream或DataSet 转换为Table
一种是通过注册Table的方式,将DataSet或DataStream数据集注册成CataLog中的表,然后可以直接使用Flink SQL操作注册好的Table,这种方式需要指定表名和包含的字段名称,Flink会自动推断出Table中的字段类型
一种是转换的方式,将DataSet或DataStream数据集转换成Table结构,然后可以使用Table API操作创建好的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)
字段名称需要指定,字段类型flink自动推断,转换完成后可以使用TableAPI操作创建好的Table
val table1 = tabEnv.fromDataStream(stream)
val table2 = tabEnv.fromDataStream(stream,'fd1,'fd2)
雷同只是更改了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数据集,需要在转换过程指明目标数据集的字段类型,Flink目前支持从Table中转换Row,POJO,Case Class,Tuple,Atomic Type等数据类型,Row对象类型最简单,无需定义任何数据结构
在流式计算过程中数据不断的动态更新,将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)
由于数据为静态数据集,可以直接调用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()
}
}