flink中动态表的时间特性

flink中动态表的时间特性

一、processTime

1)DataStream转化成Table时指定
        //1.获取执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
        //获取TableAPI执行环境
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

在这里插入图片描述

2)定义Table Schema时指定
        //1.获取执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
        //获取TableAPI执行环境
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

拿kafka为例,在Schema里面创建一个字段。

    //2.创建Kafka的连接器
    tableEnv.connect(new Kafka()
            .version("0.11")  //kafka的版本号。
            .topic("test")   //哪个主题作为数据源。
            .property(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "hadoop102:9092")  //服务器的信息
            .property(ConsumerConfig.GROUP_ID_CONFIG, "BigData")) //消费者组,随便起的。
            .withFormat(new Json())
            .withSchema(new Schema()
                    .field("xxx", DataTypes.STRING())
                    ....  //其他的字段
                    .field("pt", DataTypes.TIMESTAMP(3)).proctime())//加了一个新的字段,3是精度。
            .createTemporaryTable("kafkaSource");   //创建临时表

在这里插入图片描述

二、EventTime

1)DataStream转化成Table时指定

事件时间必须申明时间语义!!!

    //1.获取执行环境
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    env.setParallelism(1);
    //既然用的是事件时间,就要申明时间语义。
    env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
    //获取TableAPI执行环境
    StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

获取数据源(用端口进行举例)

     //2.读取端口数据转换为JavaBean
    //在转换为JavaBean类型之后,紧接着用assignTimestampsAndWatermarks方法提取时间戳。
    SingleOutputStreamOperator<SensorReading> sensorDS = env.socketTextStream("hadoop102", 9999)
            .map(line -> {
                String[] fields = line.split(",");
                return new SensorReading(fields[0],
                        Long.parseLong(fields[1]),
                        Double.parseDouble(fields[2]));
            })

            //提取时间戳,就是事件时间的时间戳,作为watermark。
            .assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<SensorReading>(Time.seconds(2)) {
                @Override
                public long extractTimestamp(SensorReading element) {
                    return element.getTs() * 1000L;
                }
            });      

流转换为表,并且指定时间字段。

    //3.将流转换为表,并指定处理时间字段
    //rt.rowtime中rowtime前面那个rt随便写,后面的rowtime是规定的。
    Table table = tableEnv.fromDataStream(sensorDS, "id,ts,temp,rt.rowtime");

大体过程就是这个样子。

在这里插入图片描述

2)定义Table Schema时指定
    //1.创建执行环境
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    env.setParallelism(1);
    env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
   //获取TableAPI执行环境
    StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

构建文件的连接器,在连接器里面指定事件时间。

    //2.构建文件的连接器
    //在连接器里面指定事件时间。
    tableEnv.connect(new FileSystem().path("sensor"))
            .withFormat(new OldCsv())
            .withSchema(new Schema()
                    ......  //其他字段。
                    .field("ts", DataTypes.BIGINT())
                    .rowtime(new Rowtime()
                            .timestampsFromField("ts")                  // 从字段中提取时间戳
                            .watermarksPeriodicBounded(1000)    // watermark延迟1秒
                            )
                ......  //其他字段。
            .createTemporaryTable("sourceTable");

在这里插入图片描述

最后,env.execute();

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值