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();
相关推荐
zskj_zhyl4 小时前
智慧养老丨从依赖式养老到自主式养老:如何重构晚年生活新范式
大数据·人工智能·物联网
哲科软件5 小时前
从“电话催维修“到“手机看进度“——售后服务系统开发如何重构客户体验
大数据·智能手机·重构
zzywxc7875 小时前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring
专注API从业者5 小时前
构建淘宝评论监控系统:API 接口开发与实时数据采集教程
大数据·前端·数据库·oracle
一瓣橙子6 小时前
缺少关键的 MapReduce 框架文件
大数据·mapreduce
永洪科技13 小时前
永洪科技荣获商业智能品牌影响力奖,全力打造”AI+决策”引擎
大数据·人工智能·科技·数据分析·数据可视化·bi
weixin_3077791314 小时前
Hive集群之间迁移的Linux Shell脚本
大数据·linux·hive·bash·迁移学习
上海锝秉工控17 小时前
防爆拉线位移传感器:工业安全的“隐形守护者”
大数据·人工智能·安全
cv高级工程师YKY17 小时前
SRE - - PV、UV、VV、IP详解及区别
大数据·服务器·uv
bxlj_jcj18 小时前
深入Flink核心概念:解锁大数据流处理的奥秘
大数据·flink