如何使用眨眼计划器将流从收缩流插入收缩水槽

时间:2020-06-20 00:29:41

标签: apache-flink flink-streaming

我正在尝试获取Flink表并将其转换为可缩回的接收器,然后将其连接到接收器中。我可以使用CRow在原始表计划器中执行此操作,但是Flink的Blink计划器似乎不再支持CRow。使用眨眼计划器时,有什么方法可以做到这一点?

作为参考,我们能够在将回缩流连接到CRow之前将其映射为RetractStreamTableSink类型来做到这一点。

下面是我要完成的单元测试示例,请注意注释掉的代码块在旧计划器中可以正常工作。

此操作失败,但出现以下异常,这是有道理的,因为正在收回的流的类型为Tuple2<Boolean, Row>,而接收器的类型为Row,但是我看不到使用{ {1}}用Tuple2撤回DataStream

RetractStreamTableSink<Row>
org.apache.flink.table.api.ValidationException: Field types of query result and registered TableSink default_catalog.default_database.sink2 do not match.
Query schema: [f0: BOOLEAN, f1: ROW<`f0` STRING, `f1` STRING>]
Sink schema: [f0: STRING, f1: STRING]

1 个答案:

答案 0 :(得分:0)

因此,如果您创建了一个垫片接口AppendStreamTableSink<Tuple2<Boolean, Row>>并使其实现了RetractStreamTableSink默认的方法,并且覆盖了consumeDataStream方法,那么我找到了解决此问题的方法,如下所示,您可以从Tuple2返回到Row,而无需使用CRow

这正是RetractStreamTableSink的意思,但是使用它时,某些原因会导致Blink失败(即使在AppendStreamTableSinkRetractStreamTableSink都相同的情况下(所有方法覆盖且相等,唯一的区别是您实现的接口的名称。我强烈怀疑这是Blink计划程序中的错误,但无法确定其来源。

进行转换的代码段:

@Override
public DataStreamSink<?> consumeDataStream(DataStream<Tuple2<Boolean, Row>> dataStream) {
        DataStream<Row> filteredAndMapped =
                dataStream.filter(x -> x.f0).map(x -> x.f1).returns(delegate.getOutputType());

        return delegate.consumeDataStream(filteredAndMapped);
}