我正在使用Flink SQL API,在所有“模式”类型之间都有些迷路:TableSchema
,Schema
(来自org.apache.flink.table.descriptors.Schema
)和TypeInformation
。
可以从TableSchema
创建TypeInformation
,可以从TypeInformation
创建TableSchema
,可以从Schema
创建TableSchema
但是看来Schema
无法转换回TypeInformation
或TableSchema
(?)
为什么会有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
这是使用这些对象的正常方法吗? (对我来说很奇怪)
最佳答案
TypeInformation
和TableSchema
解决不同的问题。 TypeInformation
是有关如何将一个记录类(例如一行或一个POJO)从一个运算符传递给另一个运算符的物理信息。TableSchema
描述与基础每个记录类型无关的表的架构。它类似于CREATE TABLE name (a INT, b BIGINT)
DDL语句的架构部分。在SQL中,也没有定义CREATE TABLE name ROW(a INT, B BIGINT)
之类的表。但是确实架构与行类型相关联,这就是提供转换器方法的原因。一旦引入了诸如PRIMARY KEY
等概念,差异就会变得更大。Schema
是指定非SQL概念(例如时间属性和字段映射)的当前方法。