Flink-KeyedProcessFuntion中ValueState<Boolean>与Boolean的区别

背景

在项目开发中,遇到如下场景:将数据按照业务逻辑分组,接下来的所有计算以组为单位;当第一条数据传入时,以当前数据的时间对应天的结束时间为定时触发时间,做定时。下一次的定时与上一次定时的时间间隔为86400s;

数据结构与备用数据

/**
* @author DSH12138
* @since 2020-11-02
* 原始数据结构
* */

@Data
@NoArgsConstructor
@ToString
public class SourceDataScheme {
   

    private String plant;
    private Float values;
    private String device;
    private Long timestamp;

    public SourceDataScheme(String plant, Float values, String device, Long timestamp) {
   
        this.plant = plant;
        this.values = values;
        this.device = device;
        this.timestamp = timestamp;
    }
}

测试数据:

SourceDataScheme(plant=MS003, values=1, device=DXL480, timestamp=1603788065000)
SourceDataScheme(plant=MS001, values=2, device=DGS301, timestamp=1603788065000)
SourceDataScheme(plant=MS003, values=3, device=DXL479, timestamp=1603788065000)
SourceDataScheme(plant=MS003, values=4, device=DXL478, timestamp=1603788065000)
SourceDataScheme(plant=MS003, values=5, device=DXL477, timestamp=1603788065000)
SourceDataScheme(plant=MS003, values=6, device=DXL476, timestamp=1603788065000)
SourceDataScheme(plant=MS003, values=7, device=DXL475, timestamp=1603788065000)
SourceDataScheme(plant=MS003, values=8, device=DXL474, timestamp=1603788065000)
SourceDataScheme(plant=MS003, values=9, device=DXL473, timestamp=1603788065000)
SourceDataScheme(plant=MS003, values=10, device=DXL472, timestamp=1603788065000)
SourceDataScheme(plant=MS003, values=11, device=DXL471, timestamp=1603788065000)
================================================================================
SourceDataScheme(plant=MS003, values=12, device=DXL480, timestamp=1603788066000)
SourceDataScheme(plant=MS001, values=13, device=DGS301, timestamp=1603788066000
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Flink CEP 的例子: 假设我们有一个数据流,它包含了用户的登录和登出事件,我们想要在用户登录后的 10 分钟内检测到用户的登出事件,以便我们可以计算用户的在线时间。我们可以使用 Flink CEP 来实现这个功能。 首先,我们需要定义登录和登出事件的数据结构: ```java public class LoginEvent { public long userId; public String ip; public String eventType; public long timestamp; } public class LogoutEvent { public long userId; public long timestamp; } ``` 然后,我们可以创建一个 Flink DataStream,并使用 Flink CEP 来定义模式,以便检测用户的登录和登出事件: ```java DataStream<LoginEvent> loginEventStream = ... Pattern<LoginEvent, ?> loginPattern = Pattern.<LoginEvent>begin("start") .where(new SimpleCondition<LoginEvent>() { @Override public boolean filter(LoginEvent loginEvent) throws Exception { return "login".equals(loginEvent.eventType); } }); Pattern<LogoutEvent, ?> logoutPattern = Pattern.<LogoutEvent>begin("start") .where(new SimpleCondition<LogoutEvent>() { @Override public boolean filter(LogoutEvent logoutEvent) throws Exception { return true; } }) .within(Time.minutes(10)); PatternStream<LoginEvent> patternStream = CEP.pattern( loginEventStream.keyBy("userId"), loginPattern.followedByAny(logoutPattern)); DataStream<Tuple2<Long, Long>> onlineTimeStream = patternStream.select( (Map<String, LoginEvent> first, Map<String, LogoutEvent> second) -> { long userId = first.get("start").userId; long startTime = first.get("start").timestamp; long endTime = second.get("start").timestamp; return Tuple2.of(userId, endTime - startTime); }); ``` 在上面的代码,我们定义了两个模式:登录模式和登出模式。登录模式表示一个用户的登录事件,而登出模式表示一个用户的登出事件。我们使用 keyBy() 方法将数据流按照用户 ID 进行分区,并使用 followedByAny() 方法将登录模式和登出模式组合在一起。 最后,我们可以使用 select() 方法来处理匹配到的模式,并计算用户的在线时间。在 select() 方法,我们从匹配到的模式获取用户 ID、登录时间和登出时间,并计算在线时间。 以上就是一个简单的 Flink CEP 的例子。在实际应用,我们可以根据需要定义更复杂的模式,并使用 Flink CEP 来实现各种复杂的业务逻辑。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值