我正在尝试获取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]
答案 0 :(得分:0)
因此,如果您创建了一个垫片接口AppendStreamTableSink<Tuple2<Boolean, Row>>
并使其实现了RetractStreamTableSink
默认的方法,并且覆盖了consumeDataStream
方法,那么我找到了解决此问题的方法,如下所示,您可以从Tuple2返回到Row,而无需使用CRow
。
这正是RetractStreamTableSink
的意思,但是使用它时,某些原因会导致Blink失败(即使在AppendStreamTableSink
和RetractStreamTableSink
都相同的情况下(所有方法覆盖且相等,唯一的区别是您实现的接口的名称。我强烈怀疑这是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);
}