Apache flink 集成DataStreamAPI和TableAPI

Apache flink 集成DataStreamAPI和TableAPI,apache-flink,flink-streaming,flink-cep,flink-table-api,Apache Flink,Flink Streaming,Flink Cep,Flink Table Api,除此之外,我创建了这个示例来集成DataStreamAPI和TableAPI,这次我没有错误,我有两个作业而不是一个,一个是为运行完美的datastreampi创建的,另一个作业是为运行良好的TableAPI创建的,但唯一的问题是从未从datastreampi接收任何值,例如: /*FILTERING NULL IDs*/ final SingleOutputStreamOperator<Event> stream_filtered = eventsS

除此之外,我创建了这个示例来集成
DataStreamAPI
TableAPI
,这次我没有错误,我有两个作业而不是一个,一个是为运行完美的
datastreampi
创建的,另一个作业是为运行良好的
TableAPI
创建的,但唯一的问题是从未从
datastreampi
接收任何值,例如:

        /*FILTERING NULL IDs*/
        final SingleOutputStreamOperator<Event> stream_filtered = eventsStream
                .filter(new NullidEventsFilterFunction())
                .uid("id_filter_operator")
                .name("Event Filter");

        final StreamTableEnvironment fsTableEnv = StreamTableEnvironment.create(TableEnvironmentConfiguration.getEnv(), fsSettings);
        SingleOutputStreamOperator<String> toTable = stream_filtered.map(x -> x.id).name("Map for table");
        Table source = fsTableEnv.fromDataStream(toTable);
        source.execute(); /*without this line the TableAPI job is not started, but nothing happens if is not there either*/
        DataStream<String> finalRes = fsTableEnv.toAppendStream(source, String.class);
        finalRes.map((MapFunction<String, String>) value -> value)
                .name("Mapping after table")
                .addSink(new SinkFunction<String>() {
            @Override
            public void invoke(String value) {
                LOG.info("Record from table: " + value);
            }
        }).name("Sink after map from table");
        
        /*STARTING TRANSFORMATIONS*/
        Init.init(stream_filtered);
        env.execute(job_name);
但没有收到或发出任何记录

查看
数据流作业的图像

并查看
TableAPI
作业的图像

有什么想法吗? 提前谢谢。
亲切的问候
import org.apache.flink.api.java.tuple.Tuple2;
导入org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
导入org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
导入org.apache.flink.table.api.table;
导入org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
导入org.apache.flink.types.Row;
导入静态org.apache.flink.table.api.Expressions.$;
公共类来回{
公共静态void main(字符串[]args)引发异常{
StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment tableEnv=StreamTableEnvironment.create(env);
SingleOutputStreamOperator rawInput=env.fromElements(
新的Tuple2(“u2”,0L),
新的Tuple2(“u1”,5L),
新元组2(“u2”,1L),
新元组2(“u3”,1L),
新的Tuple2(“u1”,0L),
新的Tuple2(“u1”,3L),
新的Tuple2(“u2”,2L));
TableEvents=tableEnv.fromDataStream(rawInput,$(“用户ID”),$(“值”);
表结果=事件
。选择($(“用户ID”)、$(“值”))
。其中($(“值”)。大于(0);
tableEnv
.toAppendStream(结果,行.类)
.print();
execute();
}
}

您可能会担心,在web UI中,它会显示“已发送的记录:0”和“已接收的记录:0”。这是非常误导的。这些Flink度量仅测量Flink中的记录和字节流,不报告外部系统的任何i/o。这些指标也不报告链接在一起的运算符之间的记录和字节流。在这两个作业中的每一个都是链式的,所以在这种情况下发送/接收的记录/字节将永远为零。

< p>如果您想用数据流API来开始和结束一个作业,并在中间使用表API,那么这里有一个简单的例子。 请注意,所涉及的细节随着版本的不同而有所变化,这个特定的示例与使用Flink 1.11编写的示例一样有效。正在努力使这变得更容易

import org.apache.flink.api.java.tuple.Tuple2;
导入org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
导入org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
导入org.apache.flink.table.api.table;
导入org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
导入org.apache.flink.types.Row;
导入静态org.apache.flink.table.api.Expressions.$;
公共类来回{
公共静态void main(字符串[]args)引发异常{
StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment tableEnv=StreamTableEnvironment.create(env);
SingleOutputStreamOperator rawInput=env.fromElements(
新的Tuple2(“u2”,0L),
新的Tuple2(“u1”,5L),
新元组2(“u2”,1L),
新元组2(“u3”,1L),
新的Tuple2(“u1”,0L),
新的Tuple2(“u1”,3L),
新的Tuple2(“u2”,2L));
TableEvents=tableEnv.fromDataStream(rawInput,$(“用户ID”),$(“值”);
表结果=事件
。选择($(“用户ID”)、$(“值”))
。其中($(“值”)。大于(0);
tableEnv
.toAppendStream(结果,行.类)
.print();
execute();
}
}

您可能会担心,在web UI中,它会显示“已发送的记录:0”和“已接收的记录:0”。这是非常误导的。这些Flink度量仅测量Flink中的记录和字节流,不报告外部系统的任何i/o。这些指标也不报告链接在一起的运算符之间的记录和字节流。这两个作业中的所有内容都是链接的,因此在这种情况下,发送/接收的记录/字节数始终为零。

带有示例的答案在这个堆栈溢出帖子中:带有示例的答案在这个堆栈溢出帖子中:
INFO  org.apache.flink.runtime.executiongraph.ExecutionGraph        - Source: Custom Source -> Event Mapper -> Watermarks Added -> Event Filter -> Map for table -> SourceConversion(table=[Unregistered_DataStream_5], fields=[f0]) -> SinkConversionToRow -> Sink: Select table sink (1/1) (0d3cd78d35480c44f09603786bf775e7) switched from DEPLOYING to RUNNING.