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();
相关推荐
jikemaoshiyanshi12 小时前
Amazon Bedrock 和 SageMaker Inference 分别适合哪些企业大模型部署场景?
大数据·人工智能
汉知宝科技13 小时前
专利管理软件的监控功能:从专利公开到情报获取
大数据·运维
合合技术团队13 小时前
合合信息携手中科软发布智能化方案,推动AI融入保险理赔、核保与风控多节点
大数据·人工智能·文档智能·数据智能
zyplayer-doc13 小时前
核心制度不该被随手修改:用zyplayer-doc锁定文档和全部子文档
大数据·数据库·人工智能·笔记·pdf·ocr
数据百晓通13 小时前
2026 数智化选型白皮书:全赛道商业 ChatBI 深度解析
大数据·人工智能·microsoft
2401_8652616313 小时前
亦唐科技(YIKTONG):驱动国产贴片机迈向智能化未来
大数据·人工智能
jikemaoshiyanshi1 天前
AWS 中国峰会 2026 有哪些 AI Agent 相关演讲可以看?按业务、研发与生产阶段选看
大数据·人工智能
神王宝宝 王者小学1 天前
HBase: 看上去很美
大数据·数据库·hbase
科技圈观察1 天前
选哪家服务商做跨境业务KYC数字身份认证和合规支持?2026出海选型参考
大数据·人工智能
名不经传的养虾人1 天前
从0到1:企业级AI项目迭代日记 Vol.82|审批不再只写数据库,而是真正恢复执行
大数据·人工智能·ai编程·企业ai·多agent协作