我有一个带有两个分叉的流,因此有两个SplitStream。
以下是代码:
static final class MyOutputSelector1 implements OutputSelector<Long> {
@Override
public Iterable<String> select(Long value) {
List<String> outputs = new ArrayList<>();
if (value < 5) {
outputs.add("valid1");
}
else {
outputs.add("error1");
}
return outputs;
}
}
static final class MyOutputSelector2 implements OutputSelector<Long> {
private static final long serialVersionUID = 1L;
@Override
public Iterable<String> select(Long value) {
List<String> outputs = new ArrayList<String>();
if (value == 2) {
outputs.add("valid2");
}
else {
outputs.add("error2");
}
return outputs;
}
}
@Test
public void outputSelectorTest() throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
SplitStream<Long> split1 = env.generateSequence(1, 11).split(new MyOutputSelector1());
DataStream<Long> stream11 = split1.select("valid1");
stream11.print();
SplitStream<Long> split2 = stream11.split(new MyOutputSelector2());
DataStream<Long> stream21 = split2.select("valid2");
stream21.print();
DataStream<Long> stream22 = split2.select("error2");
stream22.printToErr();
env.execute();
}
这是我执行此代码时得到的输入:
我的来源是1到11之间的整数列表。 我希望stream11只包含小于5的整数。当我打印它时似乎没问题。 我希望stream21包含2,这似乎是两个“2”打印的情况。 但是,我希望stream22包含除2之外的所有小于5的整数,但打印1到11之间的所有整数。
为什么表现如此?我认为第一个选择器在流中只保留1到4的整数,但是在最后一次分割后,5到11的整数重新出现......
总结一下,这就是我得到的和我期望的:
可能有一种我不理解的机制。有什么解决方案吗?我应该使用过滤器吗?
感谢。
答案 0 :(得分:0)
看起来你发现了一个错误。我可以使用Flink 1.1.3和当前的主分支(Flink 1.2-SNAPSHOT)重现该问题。
我提交了一个JIRA问题:FLINK-5031来跟踪错误。