Apache flink 是否有一种方法可以只将过滤后的事件从Apache Flink流传递到AsyncDataStream/AsyncIO流?

Apache flink 是否有一种方法可以只将过滤后的事件从Apache Flink流传递到AsyncDataStream/AsyncIO流?,apache-flink,Apache Flink,所以我有一堆Json日志和一个我有一个验证/过滤出所需Json的流,这非常好 现在我想使用AsyncIO从过滤后的Json执行DB查找,但似乎asyncInvoke是在流的每个输入上执行的,而不是在过滤后的结果上执行的 DataStream<String> stringInputStream = env.addSource(flinkKafkaConsumer); stringInputStream .flatMap(stringToJsonObject()) // Mak

所以我有一堆Json日志和一个我有一个验证/过滤出所需Json的流,这非常好

现在我想使用AsyncIO从过滤后的Json执行DB查找,但似乎asyncInvoke是在流的每个输入上执行的,而不是在过滤后的结果上执行的

DataStream<String> stringInputStream = env.addSource(flinkKafkaConsumer);

stringInputStream
    .flatMap(stringToJsonObject()) // Make sure only JSON logs go through.
    .returns(JsonObject.class)
    .filter(filterLogs("my-app")) // Filter logs for my-app
    .flatMap(jsonStringToJsonObject("someJsonEncodedStringField"))
    .returns(JsonObject.class)
    .filter(filterSpecificEvent()); // This stream works as expected, putting print() here only prints filtered events.

DataStream<JsonObject> lookupCarrierCodeStream = 
    AsyncDataStream.orderedWait(stringInputStream, lookupCodesInDB(), 3000, TimeUnit.MILLISECONDS, 100);

private static RichAsyncFunction<String, JsonObject> lookupCodesInDB() {
  return new RichAsyncFunction<String, JsonObject>() {
      @Override
      public void asyncInvoke(String input, ResultFuture<JsonObject> resultFuture) throws Exception {
          // This seems to receive all events, rather then the filtered ones.
          System.out.println("Input:" + input);

          resultFuture.complete(Collections.singleton(new JsonObject(input)));
      }
  };
}
DataStream stringInputStream=env.addSource(flinkkafaconsumer);
stringInputStream
.flatMap(stringToJsonObject())//确保只通过JSON日志。
.returns(JsonObject.class)
.filter(filterLogs(“我的应用”)//筛选我的应用的日志
.flatMap(jsonString项目对象(“SomeJSoneCodedStringField”))
.returns(JsonObject.class)
.filter(filterSpecificeEvent());//此流按预期工作,将print()放在此处仅打印已过滤的事件。
数据流查找载体代码流=
AsyncDataStream.orderedWait(stringInputStream,lookupCodesInDB(),3000,TimeUnit.millides,100);
私有静态RichAsyncFunction lookupCodesInDB(){
返回新的RichAsyncFunction(){
@凌驾
public void asyncInvoke(字符串输入,ResultFuture ResultFuture)引发异常{
//这似乎接收所有事件,而不是过滤的事件。
System.out.println(“输入:”+输入);
resultFuture.complete(Collections.singleton)(新JsonObject(input));
}
};
}
更新

如果我像这样把溪流分开,这似乎是可行的

DataStream<String> kafkaStringInput = env.addSource(flinkKafkaConsumer);

DataStream<JsonObject> jsonLogsInput = ...;
DataStream<JsonObject> appLogsInput = ...;
DataStream<JsonObject> evenInput = ...;

DataStream<JsonObject> lookupStream = AsyncDataStream.orderedWait(evenInput, ...);
DataStream-kafkafstringput=env.addSource(flinkkafconsumer);
数据流jsonLogsInput=。。。;
数据流appLogsInput=。。。;
数据流输入=。。。;
DataStream lookupStream=AsyncDataStream.orderedWait(evenInput,…);

不确定为什么它不能流畅地工作,但可以。

将函数应用于流,如

eventStream
  .flatmap()
不修改eventStream,而是返回一个新流

所以你想做这样的事情:

DataStream<JsonObject>filteredStream = stringInputStream
  .flatMap(stringToJsonObject())
  .returns(JsonObject.class)
  .filter(filterLogs("my-app"))
  .flatMap(jsonStringToJsonObject("someJsonEncodedStringField"))
  .returns(JsonObject.class)
  .filter(filterSpecificEvent());

DataStream<JsonObject> lookupCarrierCodeStream = 
  AsyncDataStream.orderedWait(filteredStream, lookupCodesInDB(), 3000, TimeUnit.MILLISECONDS, 100);
DataStreamfilteredStream=stringInputStream
.flatMap(stringToJsonObject())
.returns(JsonObject.class)
.filter(filterLogs(“我的应用”))
.flatMap(jsonString项目对象(“SomeJSoneCodedStringField”))
.returns(JsonObject.class)
.filter(FilterSpecificationEvent());
数据流查找载体代码流=
AsyncDataStream.orderedWait(filteredStream,lookupCodesInDB(),3000,TimeUnit.毫秒,100);

是的!我的错!谢谢