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();
相关推荐
Oo_Amy_oO1 小时前
Airflow+Spark/Flink vs. Kettle
大数据·flink·spark
后端小肥肠1 小时前
港大团队开源LightRAG:知识图谱+双层检索,复杂问答准确率飙升30%
大数据·人工智能·openai
计算机毕设定制辅导-无忧学长13 小时前
TDengine 权限管理与安全配置实战(二)
大数据·安全·tdengine
2401_8979300613 小时前
Kibana 连接 Elasticsearch(8.11.3)教程
大数据·elasticsearch·jenkins
计算机毕设定制辅导-无忧学长13 小时前
TDengine 快速上手:安装部署与基础 SQL 实践(一)
大数据·sql·tdengine
塔能物联运维14 小时前
塔能科技:精准节能,擎动工厂可持续发展巨轮
大数据·运维
今天我又学废了14 小时前
Spark,HDFS概述
大数据·hdfs·spark
青云交15 小时前
Java 大视界 -- 基于 Java 的大数据机器学习模型在图像识别中的迁移学习与模型优化(173)
大数据·迁移学习·图像识别·模型优化·deeplearning4j·机器学习模型·java 大数据
Yan-英杰16 小时前
DeepSeek-R1模型现已登录亚马逊云科技
java·大数据·人工智能·科技·机器学习·云计算·deepseek
黄雪超16 小时前
Flink介绍——实时计算核心论文之Storm论文总结
大数据·论文阅读·storm