我想用Apache Flink批量处理两个文件,一个接一个。
对于一个具体的例子:假设我想为每一行分配一个索引,这样第二个文件中的行跟在第一行之后。以下代码不是这样做,而是交错两个文件中的行:
val env = ExecutionEnvironment.getExecutionEnvironment
val text1 = env.readTextFile("/path/to/file1")
val text2 = env.readTextFile("/path/to/file2")
val union = text1.union(text2).flatMap { ... }
我想确保首先通过text1
运算符发送所有flatMap
,然后然后发送所有text2
。建议的方法是什么?
提前感谢您的帮助。
答案 0 :(得分:2)
DataSet.union()
不提供跨输入的任何订单保证。来自同一输入分区的记录将按顺序保留,但将与来自其他输入的记录合并。
但是有一个更基本的问题。 Flink是一个并行数据处理器。并行处理数据时,无法保留全局顺序。例如,当Flink并行读取文件时,它会尝试拆分这些文件并独立处理每个拆分。分割是在没有任何特定顺序的情况下分发的。因此,单个文件的记录已经被洗牌。您需要将整个作业的并行度设置为1并实现自定义InputFormat
以使其正常工作。
你可以做到这一点,但它不会并行,你需要调整很多东西。我不认为Flink是这项任务的最佳工具。 您是否考虑过使用简单的unix命令行工具来连接文件?