数据类型
Posted s为了生活
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据类型相关的知识,希望对你有一定的参考价值。
-
强类型语言
要求把变量的使用要严格符合规定,所有变量都必须先定义后才能使用
例如 String表示字符串 char表示字符.....
-
弱类型语言
-
Java的数据类型分为两大类
基本数据类型
-
整数类型: byte占一个字节范围:-128-127
short占两个字节范围:-32768-32767
int占四个字节范围:-21亿-21亿
long占八个字节范围:-900万万亿-900万万亿 (long类型要在数字后面加L)
浮点数类型(小数):float占四个字节(float类型要在后面加f)
double占八个字节
字符类型:char占两个字节
-
boolean类型:占1位其值只有true和false两个
引用类型: 接口
类
-
1.19.6.数据类型数据类型列表结构化的数据类型其他数据类型数据类型注解
1.19.6.数据类型
1.19.6.1.数据类型
1.19.6.1.1.Table API的数据类型
1.19.6.1.1.1.物理提示
1.19.6.2.Planner兼容性
1.19.6.3.旧的Planner
1.19.6.4.新的 Blink Planner
1.19.6.5.局限性
1.19.6.6.数据类型列表
1.19.6.6.1.字符串
1.19.6.6.1.1.CHAR
1.19.6.6.1.2.VARCHAR / STRING
1.19.6.6.2.二进制字符串
1.19.6.6.2.1.BINARY
1.19.6.6.3.精确数值
1.19.6.6.3.1.DECIMAL
1.19.6.6.3.2.TINYINT
1.19.6.6.3.3.SMALLINT
1.19.6.6.3.4.INT
1.19.6.6.3.5.BIGINT
1.19.6.6.4.近似值
1.19.6.6.4.1.FLOAT
1.19.6.6.4.2.DOUBLE
1.19.6.6.5.日期和时间
1.19.6.6.5.1.DATE
1.19.6.6.5.2.TIME
1.19.6.6.5.3.TIMESTAMP
1.19.6.6.5.4.TIMESTAMP WITH TIME ZONE
1.19.6.6.5.5.TIMESTAMP WITH LOCAL TIME ZONE
1.19.6.6.5.6.INTERVAL YEAR TO MONTH
1.19.6.6.5.7.INTERVAL DAY TO SECOND
1.19.6.6.6.结构化的数据类型
1.19.6.6.6.1.ARRAY
1.19.6.6.6.2.MAP
1.19.6.6.6.3.MULTISET
1.19.6.6.6.4.ROW
1.19.6.6.7.其他数据类型
1.19.6.6.7.1.BOOLEAN
1.19.6.6.7.2.RAW
1.19.6.6.7.3.NULL
1.19.6.6.8.数据类型注解
1.19.6.数据类型
由于历史原因,在 Flink 1.9 之前,Flink Table & SQL API 的数据类型与 Flink 的 TypeInformation 耦合紧密。TypeInformation 在 DataStream 和 DataSet API 中被使用,并且足以用来用于描述分布式环境中 JVM 对象的序列化和反序列化操作所需的全部信息。
然而,TypeInformation 并不是为独立于 JVM class 的逻辑类型而设计的。之前很难将 SQL 的标准类型映射到 TypeInformation 抽象。此外,有一些类型并不是兼容 SQL 的并且引入的时候没有长远规划过。
从 Flink 1.9 开始,Table & SQL API 开始启用一种新的类型系统作为长期解决方案,用来保持 API 稳定性和 SQL 标准的兼容性。
重新设计类型系统是一项涉及几乎所有的面向用户接口的重大工作。因此,它的引入跨越多个版本,社区的目标是在 Flink 1.12 完成这项工作。
同时由于为 Table 编程添加了新的 Planner 详见(FLINK-11439), 并不是每种 Planner 都支持所有的数据类型。此外,Planner 对于数据类型的精度和参数化支持也可能是不完整的。
注意 在使用数据类型之前请参阅 Planner 的兼容性表和局限性章节。
1.19.6.1.数据类型
数据类型 描述 Table 编程环境中的值的逻辑类型。它可以被用来声明操作的输入输出类型。
Flink 的数据类型和 SQL 标准的 数据类型 术语类似,但也包含了可空属性,可以被用于标量表达式(scalar expression)的优化。
数据类型的示例:
INT
INT NOT NULL
INTERVAL DAY TO SECOND(3)
ROW<myField ARRAY, myOtherField TIMESTAMP(3)>
全部的预定义数据类型见下面列表。
1.19.6.1.1.Table API的数据类型
JVM API 的用户可以在Table API中、定义连接器(Connector)、Catalog 或者用户自定义函数(User-Defined Function)中使用 org.apache.flink.table.types.DataType 的实例。
一个DataType实例有两个作用:
**逻辑类型的声明:**它不表达具体物理类型的存储和转换,但是定义了基于JVM的语言或者Python语言和Table编程环境之间的边界。
可选的:向Planner提供有关数据的物理表示的提示,这对于边界API 很有用。
对于基于JVM的语言,所有预定义的数据类型都在org.apache.flink.table.api.DataTypes里提供。
Java代码:
建议使用*将全部的 API 导入到 Table 程序中以便于使用:
import static org.apache.flink.table.api.DataTypes.*;
DataType t = INTERVAL(DAY(), SECOND(3));
Scala代码:
import org.apache.flink.table.api.DataTypes._
val t: DataType = INTERVAL(DAY(), SECOND(3));
1.19.6.1.1.1.物理提示
在 Table 编程环境中,基于 SQL 的类型系统与程序指定的数据类型之间需要物理提示。该提示指出了实现预期的数据格式。
例如,Data Source 能够使用类 java.sql.Timestamp 来表达逻辑上的 TIMESTAMP 产生的值,而不是使用缺省的 java.time.LocalDateTime。有了这些信息,运行时就能够将产生的类转换为其内部数据格式。反过来,Data Sink 可以声明它从运行时消费的数据格式。
下面是一些如何声明桥接转换类的示例:
Java代码:
// 告诉运行时不要产生或者消费 java.time.LocalDateTime 实例
// 而是使用 java.sql.Timestamp
DataType t = DataTypes.TIMESTAMP(3).bridgedTo(java.sql.Timestamp.class);
// 告诉运行时不要产生或者消费装箱的整数数组
// 而是使用基本数据类型的整数数组
DataType t = DataTypes.ARRAY(DataTypes.INT().notNull()).bridgedTo(int[].class);
Scala代码:
// 告诉运行时不要产生或者消费 java.time.LocalDateTime 实例
// 而是使用 java.sql.Timestamp
val t: DataType = DataTypes.TIMESTAMP(3).bridgedTo(classOf[java.sql.Timestamp]);
// 告诉运行时不要产生或者消费装箱的整数数组
// 而是使用基本数据类型的整数数组
val t: DataType = DataTypes.ARRAY(DataTypes.INT().notNull()).bridgedTo(classOf[Array[Int]]);
注意:请注意,通常只有在扩展 API 时才需要物理提示。 预定义的 Source、Sink、Function 的用户不需要定义这样的提示。在 Table 编程中(例如 field.cast(TIMESTAMP(3).bridgedTo(Timestamp.class)))这些提示将被忽略。
1.19.6.2.Planner兼容性
正如简介里提到的,重新开发类型系统将跨越多个版本,每个数据类型的支持取决于使用的 Planner。本节旨在总结最重要的差异。
1.19.6.3.旧的Planner
Flink 1.9 之前引入的旧的 Planner 主要支持类型信息(Type Information),它只对数据类型提供有限的支持,可以声明能够转换为类型信息的数据类型,以便旧的 Planner 能够理解它们。
下表总结了数据类型和类型信息之间的区别。大多数简单类型以及 Row 类型保持不变。Time 类型、 Array 类型和 Decimal 类型需要特别注意。不允许使用其他的类型提示。
对于 类型信息 列,该表省略了前缀 org.apache.flink.table.api.Types。
对于 数据类型表示 列,该表省略了前缀 org.apache.flink.table.api.DataTypes。
**注意:**如果对于新的类型系统有任何疑问,用户可以随时切换到 org.apache.flink.table.api.Types 中定义的 type information。
1.19.6.4.新的 Blink Planner
新的Blink Planner 支持旧的 Planner 的全部类型,尤其包括列出的 Java 表达式字符串和类型信息。
支持以下数据类型:
数据类型 | 数据类型的备注 |
---|---|
CHAR | |
VARCHAR | |
STRING | |
BOOLEAN | |
BYTES | BINARY 和 VARBINARY 暂不支持。 |
DECIMAL | 支持固定精度和小数位数。 |
TINYINT | |
SMALLINT | |
INTEGER | |
BIGINT | |
FLOAT | |
DOUBLE | |
DATE | |
TIME | 支持的精度仅为 0。 |
TIMESTAMP | |
TIMESTAMP WITH LOCAL TIME ZONE | |
INTERVAL | 仅支持 MONTH 和 SECOND(3) 区间。 |
ARRAY | |
MULTISET | |
MAP | |
ROW | |
RAW | |
structured types | 暂只能在用户自定义函数里使用。 |
1.19.6.5.局限性
Java 表达式字符串:Table API 中的 Java 表达式字符串,例如 table.select(“field.cast(STRING)”),尚未被更新到新的类型系统中,使用旧的 Planner 章节中声明的字符串来表示。
用户自定义函数:用户自定义聚合函数尚不能声明数据类型,标量函数和表函数充分支持数据类型。
1.19.6.6.数据类型列表
1.19.6.6.1.字符串
1.19.6.6.1.1.CHAR
固定长度字符串的数据类型
声明
SQL
Java
Scala
Python
尚不支持
此类型用 CHAR(n) 声明,其中 n 表示字符数量。n 的值必须在 1 和 2,147,483,647 之间(含边界值)。如果未指定长度,n 等于1。
1.19.6.6.1.2.VARCHAR / STRING
可变长度字符串的数据类型。
声明
SQL
Java
Scala
Python
此类型用 VARCHAR(n) 声明,其中 n 表示最大的字符数量。n 的值必须在 1 和 2,147,483,647 之间(含边界值)。如果未指定长度,n 等于1。
STRING等价于 VARCHAR(2147483647).
1.19.6.6.2.二进制字符串
1.19.6.6.2.1.BINARY
固定长度二进制字符串的数据类型(=字节序列)
声明
SQL
Java
Scala
Python
此类型用 VARBINARY(n) 声明,其中 n 是最大的字节数量。n 的值必须在 1 和 2,147,483,647 之间(含边界值)。如果未指定长度,n 等于 1。
BYTES 等价于 VARBINARY(2147483647)。
1.19.6.6.3.精确数值
1.19.6.6.3.1.DECIMAL
精度和小数位数固定的十进制数字的数据类型。
声明
SQL
Java
Scala
Python
此类型用 DECIMAL(p, s) 声明,其中 p 是数字的位数(精度),s 是数字中小数点右边的位数(尾数)。p 的值必须介于 1 和 38 之间(含边界值)。s的值必须介于0和p之间(含边界值)。其中p的缺省值是10,s的缺省值是0。
NUMERIC(p, s) 和 DEC(p, s) 都等价于这个类型。
1.19.6.6.3.2.TINYINT
1 字节有符号整数的数据类型,其值从 -128 to 127。
声明
SQL
TINYINT
Java类型
Scala
Python
DataTypes.TINYINT()
1.19.6.6.3.3.SMALLINT
2 字节有符号整数的数据类型,其值从 -32,768 到 32,767。
声明
SQL
SMALLINT
Java
Scala
Python
DataTypes.SMALLINT()
1.19.6.6.3.4.INT
4 字节有符号整数的数据类型,其值从 -2,147,483,648 到 2,147,483,647。
声明
SQL
INT
INTEGER
Java
Scala
Python
DataTypes.INT()
INTEGER 等价于此类型。
1.19.6.6.3.5.BIGINT
8 字节有符号整数的数据类型,其值从 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
声明
SQL
BIGINT
Java
Scala
Python
DataTypes.BIGINT()
1.19.6.6.4.近似值
1.19.6.6.4.1.FLOAT
4字节单精度浮点数的数据类型。
与SQL标准相比,该类型不带参数。
声明
SQL
FLOAT
Java
Scala
Python
DataTypes.FLOAT()
1.19.6.6.4.2.DOUBLE
8 字节双精度浮点数的数据类型。
声明
SQL
DOUBLE
DOUBLE PRECISION
Java
Scala
Python
DataTypes.DOUBLE()
DOUBLE PRECISION 等价于此类型。
1.19.6.6.5.日期和时间
1.19.6.6.5.1.DATE
日期的数据类型由year-month-day组成,范围从0000-01-01到9999-12-31。
与SQL标准相比,年的范围从0000开始。
声明
SQL
DATE
Java
Scala
Python
DataTypes.DATE()
1.19.6.6.5.2.TIME
不带时区的时间数据类型,由 hour:minute:second[.fractional] 组成,精度达到纳秒,范围从 00:00:00.000000000 到 23:59:59.999999999。
与SQL标准相比,不支持闰秒(23:59:60和23:59:61)。没有提供带有时区的时间。
声明
SQL
TIME
TIME§
Java
Scala
Python
DataTypes.TIME§
注意:当前,声明DataTypes.TIME§中的所指定的精度 p 必须为0。
此类型用TIME§声明,其中p是秒的小数部分的位数(精度)。p的值必须介于0和9之间(含边界值)。如果未指定精度,则p等于0.
1.19.6.6.5.3.TIMESTAMP
不带时区的时间戳数据类型,由 year-month-day hour:minute:second[.fractional] 组成,精度达到纳秒,范围从 0000-01-01 00:00:00.000000000 到 9999-12-31 23:59:59.999999999。
与SQL标准相比,不支持闰秒(23:59:60和23:59:61)。
不支持和 BIGINT(JVM long 类型)互相转换,因为这意味着有时区,然而此类型是无时区的。有此需求请使用 TIMESTAMP WITH LOCAL TIME ZONE。
声明
SQL
TIMESTAMP
TIMESTAMP(p)
TIMESTAMP WITHOUT TIME ZONE
TIMESTAMP(p) WITHOUT TIME ZONE
Java
Scala
Python
DataTypes.TIMESTAMP§
注意:当前,声明DataTypes.TIMESTAMP§中的所指定的精度 p 必须为3。
此类型用 TIMESTAMP§ 声明,其中 p 是秒的小数部分的位数(精度)。p 的值必须介于 0 和 9 之间(含边界值)。如果未指定精度,则 p 等于 6。
TIMESTAMP§ WITHOUT TIME ZONE 等价于此类型。
1.19.6.6.5.4.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 标准相比,不支持闰秒(23:59:60 和 23:59:61)。
与 TIMESTAMP WITH LOCAL TIME ZONE 相比,时区偏移信息物理存储在每个数据中。它单独用于每次计算、可视化或者与外部系统的通信。
声明
SQL
TIMESTAMP WITH TIME ZONE
TIMESTAMP(p) WITH TIME ZONE
Java
Scala
此类型用TIMESTAMP§ WITH TIME ZONE声明,其中 p 是秒的小数部分的位数(精度)。p 的值必须介于 0 和 9 之间(含边界值)。如果未指定精度,则 p 等于 6。
1.19.6.6.5.5.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。
不支持闰秒(23:59:60 和 23:59:61)。
与 TIMESTAMP WITH TIME ZONE 相比,时区偏移信息并非物理存储在每个数据中。每个数据都在当前会话中配置的本地时区中进行解释,以便用于计算和可视化。
此类型允许根据配置的会话时区来解释 UTC 时间戳,从而填补了时区无关和时区相关的时间戳类型之间的鸿沟。
声明
SQL
TIMESTAMP WITH LOCAL TIME ZONE
TIMESTAMP§ WITH LOCAL TIME ZONE
此类型用TIMESTAMP§ WITH LOCAL TIME ZONE声明,其中p是秒的小数部分的位数(精度)。p的值必须介于0和9之间(含边界值)。如果未指定精度,则p等于6。
Java
Scala
Python
DataTypes.TIMESTAMP_WITH_LOCAL_TIME_ZONE(p)
注意: 当前,声明DataTypes.TIMESTAMP_WITH_LOCAL_TIME_ZONE§中的所指定的精度 p 必须为3。
此类型用 TIMESTAMP§ WITH LOCAL TIME ZONE 声明,其中 p 是秒的小数部分的位数(精度)。p 的值必须介于 0 和 9 之间(含边界值)。如果未指定精度,则 p 等于 6。
1.19.6.6.5.6.INTERVAL YEAR TO MONTH
一组Year-Month Interval 数据类型。
此类型必被参数化为以下情况中的一种:
Year时间间隔、
Year-Month时间间隔、
Month时间间隔。
Year-Month Interval由+years-months组成,其范围从-9999-11到+9999-11。
所有类型的表达能力均相同。例如,Month 时间间隔下的 50 等价于 Year-Month 时间间隔(缺省年份精度)下的 +04-02。
声明
SQL
INTERVAL YEAR
INTERVAL YEAR(p)
INTERVAL YEAR(p) TO MONTH
INTERVAL MONTH
Java
scala
Python
可以使用以上组合来声明类型,其中 p 是年数(年精度)的位数。p 的值必须介于 1 和 4 之间(含边界值)。如果未指定年精度,p 则等于2。
1.19.6.6.5.7.INTERVAL DAY TO SECOND
一组 Day-Time Interval数据类型。
此类型达到纳秒精度,必被参数化为以下情况中的一种:
Day时间间隔。
Day-Hour时间间隔。
Day-Minute时间间隔。
Day-Second时间间隔。
Hour时间间隔。
Hour-Minute时间间隔。
Hour-Second时间间隔。
Minute时间间隔。
Minute-Second时间间隔。
Second时间间隔。
Day-Time时间间隔由+days hours:months:seconds.fractional组成,其范围从-999999 23:59:59.999999999 到 +999999 23:59:59.999999999。
所有类型的表达能力均相同。例如,Second 时间间隔下的 70 等价于 Day-Second 时间间隔(缺省精度)下的 +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
Python
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。
1.19.6.6.6.结构化的数据类型
1.19.6.6.6.1.ARRAY
具有相同子类型元素的数组的数据类型。
与 SQL 标准相比,无法指定数组的最大长度,而是被固定为 2,147,483,647。另外,任何有效类型都可以作为子类型。
声明
SQL
ARRAY<t>
t ARRAY
Java
Scala
Python
DataTypes.ARRAY(t)
此类型用 ARRAY 声明,其中 t 是所包含元素的数据类型。
t ARRAY 接近等价于 SQL 标准。例如,INT ARRAY 等价于 ARRAY。
1.19.6.6.6.2.MAP
将键(包括 NULL)映射到值(包括 NULL)的关联数组的数据类型。映射不能包含重复的键;每个键最多可以映射到一个值。
元素类型没有限制;确保唯一性是用户的责任。
Map类型是SQL标准的扩展。
声明
SQL
MAP<kt, vt>
Java
Scala
Python
DataTypes.MAP(kt, vt)
此类型用 MAP<kt, vt> 声明,其中 kt 是键的数据类型,vt 是值的数据类型。
1.19.6.6.6.3.MULTISET
多重集合的数据类型(=bag)。与集合不同的是,它允许每个具有公共子类型的元素有多个实例。每个唯一值(包括 NULL)都映射到某种多重性。
元素类型没有限制;确保唯一性是用户的责任。
声明
SQL
MULTISET<t>
t MULTISET
Java
Scala
Python
DataTypes.MULTISET(t)
此类型用 MULTISET 声明,其中 t 是所包含元素的数据类型。
t MULTISET 接近等价于 SQL 标准。例如,INT MULTISET 等价于 MULTISET。
1.19.6.6.6.4.ROW
字段序列的数据类型
字段由字段名称、字段类型和可选的描述组成。表中的行的是最特殊的类型是 Row 类型。在这种情况下,行中的每一列对应于相同位置的列的 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
Python
此类型用 ROW<n0 t0 ‘d0’, n1 t1 ‘d1’, …> 声明,其中 n 是唯一的字段名称,t 是字段的逻辑类型,d 是字段的描述。
ROW(…) 接近等价于 SQL 标准。例如,ROW(myField INT, myOtherField BOOLEAN) 等价于 ROW<myField INT, myOtherField BOOLEAN>。
1.19.6.6.7.其他数据类型
1.19.6.6.7.1.BOOLEAN
(可能)具有TRUE、FALSE 和UNKNOWN三值逻辑的布尔数据类型。
声明
SQL
BOOLEAN
Java
Scala
Python
DataTypes.BOOLEAN()
1.19.6.6.7.2.RAW
任意序列化类型的数据类型。此类型对于Flink Table来讲是一个黑盒子,仅在跟外部交互时被反序列化。
Raw类型是SQL标准的扩展。
声明
SQL
RAW('class', 'snapshot')
Java
Scala
此类型用 RAW(‘class’, ‘snapshot’) 声明,其中 class 是原始类,snapshot 是 Base64 编码的序列化的 TypeSerializerSnapshot。通常,类型字符串不是直接声明的,而是在持久化类型时生成的。
在API中,可以通过直接提供 Class + TypeSerializer 或通过传递TypeInformation并让框架从那里提取Class + TypeSerializer 来声明 RAW 类型。
1.19.6.6.7.3.NULL
表示空类型 NULL 值的数据类型。
NULL类型是SQL标准的扩展。NULL 类型除 NULL 值以外没有其他值,因此可以将其强制转换为JVM里的任何可空类型。
此类型有助于使用 NULL 字面量表示API调用中的未知类型,以及桥接到定义该类型的JSON或Avro等格式。
这种类型在实践中不是很有用,为完整起见仅在此提及。
声明
SQL
NULL
Java
Scala
1.19.6.6.8.数据类型注解
Flink API 经常尝试使用反射自动从类信息中提取数据类型,以避免重复的手动定义模式工作。然而以反射方式提取数据类型并不总是成功的,因为可能会丢失逻辑信息。因此,可能有必要在类或字段声明附近添加额外信息以支持提取逻辑。
下表列出了可以隐式映射到数据类型而无需额外信息的类。
If you intend to implement classes in Scala, it is recommended to use boxed types (e.g. java.lang.Integer) instead of Scala’s primitives. Scala’s primitives (e.g. Int or Double) are compiled to JVM primitives (e.g. int/double) and result in NOT NULL semantics as shown in the table below. Furthermore, Scala primitives that are used in generics (e.g. java.util.Map[Int, Double]) are erased during compilation and lead to class information similar to java.util.Map[java.lang.Object, java.lang.Object].
本文提到的其他 JVM 桥接类都需要 @DataTypeHint 注解。
数据类型提示 可以参数化或替换函数参数和返回值、结构化类或结构化类字段的默认提取逻辑,实现者可以通过声明 @DataTypeHint 注解来选择默认提取逻辑应修改的程度。
@DataTypeHint 注解提供了一组可选的提示参数,以下示例显示了其中一些参数,可以在注解类的文档中找到更多信息。
Java
import org.apache.flink.table.annotation.DataTypeHint;
class User
// defines an INT data type with a default conversion class `java.lang.Integer`
public @DataTypeHint("INT") Object o;
// defines a TIMESTAMP data type of millisecond precision with an explicit conversion class
public @DataTypeHint(value = "TIMESTAMP(3)", bridgedTo = java.sql.Timestamp.class) Object o;
// enrich the extraction with forcing using a RAW type
public @DataTypeHint("RAW") Class<?> modelClass;
// defines that all occurrences of java.math.BigDecimal (also in nested fields) will be
// extracted as DECIMAL(12, 2)
public @DataTypeHint(defaultDecimalPrecision = 12, defaultDecimalScale = 2) AccountStatement stmt;
// defines that whenever a type cannot be mapped to a data type, instead of throwing
// an exception, always treat it as a RAW type
public @DataTypeHint(allowRawGlobally = HintFlag.TRUE) ComplexModel model;
Scala
import org.apache.flink.table.annotation.DataTypeHint
class User
// defines an INT data type with a default conversion class `java.lang.Integer`
@DataTypeHint("INT")
var o: AnyRef
// defines a TIMESTAMP data type of millisecond precision with an explicit conversion class
@DataTypeHint(value = "TIMESTAMP(3)", bridgedTo = java.sql.Timestamp.class)
var o: AnyRef
// enrich the extraction with forcing using a RAW type
@DataTypeHint("RAW")
var modelClass: Class[_]
// defines that all occurrences of java.math.BigDecimal (also in nested fields) will be
// extracted as DECIMAL(12, 2)
@DataTypeHint(defaultDecimalPrecision = 12, defaultDecimalScale = 2)
var stmt: AccountStatement
// defines that whenever a type cannot be mapped to a data type, instead of throwing
// an exception, always treat it as a RAW type
@DataTypeHint(allowRawGlobally = HintFlag.TRUE)
var model: ComplexModel
以上是关于数据类型的主要内容,如果未能解决你的问题,请参考以下文章
1.19.6.数据类型数据类型列表结构化的数据类型其他数据类型数据类型注解