首页 > 解决方案 > 欺诈检测 DataStream API 教程问题

问题描述

我正在关注这里的教程。

Q1 : 为什么在最终的应用程序中,flagState = true无论当前交易量如何,我们都会清除所有状态并删除计时器?我参考这部分代码:

// Check if the flag is set
if (lastTransactionWasSmall != null) {
    if (transaction.getAmount() > LARGE_AMOUNT) {
        //Output an alert downstream
        Alert alert = new Alert();
        alert.setId(transaction.getAccountId());

        collector.collect(alert);
    }
    // Clean up our state [WHY HERE?]
    cleanUp(context);
}

如果事务的数据流是0.5, 10, 600,那么flagState将设​​置为0.5然后清除为10。所以对于600,我们跳过上面的代码块并且不检查大量。但如果交易在一分钟内发生0.5600我们应该发送警报,但我们没有。

Q2:为什么我们用处理时间来判断两个交易是否相隔1分钟?事务类有一个timeStamp字段,所以使用事件时间不是更好吗?由于处理时间会受到应用程序速度的影响,因此两个事件时间在 1 分钟内的事务可能会因延迟而间隔 > 1 分钟处理。

标签: apache-flinkdata-stream

解决方案


A1:本例中使用的欺诈模型如下图所示:

在此处输入图像描述

在您的示例中,交易600必须立即跟随交易0.5才能被视为欺诈。由于 的中间交易10,即使所有三笔交易都在一分钟内发生,它也不是欺诈。这只是用例如何构建的问题。

A2:使用事件时间执行此操作将是一个非常有效的选择,但会使示例更加复杂。不仅需要水印,而且我们还必须按事件时间对流进行排序,因为实际示例必须考虑事件可能是无序的。

到那时,使用流程功能实现这一点将不再是最佳选择。使用 Flink 的 CEP 库或带有 MATCH_RECOGNIZE 的 Flink SQL 的时间模式匹配功能将是可行的方法。


推荐阅读