如何根据数据将一个数据流输出到不同的输出?

2022-09-02 14:03:26

在Apache Flink中,我有一个元组流。让我们假设一个非常简单的.元组的值字段中可以有任意值(例如'P1','P2'等)。可能值的集合是有限的,但我事先不知道完整的集合(所以可能有一个“P362”)。我想根据元组内部的值将该元组写入某个输出位置。例如,我希望具有以下文件结构:Tuple1<String>

  • /output/P1
  • /output/P2

在文档中,我只找到了写入我事先知道的位置(例如)的可能性,但没有办法让数据的内容决定数据的实际结束位置。stream.writeCsv("/output/somewhere")

我在文档中阅读了有关输出拆分的信息,但这似乎并没有提供一种将输出重定向到不同目标的方法,就像我希望的那样(或者我只是不明白这将如何工作)。

这可以通过 Flink API 完成,如果是这样,如何完成?如果没有,也许有一个第三方库可以做到这一点,或者我必须自己构建这样的东西吗?


答案 1

可以实现自定义接收器。继承自以下两者之一:

  • org.apache.flink.streaming.api.functions.sink.SinkFunction
  • org.apache.flink.streaming.api.functions.sink.RichSinkFunction

在您的程序中使用:

stream.addSink(SinkFunction<T> sinkFunction);

而不是。stream.writeCsv("/output/somewhere")


答案 2

推荐