我使用的是Flink SQL API,我对所有的“模式”类型都有点迷惑:TableSchema、Schema (来自org.apache.flink.table.descriptors.Schema)和TypeInformation。
可以通过TypeInformation创建TableSchema,可以通过TableSchema创建TypeInformation,可以通过TableSchema创建Schema
但是看起来Schema不能转换回TypeInformation或TableSchema (?)
为什么有3种不同类型的对象来存储相同类型的信息?
例如,假设我有一个来自Avro模式文件的string Schema,并且我想向其中添加一个新字段。要做到这一点,我找到的唯一解决方案是:
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 这是使用这些对象的正常方式吗?(在我看来很奇怪)
发布于 2019-10-18 23:27:06
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概念的方式。
https://stackoverflow.com/questions/58447970
复制相似问题