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

How to output one data stream to different outputs depending on the data?

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

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

我在文档中阅读了关于输出拆分的信息,但这似乎没有提供一种方法来按照我希望的方式将输出重定向到不同的目的地(或者我只是不明白它是如何工作的).

这可以用 Flink API 来完成,如果可以,怎么做?如果没有,是否有第三方库可以做到这一点,或者我必须自己构建这样的东西吗?

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

  • 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")