Flink 1.9 Table API & SQL 新特性主要包括如下:
- 全新的 SQL 类型系统:Table API & SQL 1.9 引入了全新的 SQL 的类型系统。以往的Table 层的类型系统复用了 Runtime 的 TypeInformation,但在实际操作过程当中遇到较多的限制。引入全新的 SQL 类型系统可以更好的对齐 SQL 语义。
- DDL初步支持:这个版本中 Flink 还引入了 DDL 的初步支持,用户可以使用 Create Table 或 Drop Table 等简单的语法定义表格或删除表。
- Table API增强:Table API 原来仅为关系表达式的 API,Table API & SQL 1.9中现在加入了 Map,FlatMap 等更加灵活的 API。
- 统一的Catalog API:Table API & SQL 1.9 引入了统一的 Catalog API 之后,可以方便的和其它的 Catalog 对接。比如常见的 Hive,可以通过统一的 Catalog API,实现与 Hive.metastore 交互的插件,让 Flink 可以直接读取和处理 Hive 中的表。
- Blink planner:Table API 增加了 Blink planner 的支持,因为在底层的 Runtime 做了较大的变化后,上层需要 SQL 的 Planner 与底层的 Runtime 进行对接。为了确保原来的 Table API 用户尽量不受影响,社区完整保留了原来的 Flink Planner。但同时又引入了新的 Blink planner,与新的 Runtime 设计进行对接。
该文章主要对官网新特性之Data Type(全新的SQL类型系统)进行翻译:https://ci.apache.org/projects/flink/flink-docs-release-1.9/zh/dev/table/types.html#data-types-in-the-table-api
由于历史原因,在Flink 1.9之前,Flink的Table和SQL API数据类型与Flink的TypeInformation紧密关联。TypeInformation用于DataStream和DataSet API中,足以描述在分布式环境中序列化和反序列化基于JVM的对象所需的所有信息。
但是,TypeInformation并非旨在表示独立于实际JVM类的逻辑类型。过去,很难将SQL标准类型映射到此抽象。此外,某些类型不符合SQL,并且在引入时没有考虑更大的范围。
从Flink 1.9开始,Table&SQL API将获得一种新型系统,该系统可作为API稳定性和标准合规性的长期解决方案。
重新设计类型系统是一项涉及几乎所有面向用户的接口的主要工作。因此,它的引入涵盖了多个发行版,社区旨在通过Flink 1.10完成此工作。
由于同时为Table程序添加了一个新的计划程序(请参阅FLINK-11439),并非支持计划程序和数据类型的每种组合。此外,planners可能不支持具有所需精度或参数的每种数据类型。
**注意:**在使用数据类型之前,请参阅执行计划(planner)兼容性Table和限制部分。
数据类型描述表生态系统中值的逻辑类型。它可以用来声明操作的输入和/或输出类型。
Flink的数据类型与SQL标准的数据类型术语相似,但也包含有关可有效处理标量表达式的值的可为空性的信息。
数据类型:
INT
INT NOT NULL
INTERVAL DAY TO SECOND(3)
ROW, myOtherField TIMESTAMP(3)>
基于JVM的API的用户可以在Table API中使用org.apache.flink.table.types.DataType的实例,或者在定义连接器(connectors),目录(catalogs)或用户定义的函数时使用。
DataType实例有两个职责:
**逻辑类型的声明:**这并不意味着传输或存储的具体物理表示,而是定义了基于JVM的语言和表生态系统之间的界限。
**可选的:**向执行计划提供有关数据物理表示的提示,这对于其他API的边缘很有用。
对于基于JVM的语言,org.apache.flink.table.api.DataTypes中提供了所有预定义的数据类型。
建议您将’*(scala中用‘_’表示)'导入到Table程序中,以使用流畅的API:
import org.apache.flink.table.api.DataTypes._
val t: DataType = INTERVAL(DAY(), SECOND(3));
在基于SQL的类型系统结束且需要特定于编程的数据类型的表生态系统的边缘,需要物理提示。提示指示实现所需的数据格式。
例如,数据源可以表示它使用java.sql.Timestamp类而不是默认的java.time.LocalDateTime为逻辑TIMESTAMP生成值。有了这些信息,运行时就可以将产生的类转换为其内部数据格式。作为回报,数据接收器可以声明其从运行时使用的数据格式。
以下是如何声明桥接转换类的示例:
// tell the runtime to not produce or consume java.time.LocalDateTime instances
// but java.sql.Timestamp
val t: DataType = DataTypes.TIMESTAMP(3).bridgedTo(classOf[java.sql.Timestamp]);
// tell the runtime to not produce or consume boxed integer arrays
// but primitive int arrays
val t: DataType = DataTypes.ARRAY(DataTypes.INT().notNull()).bridgedTo(classOf[Array[Int]]);
**注意:**通常只有在扩展API时才需要物理提示。sources/sinks/functions的无需定义此类提示。Table程序中的提示(例如field.cast(TIMESTAMP(3).bridgedTo(Timestamp.class)))将被忽略。
如上所述,重新处理类型系统将跨越多个版本,每种数据类型的支持取决于所使用的计划程序。本节旨在总结最重要的差异。
Flink1.9合并了Blink的代码,也就意味着我们在使用Table API 开发程序的时候,可以选在两种不同的执行计划。
一种是原来的Flink的执行计划,统称OldPlanner
一种是Blink的执行计划,统称BlinkPlanner
Flink 1.9之前推出的Flink Old Planner主要支持类型信息,仅对Data type提供有限的支持。可以声明可以转换为Type information的Data type,以便old planner可以理解它们。
下表总结了Data type和Type information之间的区别。大多数简单类型以及行类型均保持不变。时间类型,数组类型和十进制类型需要特别注意。不允许使用其他提示。
对于“Type Information ”列,该表省略了前缀org.apache.flink.table.api.Types。
对于“Data Type Representation”列,该表省略了前缀org.apache.flink.table.api.DataTypes。
Type Information | Java Expression String | Data Type Representation |
---|---|---|
STRING() |
STRING |
STRING() |
BOOLEAN() |
BOOLEAN |
BOOLEAN() |
BYTE() |
BYTE |
TINYINT() |
SHORT() |
SHORT |
SMALLINT() |
INT() |
INT |
INT() |
LONG() |
LONG |
BIGINT() |
FLOAT() |
FLOAT |
FLOAT() |
DOUBLE() |
DOUBLE |
DOUBLE() |
ROW(...) |
ROW<...> |
ROW(...) |
BIG_DEC() |
DECIMAL |
[DECIMAL()] |
SQL_DATE() |
SQL_DATE |
DATE().bridgedTo(java.sql.Date.class) |
SQL_TIME() |
SQL_TIME |
TIME(0).bridgedTo(java.sql.Time.class) |
SQL_TIMESTAMP() |
SQL_TIMESTAMP |
TIMESTAMP(3).bridgedTo(java.sql.Timestamp.class) |
INTERVAL_MONTHS() |
INTERVAL_MONTHS |
INTERVAL(MONTH()).bridgedTo(Integer.class) |
INTERVAL_MILLIS() |
INTERVAL_MILLIS |
INTERVAL(DataTypes.SECOND(3)).bridgedTo(Long.class) |
PRIMITIVE_ARRAY(...) |
PRIMITIVE_ARRAY<...> |
ARRAY(DATATYPE.notNull().bridgedTo(PRIMITIVE.class)) |
PRIMITIVE_ARRAY(BYTE()) |
PRIMITIVE_ARRAY |
BYTES() |
OBJECT_ARRAY(...) |
OBJECT_ARRAY<...> |
ARRAY(DATATYPE.bridgedTo(OBJECT.class)) |
MULTISET(...) |
MULTISET(...) |
|
MAP(..., ...) |
MAP<...,...> |
MAP(...) |
other generic types | ANY(...) |
注意:新型数据类型是否有问题。用户可以随时回退以键入在org.apache.flink.table.api.Types中定义的信息。
新的Blink planner程序支持Old planner程序的所有类型。包括列出的Java表达式字符串和type information.。
支持以下数据类型:
Data Type | Remarks for Data Type |
---|---|
STRING |
CHAR and VARCHAR are not supported yet. |
BOOLEAN |
|
BYTES |
BINARY and VARBINARY are not supported yet. |
DECIMAL |
Supports fixed precision and scale. |
TINYINT |
|
SMALLINT |
|
INTEGER |
|
BIGINT |
|
FLOAT |
|
DOUBLE |
|
DATE |
|
TIME |
Supports only a precision of 0 . |
TIMESTAMP |
Supports only a precision of 3 . |
TIMESTAMP WITH LOCAL TIME ZONE |
Supports only a precision of 3 . |
INTERVAL |
Supports only interval of MONTH and SECOND(3) . |
ARRAY |
|
MULTISET |
|
MAP |
|
ROW |
|
ANY |
Java Expression String: Table API中的Java表达式字符串,例如table.select(“ field.cast(STRING)”)尚未更新为新类型的系统。使用old planner部分中声明的字符串表示形式。
Connector Descriptors and SQL Client:描述符字符串表示形式尚未更新为新类型系统。使用在“Connect to External Systems section”部分中声明的字符串表示形式
User-defined Functions: 用户定义的函数尚不能声明数据类型。
本节列出了所有预定义的数据类型。对于基于JVM的Table API,这些类型在org.apache.flink.table.api.DataTypes中也可用。
CHAR
定长字符串的数据类型。
SQL
CHAR
CHAR(n)
JAVA/SCALA
DataTypes.CHAR(n)
可以使用CHAR(n)声明类型,其中n是代码点数。n的值必须介于1到2,147,483,647(包括两者)之间。如果未指定长度,则n等于1。
STRING是VARCHAR(2147483647)的同义词。
VARCHAR
/ STRING
可变长度字符串的数据类型。
SQl
VARCHAR
VARCHAR(n)
STRING
JAVA/SCALA
DataTypes.VARCHAR(n)
DataTypes.STRING()
可以使用VARCHAR(n)声明类型,其中n是最大代码点数。n的值必须介于1到2,147,483,647(包括两者)之间。如果未指定长度,则n等于1。
STRING是VARCHAR(214748364)的同义词。
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
java.lang.String |
X | X | Default |
byte[] |
X | X | Assumes UTF-8 encoding. |
BINARY
固定长度的二进制字符串(=字节序列)的数据类型。
SQL
BINARY
BINARY(n)
JAVA/SCALA
DataTypes.BINARY(n)
可以使用BINARY(n)声明类型,其中n是字节数。n的值必须介于1到2,147,483,647(包括两者)之间。如果未指定长度,则n等于1。
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
byte[] |
X | X | Default |
DECIMAL
具有固定精度和小数位数的十进制数字的数据类型。
SQL
DECIMAL
DECIMAL(p)
DECIMAL(p, s)
DEC
DEC(p)
DEC(p, s)
NUMERIC
NUMERIC(p)
NUMERIC(p, s)
JAVA/SCALA
DataTypes.DECIMAL(p, s)
可以使用DECIMAL(p,s)声明类型,其中p是数字(精度)中的位数,而s是数字(小数位)中小数点右边的位数。p的值必须介于1到38之间(包括两者之间)。s的值必须介于0到p之间(包括两者之间)。p的默认值为10。s的默认值为0。
NUMERIC(p,s)和DEC(p,s)是此类型的同义词。
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
java.math.BigDecimal |
X | X | Default |
TINYINT
1字节有符号整数的数据类型,其值从-128到127。
SQL
TINYINT
JAVA/SCALA
DataTypes.TINYINT()
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
java.lang.Byte |
X | X | Default |
byte |
X | (X) | Output only if type is not nullable. |
SMALLINT
2字节有符号整数的数据类型,其值从-32,768到32,767。
SQL
SMALLINT
JAVA/SCALA
DataTypes.SMALLINT()
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
java.lang.Short |
X | X | Default |
short |
X | (X) | Output only if type is not nullable. |
INT
一个4字节有符号整数的数据类型,其值从-2,147,483,648到2,147,483,647。
SQL
INT
INTEGER
JAVA/SCALA
DataTypes.INT()
INTEGER是此类型的同义词。
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
java.lang.Integer |
X | X | Default |
int |
X | (X) | Output only if type is not nullable. |
BIGINT
一个8字节有符号整数的数据类型,其值从-9,223,372,036,854,775,808到9,223,372,036,854,775,807。
SQL
BIGINT
JAVA/SCALA
DataTypes.BIGINT()
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
java.lang.Long |
X | X | Default |
long |
X | (X) | Output only if type is not nullable. |
FLOAT
4字节单精度浮点数的数据类型。与SQL标准相比,该类型不带参数。
SQL
FLOAT
JAVA/SCALA
DataTypes.FLOAT()
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
java.lang.Float |
X | X | Default |
float |
X | (X) | Output only if type is not nullable. |
DOUBLE
8字节双精度浮点数的数据类型。
SQL
DOUBLE
DOUBLE PRECISION
JAVA/SCALA
DataTypes.DOUBLE()
DOUBLE PRECISION是此类型的同义词。
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
java.lang.Double |
X | X | Default |
double |
X | (X) | Output only if type is not nullable. |
DATE
日期的数据类型,由年-月-日组成,值的范围从0000-01-01到9999-12-31。与SQL标准相比,范围从0000年开始。与SQL标准相比,范围从0000年开始。
SQL
DATE
JAVA/SCALA
DataTypes.DATE()
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
java.time.LocalDate |
X | X | Default |
java.sql.Date |
X | X | |
java.lang.Integer |
X | X | Describes the number of days since epoch. |
int |
X | (X) | Describes the number of days since epoch. Output only if type is not nullable. |
TIME
不带时区的时间的数据类型,由小时:分钟:秒[.fractional]组成,精度高达纳秒,范围从00:00:00.000000000到23:59:59.999999999。与SQL标准相比,不支持leap秒(23:59:60和23:59:61),因为语义更接近java.time.LocalTime。没有提供带时区的时间。
SQL
TIME
TIME(p)
JAVA/SCALA
DataTypes.TIME(p)
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
java.time.LocalTime |
X | X | Default |
java.sql.Time |
X | X | |
java.lang.Integer |
X | X | Describes the number of milliseconds of the day. |
int |
X | (X) | Describes the number of milliseconds of the day. Output only if type is not nullable. |
java.lang.Long |
X | X | Describes the number of nanoseconds of the day. |
long |
X | (X) | Describes the number of nanoseconds of the day. Output only if type is not nullable. |
TIMESTAMP
不带时区的时间戳记的数据类型,由年-月-日hour:minute:second [.fractional]组成,精度高达纳秒,范围从0000-01-01 00:00:00.000000000到9999-12-31 23:59:59.999999999。
与SQL标准相比,不支持leap秒(23:59:60和23:59:61),因为语义更接近java.time.LocalDateTime。
不支持与BIGINT(JVM长类型)之间的转换,因为这暗示了时区。但是,此类型没有时区。有关更多类似于java.time.Instant的语义,请使用TIMESTAMP WITH LOCAL TIME ZONE。
SQL
TIMESTAMP
TIMESTAMP(p)
TIMESTAMP WITHOUT TIME ZONE
TIMESTAMP(p) WITHOUT TIME ZONE
JAVA/SCALA
DataTypes.TIMESTAMP(p)
可以使用TIMESTAMP§声明类型,其中p是小数秒(精度)的位数。p必须具有介于0和9之间的一个值(包括两者)。如果未指定精度,则p等于6。
TIMESTAMP§WITH TIME ZONE是此类型的同义词。
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
java.time.LocalDateTime |
X | X | Default |
java.sql.Timestamp |
X | X |
TIMESTAMP WITH TIME ZONE
时间戳的数据类型,时区由年-月-日hour:minute:second [.fractional]区域组成,精度达纳秒,范围从0000-01-01 00:00:00.000000000 +14:59到9999-12-31 23:59:59.999999999 -14:59。
与SQL标准相比,不支持leap秒(23:59:60和23:59:61),因为语义更接近java.time.OffsetDateTime。
与具有本地时区的TIMESTAMP相比,时区偏移量信息物理存储在每个数据中。它单独用于每个计算,可视化或与外部系统的通信。
SQL
TIMESTAMP WITH TIME ZONE
TIMESTAMP(p) WITH TIME ZONE
JAVA/SCALA
DataTypes.TIMESTAMP_WITH_TIME_ZONE(p)
可以使用TIMESTAMP§WITH TIME ZONE声明类型,其中p是小数秒(精度)的位数。p必须具有介于0和9之间的一个值(包括两者)。如果未指定精度,则p等于6。
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
java.time.OffsetDateTime |
X | X | Default |
java.time.ZonedDateTime |
X | Ignores the zone ID. |
TIMESTAMP WITH LOCAL TIME ZONE
具有本地时区的时间戳记的数据类型,该时区包括年-月-日hour:minute:second [.fractional]区域,精度达纳秒,范围从0000-01-01 00:00:00.000000000 +14:59到9999-12-31 23:59:59.999999999 -14:59。
不支持秒(23:59:60和23:59:61),因为语义更接近java.time.OffsetDateTime。
与TIMESTAMP WITH TIME ZONE相比,时区偏移量信息并非物理存储在每个基准中。相反,该类型在表生态系统边缘的UTC时区中采用java.time.Instant语义。每个数据都在当前会话中配置的本地时区中进行解释,以进行计算和可视化。
通过允许根据配置的会话时区解释UTC时间戳,此类型填补了时区空闲和时区强制时间戳类型之间的空白。
SQL
TIMESTAMP WITH LOCAL TIME ZONE
TIMESTAMP(p) WITH LOCAL TIME ZONE
JAVA/SCALA
DataTypes.TIMESTAMP_WITH_LOCAL_TIME_ZONE(p)
可以使用TIMESTAMP§WITH LOCAL TIME ZONE声明类型,其中p是小数秒(精度)的位数。p必须具有介于0和9之间的一个值(包括两者)。如果未指定精度,则p等于6。
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
java.time.Instant |
X | X | Default |
java.lang.Integer |
X | X | Describes the number of seconds since epoch. |
int |
X | (X) | Describes the number of seconds since epoch. Output only if type is not nullable. |
java.lang.Long |
X | X | Describes the number of milliseconds since epoch. |
long |
X | (X) | Describes the number of milliseconds since epoch. Output only if type is not nullable. |
INTERVAL YEAR TO MONTH
一组年月间隔类型的数据类型。
必须将类型参数化为以下分辨率之一:
年-月的间隔由+年-月组成,其值的范围为-9999-11至+ 9999-11。
所有类型的分辨率的值表示均相同。例如,间隔为50的月间隔始终以“年间隔”格式表示(默认为“年精度”):+ 04-02。
SQL
INTERVAL YEAR
INTERVAL YEAR(p)
INTERVAL YEAR(p) TO MONTH
INTERVAL MONTH
JAVA/SCALA
DataTypes.INTERVAL(DataTypes.YEAR())
DataTypes.INTERVAL(DataTypes.YEAR(p))
DataTypes.INTERVAL(DataTypes.YEAR(p), DataTypes.MONTH())
DataTypes.INTERVAL(DataTypes.MONTH())
可以使用上述组合声明类型,其中p是年份的位数(年精度)。p的值必须介于1到4之间(包括两者之间)。如果未指定年份精度,则p等于2。
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
java.time.Period |
X | X | Ignores the days part. Default |
java.lang.Integer |
X | X | Describes the number of months. |
int |
X | (X) | Describes the number of months. Output only if type is not nullable. |
INTERVAL DAY TO MONTH
一组天时间间隔类型的数据类型。
必须将类型参数设置为以下分辨率之一,精度最高为纳秒:
白天的时间间隔由+ day hours:months:seconds.fractional组成,范围从-999999 23:59:59.999999999到+999999 23:59:59.999999999。所有类型的分辨率的值表示均相同。例如,秒间隔始终以天间隔格式(具有默认精度)表示:+00 00:01:10.000000。
SQL
INTERVAL DAY
INTERVAL DAY(p1)
INTERVAL DAY(p1) TO HOUR
INTERVAL DAY(p1) TO MINUTE
INTERVAL DAY(p1) TO SECOND(p2)
INTERVAL HOUR
INTERVAL HOUR TO MINUTE
INTERVAL HOUR TO SECOND(p2)
INTERVAL MINUTE
INTERVAL MINUTE TO SECOND(p2)
INTERVAL SECOND
INTERVAL SECOND(p2)
JAVA/SCALA
DataTypes.INTERVAL(DataTypes.DAY())
DataTypes.INTERVAL(DataTypes.DAY(p1))
DataTypes.INTERVAL(DataTypes.DAY(p1), DataTypes.HOUR())
DataTypes.INTERVAL(DataTypes.DAY(p1), DataTypes.MINUTE())
DataTypes.INTERVAL(DataTypes.DAY(p1), DataTypes.SECOND(p2))
DataTypes.INTERVAL(DataTypes.HOUR())
DataTypes.INTERVAL(DataTypes.HOUR(), DataTypes.MINUTE())
DataTypes.INTERVAL(DataTypes.HOUR(), DataTypes.SECOND(p2))
DataTypes.INTERVAL(DataTypes.MINUTE())
DataTypes.INTERVAL(DataTypes.MINUTE(), DataTypes.SECOND(p2))
DataTypes.INTERVAL(DataTypes.SECOND())
DataTypes.INTERVAL(DataTypes.SECOND(p2))
可以使用上述组合来声明类型,其中p1是天的位数(天精度),p2是小数秒的位数(分数精度)。p1的值必须介于1到6之间(包括两者之间)。p2的值必须介于0到9之间(包括两者之间)。如果未指定p1,则默认情况下等于2。如果未指定p2,则默认情况下等于6。
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
java.time.Duration |
X | X | Default |
java.lang.Long |
X | X | Describes the number of milliseconds. |
long |
X | (X) | Describes the number of milliseconds. Output only if type is not nullable. |
ARRAY
具有相同子类型的元素数组的数据类型。
与SQL标准相比,无法指定数组的最大基数,但固定为2,147,483,647。另外,任何有效类型都支持作为子类型。
SQL
ARRAY
t ARRAY
JAVA/SCALA
DataTypes.ARRAY(t)
可以使用ARRAY 声明类型,其中t是所包含元素的数据类型。ARRAY是接近SQL标准的同义词。例如,INT ARRAY等效于ARRAY 。
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
t[] |
(X) | (X) | Depends on the subtype. Default |
MULTISET
多重集的数据类型(=bbag)。与集合不同,它允许每个元素具有公共子类型的多个实例。每个唯一的值(包括NULL)都映射到某些多重性。
元素类型没有限制;确保唯一性是用户的责任。
SQL
MULTISET
t MULTISET
JAVA/SCALA
DataTypes.MULTISET(t)
可以使用MULTISET 声明类型,其中t是所包含元素的数据类型。t MULTISET是接近SQL标准的同义词。例如,INT MULTISET等效于MULTISET 。
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
java.util.Map |
X | X | Assigns each value to an integer multiplicity. Default |
ROW
字段序列的数据类型。
字段由字段名称,字段类型和可选描述组成。表中某行的最特定类型是行类型。在这种情况下,该行的每一列对应于具有与该列相同序号位置的行类型的字段。
与SQL标准相比,可选的字段描述简化了复杂结构的处理。
Row类型类似于其他非标准兼容框架中已知的STRUCT类型。
SQL
ROW
ROW
ROW(n0 t0, n1 t1, ...>
ROW(n0 t0 'd0', n1 t1 'd1', ...)
JAVA/SCALA
DataTypes.ROW(DataTypes.FIELD(n0, t0), DataTypes.FIELD(n1, t1), ...)
DataTypes.ROW(DataTypes.FIELD(n0, t0, d0), DataTypes.FIELD(n1, t1, d1), ...)
可以使用ROW
ROW(…)是更接近SQL标准的同义词。例如,ROW(myField INT,myOtherField BOOLEAN)等效于ROW
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
org.apache.flink.types.Row |
X | X | Default |
BOOLEAN
具有(可能)三值逻辑TRUE,FALSE和UNKNOWN的布尔数据类型。
SQL
BOOLEAN
JAVA/SCALA
DataTypes.BOOLEAN()
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
java.lang.Boolean |
X | X | Default |
boolean |
X | (X) | Output only if type is not nullable. |
NULL
表示无类型NULL值的数据类型。
空类型是SQL标准的扩展。空类型除了NULL外没有其他值,因此可以将其强制转换为类似于JVM语义的任何可空类型。
此类型有助于表示使用NULL文字的API调用中的未知类型,以及桥接到也定义此类类型的格式(例如JSON或Avro)。
这种类型在实践中不是很有用,为完整性起见在此仅提及。
SQL
NULL
JAVA/SCALA
DataTypes.NULL()
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
java.lang.Object |
X | X | Default |
any class | (X) | Any non-primitive type. |
ANY
任意序列化类型的数据类型。此类型是表生态系统内的黑匣子,仅在边缘反序列化。any类型是SQL标准的扩展。
SQL
ANY('class', 'snapshot')
JAVA/SCALA
DataTypes.ANY(class, serializer)
DataTypes.ANY(typeInfo)
可以使用ANY(‘class’,‘snapshot’)声明类型,其中class是原始类,快照是使用Base64编码的序列化TypeSerializerSnapshot。通常,类型字符串不是直接声明的,而是在保留类型时生成的。在API中,可以通过直接提供Class + TypeSerializer或通过传递TypeInformation并让框架从那里提取Class + TypeSerializer来声明ANY类型。
桥接到JVM类型
Java Type | Input | Output | Remarks |
---|---|---|---|
class | X | X | Originating class or subclasses (for input) or superclasses (for output). Default |
byte[] |
X |
因笔者英文水平有限,如有翻译不对的地方请留言指出,笔者一定会在最短的时间内进行更改!