flink sql 之从dataStream和ddl中定义eventTime,group window,over window(4)

代码

package flinkSql

import flinkSourse.SensorReading
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time
import org.apache.flink.table.api.{EnvironmentSettings, Table}
import org.apache.flink.table.api.scala._
import org.apache.flink.types.Row

case class SensorReading(id: String, timestamp: Long, temperature: Double)

object FlinkSqlLession3_DatastreamToSqlEventTime {
  def main(args: Array[String]): Unit = {
    val executionEnvironment: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    executionEnvironment.setStreamTimeCharacteristic(TimeCharacteristic.EventTime) 
    executionEnvironment.setParallelism(1)
    //ddl形式必须使用blink planer ,2.1 blink版本planer的流处理,有setting的情况
    val blinkStreamSettings: EnvironmentSettings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build()
    val tableEnvironment: StreamTableEnvironment = StreamTableEnvironment.create(executionEnvironment, blinkStreamSettings)

    //第一种从流数据中定义和获取event_time
    //    val stream2: DataStream[String] = executionEnvironment.socketTextStream("127.0.0.1", 1111)
    //    val transforStream: DataStream[SensorReading] = stream2.map(data => {
    //      val tmpList: Array[String] = data.split(",")
    //      SensorReading(tmpList(0), tmpList(1).toLong, tmpList(2).toDouble)
    //    }).assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor[SensorReading](Time.seconds(0)) {
    //      override def extractTimestamp(t: SensorReading) = t.timestamp * 1000
    //    })
    //    //FlinkSql,从流里面定义eventTime,转为table,执行sql
    //    tableEnvironment.createTemporaryView("sensorTable", transforStream, 'id, 'temperature, 'timestamp.rowtime)

    //第二种从ddl中定义和获取eventTime
    val sourceDDl: String =
      """
        | create table sensorTable(
        | id varchar(20),
        | timestampdata bigint,
        | temperature double,
        | rs as TO_TIMESTAMP(FROM_UNIXTIME(timestampdata)),
        | watermark for rs as rs - interval '0' second
        | ) with (
        | 'connector.type'='filesystem',
        | 'connector.path'='/Users/zha/untitled/src/main/resources/sensorReading.txt',
        | 'format.type'='csv'
        | )
        |""".stripMargin

    tableEnvironment.sqlUpdate(sourceDDl)


    //group window,实现计算每10s中计算每个id的数量,和温度的均值
    val tumbleSql: String =
      """
        | select id,
        |   count(id),
        |   avg(temperature),
        |   tumble_end(rs,interval '10' second)
        | from sensorTable
        | group by
        |   id,
        |   tumble(rs,interval '10' second)
        |""".stripMargin


    //over window,实现计算每行记录和前两行记录的中的数量,和温度的均值
    val overWindowSql =
      """
        | select id,
        |   rs,
        |   count(id) over ow,
        |   avg(temperature) over ow
        | from sensorTable
        | window ow as (
        |   partition by id
        |   order by rs
        |   rows between 2 preceding and current row
        | )
        |""".stripMargin


//    val sqlTable: Table = tableEnvironment.sqlQuery(tumbleSql)
    val sqlTable: Table = tableEnvironment.sqlQuery(overWindowSql)
    //当是group window 和 over window这种窗口聚合的时候,toAppendStream,toRetractStream是一样的
    sqlTable.toAppendStream[Row].print("toAppenStreamSqlResult")
    sqlTable.toRetractStream[Row].print("toRetractStreamSqlResult")

    executionEnvironment.execute("flink sql")
  }
}

输入

sensor_1,1547718199,32.9
sensor_1,1547718209,30.7
sensor_1,1547718208,34.5
sensor_1,1547718211,34.5
sensor_1,1547718213,30.9
sensor_1,1547718212,28
sensor_1,1547718225,30
sensor_1,1547718228,34
sensor_1,1547718213,23
sensor_1,1547718288,21
sensor_2,1547718219,21
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值