Flink 流转表,表转流,watermark设置

首先创建一个流

复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class Nan {
    private String xing;
    private String name;
    private Long ts;
}


StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
StreamTableEnvironment tenv = StreamTableEnvironment.create(env);

DataStreamSource<String> sourceNan = env.socketTextStream("hdp01", 1111);
DataStreamSource<String> sourceNv = env.socketTextStream("hdp01", 2222);

System.setProperty("java.net.preferIPv4Stack", "true");

SingleOutputStreamOperator<Nan> beanNan = sourceNan.map(new MapFunction<String, Nan>() {
    @Override
    public Nan map(String s) throws Exception {
        try {
            String[] split = s.split(",");
            return new Nan(split[0].substring(0, 1), split[1], Long.parseLong(split[2]));
        } catch (Exception e) {
            return null;
        }
    }
}).filter(Objects::nonNull).assignTimestampsAndWatermarks(
        WatermarkStrategy.<Nan>forMonotonousTimestamps().withTimestampAssigner(new SerializableTimestampAssigner<Nan>() {
    @Override
    public long extractTimestamp(Nan nan, long l) {
        return nan.getTs();
    }
})).returns(TypeInformation.of(Nan.class));

流转表

流转表的时候有一个点要注意,watermark必须要重新指定,否则会丢失,常用的方式如下

1、沿用流上的watermark

复制代码
tenv.createTemporaryView("nan", beanNan, Schema.newBuilder()
        .column("xing", DataTypes.STRING())
        .column("name", DataTypes.STRING())
        .column("ts", DataTypes.TIMESTAMP_LTZ(3))
        .watermark("rt","source_watermark()")
        .build() );

2、重新创建watermark

复制代码
tenv.createTemporaryView("nan", beanNan, Schema.newBuilder()
        .column("xing", DataTypes.STRING())
        .column("name", DataTypes.STRING())
        .column("rt", DataTypes.BIGINT())
        .watermark("rt","rt - interval '1' second")
        .build() );

3、根据内置属性rowtime创建watermark

复制代码
tenv.createTemporaryView("nan1", beanNan, Schema.newBuilder()
        .column("xing", DataTypes.STRING())
        .column("name", DataTypes.STRING())
        .column("ts", DataTypes.BIGINT())
        .columnByMetadata("rt", DataTypes.TIMESTAMP_LTZ(3),"rowtime")
        .watermark("rt","rt - interval '1' second")
        .build() );

使用表

复制代码
TableResult tableResult = tenv.executeSql("select *,current_watermark(rt) from nan");
tableResult.print();
相关推荐
秃头菜狗33 分钟前
十四、运行经典案例 wordcount
大数据·linux·hadoop
INFINI Labs39 分钟前
Elasticsearch 备份:方案篇
大数据·elasticsearch·搜索引擎·gateway·snapshot·backup·ccr
Java战神42 分钟前
Hadoop
大数据·hadoop·分布式
望获linux1 小时前
【实时Linux实战系列】实时系统的可观测性:Prometheus 与 Grafana 集成
大数据·linux·服务器·开发语言·网络·操作系统
玄妙尽在颠倒间2 小时前
SQL中的四大核心语言:DQL、DML、DDL、DCL
大数据·数据库
还是大剑师兰特3 小时前
Flink面试题及详细答案100道(61-80)- 时间与窗口
flink·大剑师·flink面试题
周杰伦_Jay3 小时前
【Git操作详解】Git进行版本控制与管理,包括分支,提交,合并,标签、远程仓库查看
大数据·ide·git·科技·分类·github
lifallen4 小时前
从Apache Doris 学习 HyperLogLog
java·大数据·数据仓库·算法·apache
DolphinScheduler社区5 小时前
# 3.1.8<3.2.0<3.3.1,Apache DolphinScheduler集群升级避坑指南
java·大数据·开源·apache·任务调度·海豚调度
智海观潮7 小时前
HBase高级特性、rowkey设计以及热点问题处理
大数据·hadoop·hbase