Flink中有哪些主要的数据类型及其用途是什么?

小贝
预计阅读时长 14 分钟
位置: 首页 小红书 正文

Apache Flink 是一个分布式数据流处理框架,广泛应用于实时数据处理和分析,在 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)。

flink的数据类型

精确数值类型

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 字节大小的有符号整数。

flink的数据类型

浮点类型

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的数据类型”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。

-- 展开阅读全文 --
头像
什么是Fluent存储?它有哪些独特之处?
« 上一篇 2024-12-13
如何有效利用FMDB API文档来优化数据库操作?
下一篇 » 2024-12-13
取消
微信二维码
支付宝二维码

发表评论

暂无评论,1人围观

目录[+]