我正在使用Flink SQL API,在所有“模式”类型之间都有些迷路:TableSchemaSchema(来自org.apache.flink.table.descriptors.Schema)和TypeInformation

可以从TableSchema创建TypeInformation,可以从TypeInformation创建TableSchema,可以从Schema创建TableSchema

但是看来Schema无法转换回TypeInformationTableSchema(?)

为什么会有3种不同类型的对象来存储相同类型的信息?

例如,假设我有一个来自Avro模式文件的字符串模式,并且我想向其中添加一个新字段。为此,我发现的唯一解决方案是:

String mySchemaRaw = ...;
TypeInformation<Row> typeInfo = AvroSchemaConverter.convertToTypeInfo(mySchemaRaw);
Schema newSchema = new Schema().schema(TableSchema.fromTypeInfo(typeInfo));
newSchema = newSchema.field("nexField",...);


// Need the newSchema as a TableSchema


这是使用这些对象的正常方法吗? (对我来说很奇怪)

最佳答案

TypeInformationTableSchema解决不同的问题。 TypeInformation是有关如何将一个记录类(例如一行或一个POJO)从一个运算符传递给另一个运算符的物理信息。

TableSchema描述与基础每个记录类型无关的表的架构。它类似于CREATE TABLE name (a INT, b BIGINT) DDL语句的架构部分。在SQL中,也没有定义CREATE TABLE name ROW(a INT, B BIGINT)之类的表。但是确实架构与行类型相关联,这就是提供转换器方法的原因。一旦引入了诸如PRIMARY KEY等概念,差异就会变得更大。

Schema是指定非SQL概念(例如时间属性和字段映射)的当前方法。

10-06 08:59