使用 toAppendStream 和 toRetractStream 方法将 Table 转换为 DataStream[T]数据集,T 可以是 Flink 自定义的数据格式类型 Row,也可以是用户指定的数 据 格 式 类 型 。 在 使 用 toRetractStream 方 法 时 , 返 回 的 数 据 类 型 结 果 为 DataStream[(Boolean,T)],Boolean 类型代表数据更新类型,True 对应 INSERT 操作更新的 数据,False 对应 DELETE 操作更新的数据。

package tablesql

import org.apache.flink.streaming.api.scala.{DataStream, StreamExecutionEnvironment}
import org.apache.flink.table.api.{EnvironmentSettings, Table}
import org.apache.flink.table.api.scala.StreamTableEnvironment
import org.apache.flink.types.Row
import window.StationLog

/**
* @Author yqq
* @Date 2021/12/28 14:43
* @Version 1.0
*/
case class StationLog(sid:String,callOut:String,callInput:String,callType:String,callTime:Long,duration:Long)
object TestCreateTableByDateStream {
def main(args: Array[String]): Unit = {
val environment = StreamExecutionEnvironment.getExecutionEnvironment
val settings = EnvironmentSettings.newInstance().inStreamingMode().inStreamingMode().build()
val table: StreamTableEnvironment = StreamTableEnvironment.create(environment, settings)
//读取数据
//读取数据源
import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.scala._
val stream: DataStream[StationLog] = environment.socketTextStream("node1", 8888)
.map(line => {
val arr: Array[String] = line.split(",")
new StationLog(arr(0).trim, arr(1).trim, arr(2).trim, arr(3).trim, arr(4).trim.toLong, arr(5).trim.toLong)
})
val t = table.fromDataStream(stream)
//分组聚合
val result: Table = t.groupBy('sid).select('sid, 'sid.count as 'log_count)
table.toRetractStream[Row](result).filter(_._1==true).print()
environment.execute()
}
}
[root@node1 ~]# nc -lk 8888
station_0,18600003513,18900005514,fail,1640516929887,12
station_0,18600009400,18900001255,basy,1640516929888,18
station_0,18600004698,18900005849,success,1640516927882,1
station_0,18600007253,18900002970,barring,1640516925858,12

TableAPI和SQL之分组聚合_apache