首页 > 解决方案 > 查询结果的字段类型与注册的 TableSink 不匹配

问题描述

table.printSchema() 打印的查询结果模式:

 |-- deviceId: BIGINT
 |-- channel: STRING
 |-- schemaId: BIGINT
 |-- productId: BIGINT
 |-- schema: LEGACY('RAW', 'ANY<com.yunmo.iot.schema.Schema>')

执行 table.toRetractStream[DeviceSchema].print() 时出现错误,抛出异常:

Exception in thread "main" org.apache.flink.table.api.ValidationException: Field types of query result and registered TableSink  do not match.
Query schema: [deviceId: BIGINT, channel: STRING, schemaId: BIGINT, productId: BIGINT, schema: RAW('com.yunmo.iot.schema.Schema', ?)]
Sink schema: [deviceId: BIGINT, channel: STRING, schemaId: BIGINT, productId: BIGINT, schema: LEGACY('RAW', 'ANY<com.yunmo.iot.schema.Schema>')]

com.yunmo.iot.schema.Schema 是一个泛型类型。

Query schema 的 schema 字段从 LEGACY('RAW' 变为 RAW,但 Sink schema 仍然是 LEGACY('RAW'

标签: apache-flinkflink-streamingflink-sql

解决方案


不幸的是,Flink 的 Table & SQL API 的类型系统返工还没有完成,可能并不是所有的层都可以很好地协同工作。你是如何定义你的数据类型的?你在混合DataType和弃用Types吗?一致地使用Types现在应该可以解决问题。否则,请随时在 Flink 的问题跟踪器上打开一个问题。


推荐阅读