Flink SQL支持非常完善的数据类型,以满足不同的数据处理需求。以下是对Flink SQL数据类型的详细归纳:
一、原子数据类型
- 字符串类型
- CHAR、CHAR(n):定长字符串,n代表字符的定长,取值范围为[1, 2147483647]。如果不指定n,则默认为1。
- VARCHAR、VARCHAR(n)、STRING:可变长字符串,n代表字符的最大长度,取值范围为[1, 2147483647]。如果不指定n,则默认为1。STRING等同于VARCHAR(2147483647)。
- 二进制字符串类型
- BINARY、BINARY(n):定长二进制字符串,n代表定长,取值范围为[1, 2147483647]。如果不指定n,则默认为1。
- VARBINARY、VARBINARY(n)、BYTES:可变长二进制字符串,n代表字符的最大长度,取值范围为[1, 2147483647]。如果不指定n,则默认为1。BYTES等同于VARBINARY(2147483647)。
- 精确数值类型
- DECIMAL、DECIMAL§、DECIMAL(p, s)、DEC、DEC§、DEC(p, s)、NUMERIC、NUMERIC§、NUMERIC(p, s):固定长度和精度的数值类型,p代表数值位数(长度),取值范围为[1, 38];s代表小数点后的位数(精度),取值范围为[0, p]。如果不指定,p默认为10,s默认为0。
- 有损精度数值类型
- TINYINT:-128到127的1字节大小的有符号整数。
- SMALLINT:-32768到32767的2字节大小的有符号整数。
- INT、INTEGER:-2147483648到2147483647的4字节大小的有符号整数。
- BIGINT:-9223372036854775808到9223372036854775807的8字节大小的有符号整数。
- 浮点类型
- FLOAT:4字节大小的单精度浮点数值。
- DOUBLE、DOUBLE PRECISION:8字节大小的双精度浮点数值。
- 布尔类型
- BOOLEAN。
- 日期、时间类型
- DATE:由年-月-日组成的不带时区含义的日期类型,取值范围为[0000-01-01, 9999-12-31]。
- TIME、TIME§:由小时:分钟:秒[.小数秒]组成的不带时区含义的时间数据类型,精度高达纳秒,取值范围为[00:00:00.000000000, 23:59:59.9999999]。其中p代表小数秒的位数,取值范围为[0, 9],如果不指定p,默认为0。
- TIMESTAMP、TIMESTAMP§、TIMESTAMP WITHOUT TIME ZONE、TIMESTAMP§ WITHOUT TIME ZONE:由年-月-日 小时:分钟:秒[.小数秒]组成的不带时区含义的时间类型,取值范围为[0000-01-01 00:00:00.000000000, 9999-12-31 23:59:59.999999999]。其中p代表小数秒的位数,取值范围为[0, 9],如果不指定p,默认为6。
- TIMESTAMP WITH TIME ZONE、TIMESTAMP§ WITH TIME ZONE:由年-月-日 小时:分钟:秒[.小数秒] 时区组成的带时区含义的时间类型,取值范围为[0000-01-01 00:00:00.000000000 +14:59, 9999-12-31 23:59:59.999999999 -14:59]。其中p代表小数秒的位数,取值范围为[0, 9],如果不指定p,默认为6。
- TIMESTAMP_LTZ、TIMESTAMP_LTZ§:与TIMESTAMP WITH TIME ZONE类似,但时区信息不是携带在数据中的,而是由Flink SQL任务的全局配置决定的。
二、复合数据类型
- ARRAY:数组类型,类似于Java的array。
- MULTISET:集合类型,类似于Java的List。
- ROW:对象类型,可以包含多个字段,每个字段有自己的类型和名称,类似于Java的Object或Scala的Case Class。
- MAP:映射类型,包含键值对,键和值都可以是任意类型。
样例:
- Tuple(元组)
// 创建一个包含String和Integer类型字段的Tuple2
DataStream<Tuple2<String, Integer>> tupleStream = env.fromElements(
new Tuple2<>("Alice", 30),
new Tuple2<>("Bob", 25)
);
// 访问Tuple2的字段
tupleStream.map(tuple -> tuple.f0 + " is " + tuple.f1 + " years old")
.print();
- POJO(Plain Old Java Object,普通旧Java对象)
// 定义一个POJO类