【Flink】DataStream API使用之Flink支持的数据类型

Flink的使用过程中,我们的数据都是定义好的 UserBehavior 类型,那还有没有其他更灵活的类型可以用呢?Flink 支持的数据类型到底有哪些?

1. Flink 的类型系统

Flink 作为一个分布式处理框架,处理的是以数据对象作为元素的流。Flink 使用类型信息 (TypeInformation) 来统一表示数据类型,并为每个数据类型生成特定的序列化器、反序列化器和比较器。对于复杂的数据类型,Flink 可能不支持,因此需要使用类型推断机制。此外,Flink 还支持自定义类型信息,以便更好地处理不同类型的数据。

2. Flink 支持的数据类型

常见的 Java 和 Scala 数据类型,Flink 都是支持的。Flink 在内部对不同的类型支持进行了划分,这些类型可以在 Types 工具类中找到:

  • 基本类型: 所有 Java 基本类型及其包装类,再加上 Void、String、Date、BigDecimal 和 BigInteger。
  • 数组类型:基本类型数组(PRIMITIVE_ARRAY)和对象数组(OBJECT_ARRAY)
  • 复合数据类型:
    • Java 元组类型(TUPLE):这是 Flink 内置的元组类型,是 Java API 的一部分。最多25 个字段,也就是从 Tuple0~Tuple25,不支持空字段,
    • Scala 样例类及 Scala 元组:不支持空字段
    • 行类型(ROW):可以认为是具有任意个字段的元组,并支持空字段
    • POJO:Flink 自定义的类似于 Java bean 模式的类
  • 辅助类型:Option、Either、List、Map等
  • 泛型类型(GENERIC):

Flink 对 POJO 类型的要求如下:

  • 类是公共的(public)和独立的(standalone,也就是说没有非静态的内部类);
  • 类有一个公共的无参构造方法;
  • 类中的所有字段是 public 且非 final 的;或者有一个公共的 getter 和 setter 方法,这些
    方法需要符合 Java bean 的命名规范。

3. 类型提示(Type Hints)

Flink提供了显示注册类型信息的方式,通过.returns()实现。

.map(word -> Tuple2.of(word, 1L))
.returns(Types.TUPLE(Types.STRING, Types.LONG));

如果是复杂类型信息可以这样使用:

returns(new TypeHint<Tuple2<Integer, SomeType>>(){})

你可能感兴趣的:(Flink,flink)