本文翻译自官网:https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/types.html
由于历史原因,在 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 程序添加了一个新的 planner(请参阅FLINK-11439),因此不支持 planner 和数据类型的每种组合。此外,planner 可能不支持具有所需精度或参数的每种数据类型。
注意: 在使用数据类型之前,请参阅 planner 兼容性列表和限制部分。
数据类型
数据类型描述在表中的生态系统值的逻辑类型。它可用于声明操作的输入或输出类型。
Flink的数据类型与SQL标准的数据类型术语相似,但也包含有关有效处理标量表达式值的可为空性的信息。
数据类型的示例是:
INT
INT NOT NULL
INTERVAL DAY TO SECOND(3)
ROW<myField ARRAY<BOOLEAN>, myOtherField TIMESTAMP(3)>
可以在下面找到所有预定义数据类型的列表。
Table API中的数据类型
基于JVM API的用户可以在Table API 中使用org.apache.flink.table.types.DataType的实例,或者在定义连接器,catalog 或用户定义的函数时使用。
一个 DataType
实例有两个作用:
- 逻辑类型的声明,并不表示要进行传输或存储的具体物理表示形式,而是定义了基于JVM的语言和表生态系统之间的界限。
- 可选: 向 pallner 提供有关数据物理表示的提示,这对于其他 API 的边缘很有用。
对于基于 JVM 的语言,所有预定义的数据类型都在 org.apache.flink.table.api.DataTypes 中提供。
建议使用星号导入到表程序中以顺利使用全部的API:
import org.apache.flink.table.api.DataTypes._ val t: DataType = INTERVAL(DAY(), SECOND(3));
物理Hites
在基于SQL的类型系统结尾和需要特定编程数据类型的表生态系统的边缘,需要物理 hint。 hint 指示实现所需的数据格式。
例如,数据源可以表示它使用java.sql.Timestamp类而不是默认的java.time.LocalDateTime为逻辑TIMESTAMP生成值。 有了这些信息,runtime 就可以将产生的类转换为其内部数据格式。 作为回报,数据接收器可以声明其从 runtime 使用的数据格式。
以下是一些如何声明桥接转换类的示例:
// 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时才需要物理提示。预定义 source/sink/functions 的用户无需定义此类提示。Table 程序(例如field.cast(TIMESTAMP(3).bridgedTo(Timestamp.class))
)中的提示将被忽略。
Planner 兼容性
如引言中所述,对类型系统进行重做将跨越多个版本,每种数据类型的支持取决于所使用的 planner 。本节旨在总结最重要的差异。
Old planner
Flink 1.9之前引入的Flink old planner 主要支持 type information。它仅对 data type 提供有限的支持。声明可以转换为 Type information 的 data type,以便 old planner 可以理解它们。
下表总结了 data type 和 type information 之间的区别。大多数简单类型以及行类型均保持不变。时间类型,数组类型和 decimal 类型需要特别注意。不允许使用其他提示。
对于“ Type Information ” 列,该表格省略了前缀 org.apache.flink.table.api.Types
。
对于“ Data Type Representation ”列,该表格省略了前缀org.apache.flink.table.api.DataTypes
。
类型信息 | Java表达式字符串 | 数据类型表示 | 数据类型备注 |
---|---|---|---|
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() ] |
不是1:1的映射,因为会忽略精度和小数位数,而是使用Java的可变精度和小数位数。 |
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)) |
适用于除之外的所有JVM基本类型byte 。 |
PRIMITIVE_ARRAY(BYTE()) |
PRIMITIVE_ARRAY<BYTE> |
BYTES() |
|
OBJECT_ARRAY(...) |
OBJECT_ARRAY<...> |
ARRAY( DATATYPE.bridgedTo(OBJECT.class)) |
|
MULTISET(...) |
MULTISET(...) |
||
MAP(..., ...) |
MAP<...,...> |
MAP(...) |
|
其他通用类型 | ANY(...) |
注意:如果新型系统有问题。用户可以随时回退到 org.apache.flink.table.api.Types 定义的 Type information。
新的Blink planner
新的Blink planner 支持所有 old planner 的程序类型。尤其包括列出的Java表达式字符串和类型信息。
支持以下数据类型:
数据类型 | 数据类型备注 |
---|---|
STRING |
CHAR 并且VARCHAR 尚不支持。 |
BOOLEAN |
|
BYTES |
BINARY 并且VARBINARY 尚不支持。 |
DECIMAL |
支持固定的精度和比例。 |
TINYINT |
|
SMALLINT |
|
INTEGER |
|
BIGINT |
|
FLOAT |
|
DOUBLE |
|
DATE |
|
TIME |
仅支持的精度0 。 |
TIMESTAMP |
仅支持的精度3 。 |
TIMESTAMP WITH LOCAL TIME ZONE |
仅支持的精度3 。 |
INTERVAL |
仅支持MONTH 和的间隔SECOND(3) 。 |
ARRAY |
|
MULTISET |
|
MAP |
|
ROW |
|
ANY |
局限性
Java表达式字符串:Table API中的Java表达式字符串,例如table.select("field.cast(STRING)")
尚未更新为新类型的系统。使用在Old planner 部分中声明的字符串表示形式。
连接器描述符和SQL客户端:描述符字符串表示形式尚未更新为新类型的系统。使用在“ 连接到外部系统”部分中声明的字符串表示形式
用户定义的函数:用户定义的函数尚不能声明 data type。
数据类型列表
本节列出了所有预定义的数据类型。对于基于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
。
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.lang.String |
X | X | 默认 |
byte[] |
X | X | 假设使用UTF-8编码。 |
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(2147483647) 的同义词。
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.lang.String |
X | X | 默认 |
byte[] |
X | X | 假设使用UTF-8编码。 |
二进制字符串
BINARY
固定长度的二进制字符串(=字节序列)的数据类型。
SQL 定义
BINARY
BINARY(n)
Java、Scala 定义
DataTypes.BINARY(n)
可以使用BINARY(n)
n
是字节数来声明类型。n
的值必须介于1
和之间2,147,483,647
(包括两者之间)。如果未指定长度,则 n
等于1
。
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
byte[] |
X | X | 默认 |
VARBINARY
/ BYTES
可变长度二进制字符串(=字节序列)的数据类型。
SQL 定义
VARBINARY
VARBINARY(n)
BYTES
Java、Scala 定义
DataTypes.VARBINARY(n)
DataTypes.BYTES()
可以使用VARBINARY(n)
n
是字节的最大长度来声明类型。n
的值必须介于1
和之间2,147,483,647
(包括两者之间)。如果未指定长度,则 n
等于1
。
BYTES
是 VARBINARY(2147483647) 的同义词。
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
byte[] |
X | X | 默认 |
精确数值
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
是数字中整数部分的位数(precision),s
是数字中小数点右边的位数(scale)。p
的值必须介于1
和之间38
(包括两者之间)。s
的值必须介于0
和之间p
(包括两者之间)。其中 p 的缺省值是10,s 的缺省值是
0
。
NUMERIC(p, s) 和
DEC(p, s)
是这种类型的同义词。
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.math.BigDecimal |
X | X | 默认 |
TINYINT
1字节有符号整数的数据类型,其值从-128
到 127
。
SQL 定义
TINYINT
Java、Scala 定义
DataTypes.TINYINT()
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.lang.Byte |
X | X | 默认 |
byte |
X | (X) | 仅当类型不可为空时才输出。 |
SMALLINT
2字节有符号整数的数据类型,其值从-32,768
到32,767
。
SQL 定义
SMALLINT
Java、Scala 定义
DataTypes.SMALLINT
()
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.lang.Short |
X | X | 默认 |
short |
X | (X) | 仅当类型不可为空时才输出。 |
INT
4字节有符号整数的数据类型,其值从-2,147,483,648
to到2,147,483,647
。
SQL 定义
INT
INTEGER
Java、Scala 定义
DataTypes.INT()
INTEGER
是此类型的同义词。
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.lang.Integer |
X | X | 默认 |
int |
X | (X) | 仅当类型不可为空时才输出。 |
BIGINT
8字节有符号整数的数据类型,其值从-9,223,372,036,854,775,808
to到 9,223,372,036,854,775,807
。
SQL 定义
BIGINT
Java、Scala 定义
DataTypes.BIGINT()
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.lang.Long |
X | X | 默认 |
long |
X | (X) | 仅当类型不可为空时才输出。 |
近似数值
FLOAT
4字节单精度浮点数的数据类型。
与SQL标准相比,该类型不带参数。
SQL 定义
FLOAT
Java、Scala 定义
DataTypes.FLOAT()
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.lang.Float |
X | X | 默认 |
float |
X | (X) | 仅当类型不可为空时才输出。 |
DOUBLE
8字节双精度浮点数的数据类型。
SQL 定义
DOUBLE
DOUBLE PRECISION
Java、Scala 定义
DataTypes.DOUBLE()
DOUBLE PRECISION
是此类型的同义词。
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.lang.Double |
X | X | 默认 |
double |
X | (X) | 仅当类型不可为空时才输出。 |
日期和时间
DATE
日期的数据类型,包含 year-month-day
范围从0000-01-01
到的值9999-12-31
。
与SQL标准相比,year 范围从 0000 开始。
SQL 定义
DATE
Java、Scala 定义
DataTypes.DATE()
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.time.LocalDate |
X | X | 默认 |
java.sql.Date |
X | X | |
java.lang.Integer |
X | X | 描述自纪元以来的天数。 |
int |
X | (X) | 描述自纪元以来的天数。 仅当类型不可为空时才输出。 |
TIME
没有时区的时间数据类型,其hour:minute:second[.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)
可以使用TIME(p)
p
是小数部分 秒的位数(precision)来声明类型。p
的值必须介于0
和之间9
(包括两者之间)。如果未指定精度,则 p
等于0
。
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.time.LocalTime |
X | X | 默认 |
java.sql.Time |
X | X | |
java.lang.Integer |
X | X | 描述一天中的毫秒数。 |
int |
X | (X) | 描述一天中的毫秒数。 仅当类型不可为空时才输出。 |
java.lang.Long |
X | X | 描述一天中的纳秒数。 |
long |
X | (X) | 描述一天中的纳秒数。 仅当类型不可为空时才输出。 |
TIMESTAMP
不带时区的时间戳数据类型,其year-month-day 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 long
类型)之间的转换,因为这意味着时区。但是,此类型没有时区。对于更类似 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
是小数部分 秒的位数(precision)来声明类型。p
的值必须介于0
和之间9
(包括两者之间)。如果未指定精度,则 p
等于6
。
TIMESTAMP(p) WITHOUT TIME ZONE
是此类型的同义词。
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.time.LocalDateTime |
X | X | 默认 |
java.sql.Timestamp |
X | X |
TIMESTAMP WITH TIME ZONE
timestamp with time zone 数据类型由 year-month-day hour:minute:second[.fractional] 与 zone 组成,
精度达纳秒,值范围为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 WITH LOCAL TIME ZONE 相比,时区偏移量信息物理存储在每个数据中。它单独用于每个计算,可视化或与外部系统的通信。
SQL 定义
TIMESTAMP WITH TIME ZONE
TIMESTAMP(p) WITH TIME ZONE
Java、Scala 定义
DataTypes.TIMESTAMP_WITH_TIME_ZONE(p)
可以使用TIMESTAMP(p) WITH TIME
p
是小数部分秒的位数(precision)来声明类型。p
的值必须介于0
和之间9
(包括两者之间)。如果未指定精度,p
则等于6
。
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.time.OffsetDateTime |
X | X | 默认 |
java.time.ZonedDateTime |
X | 忽略区域ID。 |
TIMESTAMP WITH LOCAL TIME ZONE
timestamp with local time zone 数据类型,由 year-month-day hour:minute:second[.fractional] zone 组成,
精度高达纳秒,范围从0000-01-01 00:00:00.000000000 +14:59
到 9999-12-31 23:59:59.999999999 -14:59
。
不支持Leap 秒(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(p) WITH LOCAL TIME ZONE
p
是小数部分秒的位数(precision)来声明类型。p
的值必须介于0
和之间9
(包括两者之间)。如果未指定精度,p
则等于6
。
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.time.Instant |
X | X | 默认 |
java.lang.Integer |
X | X | 描述自纪元以来的秒数。 |
int |
X | (X) | 描述自纪元以来的秒数。 仅当类型不可为空时才输出。 |
java.lang.Long |
X | X | 描述自纪元以来的毫秒数。 |
long |
X | (X) | 描述自纪元以来的毫秒数。 仅当类型不可为空时才输出。 |
INTERVAL YEAR TO MONTH
一组年月间隔类型的数据类型。
必须将类型参数化为以下分辨率之一:
- 年间隔
- 几年到几个月的间隔
- 间隔几个月。
年-月的间隔由+years-months 到组成,范围从-9999-11
到 +9999-11
。
所有类型的分辨率的值表示均相同。例如,始终以“年月间隔”格式(默认年份精度)表示50个月的间隔:+04-02(4年2个月)
。
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类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.time.Period |
X | X | 忽略days 零件。默认 |
java.lang.Integer |
X | X | 描述月份数。 |
int |
X | (X) | 描述月份数。 仅当类型不可为空时才输出。 |
INTERVAL DAY TO MONTH
一组天时间间隔类型的数据类型。
必须将类型参数设置为以下分辨率之一,精度最高为纳秒:
- 天间隔
- 几天到几小时的间隔
- 天到分钟的间隔
- 天到秒的间隔
- 小时间隔
- 小时到几分钟的间隔,
- 小时到几秒的间隔,
- 分钟间隔
- 分钟到秒的间隔,
- 或秒间隔。
一天中的时间间隔包含,+days hours:months:seconds.fractional
范围从 -999999 23:59:59.999999999
到+999999 23:59:59.999999999
。所有类型的分辨率的值表示均相同。例如,秒间隔 70 始终以天间隔格式(具有默认精度)表示:+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类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.time.Duration |
X | X | 默认 |
java.lang.Long |
X | X | 描述毫秒数。 |
long |
X | (X) | 描述毫秒数。 仅当类型不可为空时才输出。 |
构造数据类型
ARRAY
具有相同子类型的元素数组的数据类型。
与SQL标准相比,无法指定数组的最大基数,但固定为2,147,483,647
。另外,任何有效类型都支持作为子类型。
SQL 定义
ARRAY<t>
t ARRAY
Java、Scala 定义
DataTypes.ARRAY(t)
可以使用 ARRAY<t>
t
是所包含元素的数据类型来声明类型。
t ARRAY
是接近SQL标准的同义词。例如,INT ARRAY
等效于ARRAY<INT>
。
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
Ť[] |
(X) | (X) | 取决于子类型。默认 |
MULTISET
多重集的数据类型(= bag )。与集合不同,它允许每个元素具有公共子类型的多个实例。每个唯一值(包括NULL
)都映射到某种多重性。
元素类型没有限制;确保唯一性是用户的责任。
SQL 定义
MULTISET<t>
t MULTISET
Java、Scala 定义
DataTypes.MULTISET(t)
可以使用 MULTISET<t>
t
是所包含元素的数据类型来声明类型。
t MULTISET
是接近SQL标准的同义词。例如,INT MULTISET
等效于MULTISET<INT>
。
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.util.Map<t, java.lang.Integer> |
X | X | 将每个值分配给整数倍数。默认 |
ROW
字段序列的数据类型。
字段由字段名称,字段类型和可选描述组成。表的行 最特定类型是行类型。在这种情况下,该行的每一列对应于具有与该列相同序号位置的行类型的字段。
与SQL标准相比,可选的字段描述简化了复杂结构的处理。
Row 类型类似于其他非标准兼容框架中已知的STRUCT类型。
SQL 定义
ROW<n0 t0, n1 t1, ...>
ROW<n0 t0 'd0', n1 t1 'd1', ...>
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<n0 t0 'd0', n1 t1 'd1', ...>
where 来声明类型,其中where n
是字段的唯一名称,是字段t
的逻辑类型,是字段d
的描述。
ROW(...)
是接近SQL标准的同义词。例如,ROW(myField INT, myOtherField BOOLEAN)
等效于ROW<myField INT, myOtherField BOOLEAN>
。
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
org.apache.flink.types.Row |
X | X | 默认 |
其他数据类型
BOOLEAN
(可能)具有三值逻辑 TRUE,FALSE 和 UNKNOWN 的布尔数据类型。
SQL 定义
BOOLEAN
Java、Scala 定义
DataTypes.BOOLEAN()
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.lang.Boolean |
X | X | 默认 |
boolean |
X | (X) | 仅当类型不可为空时才输出。 |
NULL
表示空类型 NULL
值的数据类型。
NULL 类型是SQL标准的扩展。除了 NULL 类型之外没有其他 NULL 值,因此可以将其强制转换为类似于JVM语义的任何可空类型。
这种类型在实践中不是很有用,为完整起见在此仅提及。
SQL 定义
NULL
Java、Scala 定义
DataTypes.NULL()
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
java.lang.Object |
X | X | 默认 |
任何班级 | (X) | 任何非原始类型。 |
ANY
任意序列化类型的数据类型。此类型是表生态系统内的黑匣子,仅在边缘反序列化。
any类型是SQL标准的扩展。
SQL 定义
ANY('class', 'snapshot')
Java、Scala 定义
DataTypes.ANY(class, serializer)
DataTypes.ANY(typeInfo)
可以使用ANY('class', 'snapshot')
class
是原始类来声明类型,并 以Base64编码TypeSerializerSnapshot 进行 snapshot 序列化。通常,类型字符串不是直接声明的,而是在保留类型时生成的。
在API中,可以通过直接提供Class + TypeSerializer或通过传递TypeInformation并让框架从那里提取Class + TypeSerializer来声明ANY类型。
桥接到JVM类型
Java类型 | 输入项 | 输出量 | 备注 |
---|---|---|---|
类 | X | X | 原始类或子类(用于输入)或超类(用于输出)。默认 |
byte[] |
X |
欢迎关注Flink菜鸟公众号,会不定期更新Flink(开发技术)相关的推文