flink SQL 不支持嵌套 match_recognize 查询?
Nested match_recognize query not supported in flink SQL?
我正在使用 flink 1.11 并尝试嵌套查询,其中 match_recognize 位于其中,如下所示:
select * from events where id = (SELECT * FROM events MATCH_RECOGNIZE (PARTITION BY org_id ORDER BY proctime MEASURES A.id AS startId ONE ROW PER MATCH PATTERN (A C* B) DEFINE A AS A.tag = 'tag1', C AS C.tag <> 'tag2', B AS B.tag = 'tag2'));
我收到一个错误:org.apache.calcite.sql.validate.SqlValidatorException: Table 'A' not found
不支持吗?如果不是,还有什么选择?
我可以通过这样做得到一些东西:
Table events = tableEnv.fromDataStream(input,
$("sensorId"),
$("ts").rowtime(),
$("kwh"));
tableEnv.createTemporaryView("events", events);
Table matches = tableEnv.sqlQuery(
"SELECT id " +
"FROM events " +
"MATCH_RECOGNIZE ( " +
"PARTITION BY sensorId " +
"ORDER BY ts " +
"MEASURES " +
"this_step.sensorId AS id " +
"AFTER MATCH SKIP TO NEXT ROW " +
"PATTERN (this_step next_step) " +
"DEFINE " +
"this_step AS TRUE, " +
"next_step AS TRUE " +
")"
);
tableEnv.createTemporaryView("mmm", matches);
Table results = tableEnv.sqlQuery(
"SELECT * FROM events WHERE events.sensorId IN (select * from mmm)");
tableEnv
.toAppendStream(results, Row.class)
.print();
出于某种原因,我无法在不定义视图的情况下使其工作。我一直收到方解石错误。
我猜您是想避免在 MATCH_RECOGNIZE 的 MEASURES 子句中枚举 A 中的所有列。您可能想要比较生成的执行计划,看看是否存在任何显着差异。
我正在使用 flink 1.11 并尝试嵌套查询,其中 match_recognize 位于其中,如下所示:
select * from events where id = (SELECT * FROM events MATCH_RECOGNIZE (PARTITION BY org_id ORDER BY proctime MEASURES A.id AS startId ONE ROW PER MATCH PATTERN (A C* B) DEFINE A AS A.tag = 'tag1', C AS C.tag <> 'tag2', B AS B.tag = 'tag2'));
我收到一个错误:org.apache.calcite.sql.validate.SqlValidatorException: Table 'A' not found
不支持吗?如果不是,还有什么选择?
我可以通过这样做得到一些东西:
Table events = tableEnv.fromDataStream(input,
$("sensorId"),
$("ts").rowtime(),
$("kwh"));
tableEnv.createTemporaryView("events", events);
Table matches = tableEnv.sqlQuery(
"SELECT id " +
"FROM events " +
"MATCH_RECOGNIZE ( " +
"PARTITION BY sensorId " +
"ORDER BY ts " +
"MEASURES " +
"this_step.sensorId AS id " +
"AFTER MATCH SKIP TO NEXT ROW " +
"PATTERN (this_step next_step) " +
"DEFINE " +
"this_step AS TRUE, " +
"next_step AS TRUE " +
")"
);
tableEnv.createTemporaryView("mmm", matches);
Table results = tableEnv.sqlQuery(
"SELECT * FROM events WHERE events.sensorId IN (select * from mmm)");
tableEnv
.toAppendStream(results, Row.class)
.print();
出于某种原因,我无法在不定义视图的情况下使其工作。我一直收到方解石错误。
我猜您是想避免在 MATCH_RECOGNIZE 的 MEASURES 子句中枚举 A 中的所有列。您可能想要比较生成的执行计划,看看是否存在任何显着差异。