【问题标题】:How to output one data stream to different outputs depending on the data?如何根据数据将一个数据流输出到不同的输出?
【发布时间】:2015-10-29 12:22:17
【问题描述】:

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

  • /output/P1
  • /output/P2

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

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

这可以通过 Flink API 来实现吗,如果可以,如何实现?如果没有,是否有第三方库可以做到,或者我必须自己构建这样的东西?

【问题讨论】:

  • 请不要在答案中添加解决方案。如果尚未提出答案,您可以在下面发布自我答案

标签: java apache-flink flink-streaming


【解决方案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")

【讨论】:

  • 谢谢!我检查了FileSinkFunction 的实现,并自己想出了类似的东西。我将实现添加到我的问题中以供参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 2015-02-03
  • 1970-01-01
  • 2021-06-25
  • 2017-02-23
  • 1970-01-01
相关资源
最近更新 更多