Flink中有哪些主要的数据类型及其用途是什么?
Apache Flink 是一个分布式数据流处理框架,广泛应用于实时数据处理和分析,在 Flink 中,数据类型系统是其核心组件之一,用于描述和管理数据的结构,Flink 支持多种数据类型,包括原子数据类型、复合数据类型和特殊数据类型,以下是对 Flink 数据类型的详细介绍:
1、原子数据类型
字符串类型
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(p, s)、DEC、DEC(p, s)、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(p):由小时:分钟:秒[.小数秒]组成的不带时区含义的时间数据类型,精度高达纳秒,取值范围为 [00:00:00.000000000, 23:59:59.9999999],p 代表小数秒的位数,取值范围为 [0, 9],如果不指定 p,默认为 0。
TIMESTAMP、TIMESTAMP(p)、TIMESTAMP WITHOUT TIME ZONE、TIMESTAMP WITH TIME ZONE:由年-月-日 小时:分钟:秒[.小数秒]组成的不带时区含义的时间类型,取值范围为 [0000-01-01 00:00:00.000000000, 9999-12-31 23:59:59.999999999],p 代表小数秒的位数,取值范围为 [0, 9],如果不指定 p,默认为 6。
2、复合数据类型
ARRAY:数组类型,类似于 Java 的 array。
MULTISET:集合类型,类似于 Java 的 List。
ROW:对象类型,可以包含多个字段,每个字段有自己的类型和名称,类似于 Java 的 Object 或 Scala 的 Case Class。
MAP:映射类型,包含键值对,键和值都可以是任意类型。
Tuple(元组):Flink 提供了对 Java 和 Scala 元组的支持,Java 元组类型由 Flink 的包提供,默认提供 Tuple0~Tuple25。
DataStream<Tuple2<String, Integer>> personStream = env.fromElements(new Tuple2<>("Adam", 17), new Tuple2<>("Sarah", 23)); personStream.filter(p -> p.f1 > 18);
Scala Case Class:Flink 通过实现 CaseClassTypeInfo 支持任意的 Scala Case Class,包括 Scala tuples 类型,支持的字段数量上限为 22。
val numbers: DataStream[(String, Integer)] = env.fromElements(("Flink", 1), ("Spark", 2))
POJO(Plain Old Java Object):POJOs 类可以完成复杂数据结构的定义,Flink 通过实现 PojoTypeInfo 来描述任意的 POJOs,包括 Java 和 Scala 类,使用 POJOs 类需要遵循以下要求:
POJOs 类必须是 Public 修饰且必须独立定义,不能是内部类。
POJOs 类中必须含有默认空构造器。
POJOs 类中所有的字段必须是 Public 或者具有 Public 修饰的 getter 和 setter 方法。
POJOs 类中的字段类型必须是 Flink 支持的。
public class PersonPOJO { public String name; public int age; // 无参构造方法 public PersonPOJO() {} // 有参构造方法 public PersonPOJO(String name, int age) { this.name = name; this.age = age; } // Getter和Setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
创建包含 PersonPOJO 对象的数据集:
DataStream<PersonPOJO> peopleStream = env.fromElements(new PersonPOJO("Alice", 30), new PersonPOJO("Bob", 25));
Value类型:实现了 org.apache.flink.types.Value,其中包括 read()和 write()两个方法完成序列化和反序列化操作,Flink 提供了内建的 Value 类型有 IntValue、DoubleValue 以及 StringValue 等。
3、特殊数据类型
Flink 还支持一些特殊的数据类型,Scala 中的 List、Map、Either、Option、Try,以及 Java 中的 Either 和 Hadoop 的 Writable,这些数据类型的使用场景相对不那么广泛,主要原因是数据中的操作相对不像 POJOs 类那样方便和透明,用户无法根据字段位置或者名称获取字段信息,同时要借助 Types Hint 帮助 Flink 推断数据类型信息。
Flink的数据类型系统非常完善,能够支持各种复杂的数据处理需求,通过合理选择和使用不同的数据类型,可以提高数据处理的效率和性能。
小伙伴们,上文介绍了“flink的数据类型”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
暂无评论,1人围观