如何将多个DataStream写入单个文件

时间:2016-08-30 14:10:11

标签: scala apache-flink flink-streaming

假设我有两个不同类型的DataStream

val stream1: DataStream[(Int, Int, Int)] = ...
val stream2: DataStream[(Int, Int, Int, Int, Float)] = ...

如何将两个流写入单个文件

我尝试了不同的东西,但似乎没有用。例如,我不能直接写作

stream1.writeAsText("path/to/file.txt").setParallelism(1)
stream2.writeAsText("path/to/file.txt").setParallelism(1)

因为Flink会抱怨以下消息:

java.io.IOException: File or directory already exists.
Existing files and directories are not overwritten in NO_OVERWRITE mode. 
Use OVERWRITE mode to overwrite existing files and directories.

另一方面,我不能这样覆盖:

stream1.writeAsText("path/to/file.txt").setParallelism(1)
stream2.writeAsText("path/to/file.txt", FileSystem.WriteMode.OVERWRITE).setParallelism(1)

因为(据我所知)第二个流将覆盖第一个流写的任何内容。

最后,我考虑过像这样连接流

val connectedStream: ConnectedStream = stream1.connect(stream2)

然后我会得到一个ConnectedStream,它没有writeAsText方法。

(为了记录,我实际上有4个流,我想写入一个文件)。

1 个答案:

答案 0 :(得分:0)

一个非常简单的解决方案是为每个流使用映射器将每个事件映射到String(或其他常见类型,如byte[])。然后,您有四个具有相同类型(DataStream[String])的流,您可以将它们合并为一个流,并将其作为一个流写入文件。

这看起来如下:

val s1: DataStream[String] = ???
val s2: DataStream[String] = ???
val s3: DataStream[String] = ???
val s4: DataStream[String] = ???

val out: DataStream[String] = s1.union(s2).union(s3).union(s4)
out.writeAsText("path/to/file")