Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flink Flink CEP无法在联合表上获得正确的结果_Apache Flink - Fatal编程技术网

Apache flink Flink CEP无法在联合表上获得正确的结果

Apache flink Flink CEP无法在联合表上获得正确的结果,apache-flink,Apache Flink,我使用flinksql和CEP来识别一些非常简单的模式。然而,我发现了一个奇怪的东西(可能是一个bug)。我有两个示例表password\u change和transfer,如下所示 转移 密码更改 下面是我的SQL查询 首先创建一个临时视图事件 (SELECT accountnumber,rowtime,eventtype FROM password_change WHERE channel='ONL') UNION ALL (SELECT accountnumber,rowtime, e

我使用flinksql和CEP来识别一些非常简单的模式。然而,我发现了一个奇怪的东西(可能是一个bug)。我有两个示例表
password\u change
transfer
,如下所示

转移

密码更改

下面是我的SQL查询

首先创建一个临时视图事件

(SELECT accountnumber,rowtime,eventtype FROM password_change WHERE channel='ONL') 
UNION ALL 
(SELECT accountnumber,rowtime, eventtype FROM transfer WHERE channel = 'ONL' )
rowtime列是直接从原始eventtime列中提取的事件时间,水印周期限制为1秒

然后输出的查询结果

SELECT * FROM `event`
    MATCH_RECOGNIZE ( 
        PARTITION BY accountnumber 
        ORDER BY rowtime 
        MEASURES 
            transfer.eventtype AS event_type,
            transfer.rowtime AS transfer_time
        ONE ROW PER MATCH 
        AFTER MATCH SKIP PAST LAST ROW
        PATTERN (transfer password_change )  WITHIN INTERVAL '5' SECOND 
        DEFINE 
            password_change AS eventtype='password_change', 
            transfer AS eventtype='transfer' 
    )
它应该输出

123,transfer,2020-01-01T01:00:03Z
456,transfer,2020-01-01T01:00:04Z
但我在运行Flink 1.11.1时什么也没有得到(1.10.1也没有输出)

更重要的是,我将模式更改为仅
password\u change
,它仍然不输出任何内容,但是如果我将模式更改为
transfer
,那么它将输出几行,但不是所有的传输行。如果我交换两个表的eventtime,这意味着首先要更改密码,那么模式
password\u change
将输出几行,而
transfer
不会

另一方面,如果我从两个表中提取这些列并手动将它们合并到一个表中,然后将它们发送到Flink中,则运行结果是正确的

我搜索并尝试了很多方法,包括更改SQL语句、水印、缓冲区超时等,但没有任何帮助。希望这里的任何人都能帮忙。谢谢

2020年10月10日更新:

我使用卡夫卡作为表源
tEnv
是StreamTableEnvironment

Kafka-Kafka=新卡夫卡()
.版本(“通用”)
.property(“bootstrap.servers”、“localhost:9092”);
连接(
卡夫卡主题(“转移”)
).withFormat(
新的Json()
.failOnMissingField(真)
).怀斯切玛(
新模式()
.field(“行时间”,数据类型。时间戳(3))
.rowtime(新的rowtime()
.timestampsFromField(“事件时间”)
.水印(1000)
)
.field(“通道”,数据类型.STRING())
.field(“eventtype”,DataTypes.STRING())
.field(“transid”,DataTypes.STRING())
.field(“accountnumber”,DataTypes.STRING())
.字段(“值”,数据类型.十进制(38,18))
).createTemporaryTable(“转让”);
连接(
卡夫卡主题(“pchange”)
).withFormat(
新的Json()
.failOnMissingField(真)
).怀斯切玛(
新模式()
.field(“行时间”,数据类型。时间戳(3))
.rowtime(新的rowtime()
.timestampsFromField(“事件时间”)
.水印(1000)
)
.field(“通道”,数据类型.STRING())
.field(“accountnumber”,DataTypes.STRING())
.field(“eventtype”,DataTypes.STRING())
).createTemporaryTable(“密码更改”);
谢谢@Dawid Wysakowicz的回答。为了确认这一点,我在
transfer
表的末尾添加了
4123,1200,ONL,2020-01-01T01:00:10Z,transfer
,然后输出变为正确,这意味着这确实是关于水印的问题

所以现在的问题是如何修复它。由于用户不会频繁更改其密码,因此这两个表之间的时间间隔是不可避免的。我只需要UNIONALL表与我手动合并的表具有相同的行为

更新日期:2020年11月4日:

可能会有帮助。

最有可能的问题是与UNION ALL运算符一起生成水印。您能否分享一下创建这两个表的方法,包括如何定义时间属性以及连接器是什么?这可以让我证实我的怀疑

我认为问题在于,其中一个来源停止发出水印。如果
传输
表(或时间戳较低的表)未完成且未生成任何记录,则不会发出水印。发出第四行后,它将发出
水印=3(4-1秒)
。输入并集的水印是两个值中最小的。因此,第一个表将暂停/保持值为
Watermark=3
的水印,因此您看到原始查询没有进展,并且您看到一些时间戳较小的表发出的记录


如果手动连接两个表,则只有一个输入和一个水印源,因此它会进一步发展,并看到一些结果。

问题很可能是与
UNION ALL
运算符一起生成水印。你能分享一下你是如何创建这两个表的,包括你是如何定义时间属性的吗。你刚刚救了我两天的头痛。如上所述,我在
transfer
中添加了一个新行,并确认了问题。你知道我该怎么修吗?有没有办法更改UNION ALL的水印行为?
SELECT * FROM `event`
    MATCH_RECOGNIZE ( 
        PARTITION BY accountnumber 
        ORDER BY rowtime 
        MEASURES 
            transfer.eventtype AS event_type,
            transfer.rowtime AS transfer_time
        ONE ROW PER MATCH 
        AFTER MATCH SKIP PAST LAST ROW
        PATTERN (transfer password_change )  WITHIN INTERVAL '5' SECOND 
        DEFINE 
            password_change AS eventtype='password_change', 
            transfer AS eventtype='transfer' 
    )
123,transfer,2020-01-01T01:00:03Z
456,transfer,2020-01-01T01:00:04Z