Apache flink FLINK-如何处理sql查询结果上的逻辑

Apache flink FLINK-如何处理sql查询结果上的逻辑,apache-flink,flink-streaming,flink-cep,flink-sql,flink-batch,Apache Flink,Flink Streaming,Flink Cep,Flink Sql,Flink Batch,我的需求是围绕flink中sql查询的结果处理或构建一些逻辑。为了简单起见,假设我有两个sql查询,它们运行在不同的窗口大小和一个事件流上。我的问题是 a)我如何知道这是哪个查询结果 b)我如何知道有多少行是已执行查询的结果?我需要这些信息,因为我必须构建一个带有事件列表的通知消息,这些事件列表是查询结果的一部分 DataStream ds=。。。 String query=“选择id,键”+ “按翻滚(行时,间隔'10'秒)、id、键从事件表组”; String query1=“选择id,

我的需求是围绕flink中sql查询的结果处理或构建一些逻辑。为了简单起见,假设我有两个sql查询,它们运行在不同的窗口大小和一个事件流上。我的问题是

  • a)我如何知道这是哪个查询结果
  • b)我如何知道有多少行是已执行查询的结果?我需要这些信息,因为我必须构建一个带有事件列表的通知消息,这些事件列表是查询结果的一部分
DataStream ds=。。。
String query=“选择id,键”+
“按翻滚(行时,间隔'10'秒)、id、键从事件表组”;
String query1=“选择id,键”+
“按翻滚(行时,间隔“1”天)、id、键从事件表组”;
列表=新的ArrayList();
列表.添加(查询);
列表。添加(查询1);
tabEnv.createTemporaryView(“eventTable”、ds、$(“id”)、$(“timeLong”)、$(“key”)、$(“rowTime”).rowTime();
对于(int i=0;i

谢谢你的帮助。感谢Ashutosh

对来自哪个查询的结果进行排序,您可以在查询本身中包含每个查询的标识符,例如

按翻滚(行时,间隔“10”秒)、id、键从eventTable组中选择“10秒”
确定结果表中的行数更为棘手。一个问题是,流式查询的结果数量没有最终答案。但是在处理结果的地方,似乎可以计算行数


或者,我还没有尝试过这种方法,但也许你可以使用类似于
行数()的方法(按顺序滚动行时(行时,间隔'10'秒))
用计数器注释结果的每一行。

谢谢@David,我将尝试这种解决方案。由于结果是在流中的,即使我向查询添加了标识符,也很难说查询结果已经完成,也很难对该结果集执行操作。我是否应该等待几秒钟,然后假设所有行都是根据标识符在流中到达的,并且可以处理。请建议如果输入是有界的,您可以使用批处理而不是流式运行时,这样可以更容易地知道结果是否完整。如果连续获取查询结果,按照可能的解决方案中的建议添加标识符“10sec”将无法解决问题。对于我来说,输入事件是无限制的,它会解决问题并继续获取查询结果的完整性:(@Ashutosh我不确定你所说的“完整性”是什么意思)。水印可与事件时间戳一起使用,以确定每个窗口何时完成。但是,如果输入流是无界的,那么结果流就没有尽头。每个窗口将只生成一个结果,但除非输入停止,否则将永远存在一个接一个的窗口。
DataStream<Event> ds = ...        
String query = "select id, key" +
                "  from  eventTable  GROUP BY TUMBLE(rowTime, INTERVAL '10' SECOND), id, key ";

        String query1 = "select id, key" +
                "  from  eventTable  GROUP BY TUMBLE(rowTime, INTERVAL '1' DAY), id, key ";
        List<String> list = new ArrayList<>();
        list.add(query);
        list.add(query1);
       
        tabEnv.createTemporaryView("eventTable", ds, $("id"), $("timeLong"), $("key"),$("rowTime").rowtime());


        for(int i =0; i< list.size(); i++ ){
            Table result = tabEnv.sqlQuery(list.get(i));
            DataStream<Tuple2<Boolean, Row>> dsRow = tabEnv.toRetractStream(result, Row.class);
            dsRow.process(new ProcessFunction<Tuple2<Boolean, Row>, Object>() {

            List<Row> listRow = new ArrayList<>();
            @Override
            public void processElement(Tuple2<Boolean, Row> booleanRowTuple2, Context context, Collector<Object> collector) throws Exception {
                listRow.add(booleanRowTuple2.f1);
            }
            });
        }