温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Apache Flink 官方文档--流(DataStream API)-旁路输出

发布时间:2020-07-18 16:35:03 来源:网络 阅读:2181 作者:Lynn_Yuan 栏目:大数据

旁路输出(side output)

  除了来自数据流算子的主流结果输出之外,可以产生任意数量的流旁路输出结果。旁路输出结果数据类型与主流结果的数据类型以及其他旁路输出结果数据类型可以是完全不同的。当你需要分割数据流时,这个算子非常有用。通常需要复制流,然后从每个数据流中过滤掉不需要的数据。
  当使用旁路输出时,首先需要定义一个OutputTag来标识一个旁路输出流。
Java

// this needs to be an anonymous inner class, so that we can analyze the type
OutputTag<String> outputTag = new OutputTag<String>("side-output") {};

Scala

val outputTag = OutputTag[String]("side-output")

  注意OutputTag是如何根据旁路输出流包含的元素类型typed的。
  可以通过以下函数发射数据到旁路输出。

  • ProcessFunction
  • CoProcessFunction
  • ProcessWindowFunction
  • ProcessAllWindowFunction

  可以使用Context参数(在上述函数中向用户暴露)将数据发送到OutputTag标识的旁路输出。以下是从ProcessFunction发出旁路输出数据的示例:
Java:

DataStream<Integer> input = ...;

final OutputTag<String> outputTag = new OutputTag<String>("side-output"){};

SingleOutputStreamOperator<Integer> mainDataStream = input
  .process(new ProcessFunction<Integer, Integer>() {

      @Override
      public void processElement(
          Integer value,
          Context ctx,
          Collector<Integer> out) throws Exception {
        // emit data to regular output
        out.collect(value);

        // emit data to side output
        ctx.output(outputTag, "sideout-" + String.valueOf(value));
      }
    });

Scala:

val input: DataStream[Int] = ...
val outputTag = OutputTag[String]("side-output")

val mainDataStream = input
  .process(new ProcessFunction[Int, Int] {
    override def processElement(
        value: Int,
        ctx: ProcessFunction[Int, Int]#Context,
        out: Collector[Int]): Unit = {
      // emit data to regular output
      out.collect(value)

      // emit data to side output
      ctx.output(outputTag, "sideout-" + String.valueOf(value))
    }
  })

  要读取旁路输出流,在数据流运算后使用getSideOutput(OutputTag)。此时将会获得键入旁路输出流的结果。
Java:

final OutputTag<String> outputTag = new OutputTag<String>("side-output"){};

SingleOutputStreamOperator<Integer> mainDataStream = ...;

DataStream<String> sideOutputStream = mainDataStream.getSideOutput(outputTag);

Scala:

val outputTag = OutputTag[String]("side-output")

val mainDataStream = ...

val sideOutputStream: DataStream[String] = mainDataStream.getSideOutput(outputTag)
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI