首页 > 其他分享 >Flink 使用之 TypeInformation 由于泛型类型在运行时会被JVM擦除,所以要指定类型

Flink 使用之 TypeInformation 由于泛型类型在运行时会被JVM擦除,所以要指定类型

时间:2024-02-19 19:33:35浏览次数:33  
标签:TypeHint Flink TypeInformation 泛型 擦除 使用 类型

Flink 使用之 TypeInformation 由于泛型类型在运行时会被JVM擦除,所以要指定类型

Flink 使用介绍相关文档目录

Flink 使用介绍相关文档目录

背景

本篇从近期遇到的Stream Java API 问题,引出TypeInformation的使用。

Exception in thread "main" org.apache.flink.api.common.functions.InvalidTypesException: The return type of function 'main(XXXTest.java:77)' could not be determined automatically, due to type erasure. You can give type information hints by using the returns(...) method on the result of the transformation call, or by letting your function implement the 'ResultTypeQueryable' interface.

这个问题的原因是由于JVM运行时候会擦除类型(泛型类型),Flink无法准确的获取到数据类型。因此,在使用Java API的时候,我们需要手工指定类型。使用Scala的时候无需指定。

需要使用SingleOutputStreamOperatorreturns方法来指定算子的返回数据类型。

  • returns(Class<T> typeClass):使用Class的方式指定返回数据类型。
  • returns(TypeHint<T> typeHint):使用TypeHint方式指定返回数据类型,通常泛型类型需要使用TypeHint来指定。
  • returns(TypeInformation<T> typeInfo):使用TypeInformation指定。

TypeInformation

TypeInformation是Flink类型系统的核心,是生成序列化/反序列化工具和Comparator的工具类。同时它还是连接schema和编程语言内部类型系统的桥梁。
我们可以使用of方法创建TypeInformation

  • of(Class<T> typeClass):从Class创建。
  • of(TypeHint<T> typeHint):从TypeHint创建。

TypeHint

由于泛型类型在运行时会被JVM擦除,所以说我们无法使用TypeInformation.of(XXX.class)方式指定带有泛型的类型。

为了可以支持泛型类型,Flink引入了TypeHint。例如我们需要获取Tuple2<String, Long>的类型信息,可以使用如下方式:

TypeInformation<Tuple2<String, Long>> info = TypeInformation.of(new TypeHint<Tuple2<String, Long>>(){});
// 或者
TypeInformation<Tuple2<String, Long>> info = new TypeHint<Tuple2<String, Long>>(){}.getTypeInfo();

Types

在Flink中经常使用的类型已经预定义在了Types中。它们的serializer/deserializer和Comparator已经定义好了。

Tuple类型既可以使用TypeHint指定又可以使用Types指定。例如Tuple2<String, Integer>类型我们可以使用如下

TypeInformation.of(new TypeHint<Tuple2<String, Integer>>() {})
Types.TUPLE(Types.STRING, Types.INT)

方式定义。

原文链接:https://www.jianshu.com/p/871db08f169d

标签:TypeHint,Flink,TypeInformation,泛型,擦除,使用,类型
From: https://www.cnblogs.com/sunny3158/p/18021793

相关文章

  • flink的分流器-sideoutput Flink 有两种常见的 State类型,分别是:Keyed State (键控状态
    flink的分流器-sideoutputFlink有两种常见的State类型,分别是:KeyedState(键控状态)和OperatorState(算子状态)为了说明侧输出(sideouptut)的作用,浪尖举个例子,比如现在有一篇文章吧,单词长度不一,但是我们想对单词长度小于5的单词进行wordcount操作,同时又想记录下来哪些单词的长度......
  • Java版Flink(十二)底层函数 API(process function)
    一、概述之前的转化算子是无法访问事件的时间戳信息和水位线watermark,但是,在某些情况下,显得很重要。Flink提供了DataStreamAPI的Low-Level转化算子。比如说可以访问事件时间戳、watermark、以及注册定时器,还可以输出一些特定的事件,比如超时事件等。ProcessFunction用......
  • Flink详解系列之六--窗口机制
    Flink详解系列之六--窗口机制窗口是flink处理无限流的核心,窗口将流拆分为有限大小的“桶”,我们可以在这些桶上进行计算。1、KeyedvsNon-KeyedWindows根据上游数据是否为KeyedStream类型(是否将数据按照某个指定的Key进行分区),将窗口划分为KeyedWindow和Non-KeyedWindow......
  • Flink入门之Flink程序开发步骤(java语言)
    Flink入门之Flink程序开发步骤(java语言)文章目录(0)开发程序所需依赖(1)获取执行环境(2)加载/创建数据源(3)数据转换处理(4)处理后数据放置/输出(5)执行计算程序(6)完整示例注:本篇章的flink学习均是基于java开发语言我们如果要使用flink进行计算开发,一个完整的开发步骤是怎样的呢?前......
  • 【Flink】复函数的使用,时间服务和定时器,值、列表、字典状态变量
    【Flink】复函数的使用,时间服务和定时器,值、列表、字典状态变量文章目录一FlinkDataStreamAPI1复函数2自定义输出到下游设备二处理函数1KeyedProcessFunction的使用(1)时间服务和定时器2状态变量(1)值状态变量a需求一b需求二(2)列表状态变量(3)字典状态变量一Fl......
  • Flink CDC引起的Mysql元数据锁
    记一次FlinkCDC引起的Mysql元数据锁事故,总结经验教训。后续在编写FlinkCDC任务时,要处理好异常,避免产生长时间的元数据锁。同时出现生产问题时要及时排查,不能抱有侥幸心理。1、事件经过某天上午,收到系统的告警信息,告警提示:同步Mysql的某张表数据到Elasticsearch异常,提示连不......
  • 10分钟了解Flink窗口计算
    在有状态流处理中,时间在计算中起着重要的作用。比如,当进行时间序列分析、基于特定时间段进行聚合,或者进行事件时间去处理数据时,都与时间相关。接下来将重点介绍在使用实时Flink应用程序时应该考虑的跟时间相关的一些元素。文中的示例使用到netcat工具。窗口计算有如下几个核心......
  • Flink DataStream API-数据源、数据转换、数据输出
    本文继续介绍FlinkDataStreamAPI先关内容,重点:数据源、数据转换、数据输出。1、Source数据源1.1、Flink基本数据源文件数据源//2.读取数据源DataStream<String>fileDataStreamSource=env.readTextFile("/Users/yclxiao/Project/bigdata/flink-blog/doc/wor......
  • 10分钟了解Flink Watermark水印
    在上一篇中,介绍了Flink里时间的概念和窗口计算,在实际生产过程中,由于网络等原因,许多数据会延迟到达窗口,这种情况Flink如何处理?Watermark登场,本文从这几点进行介绍:水印的概念、水印如何计算、允许延迟和侧道输出、水印生成策略、案例及代码。1、一个小例子讲解概念前,我先举个例......
  • 5分钟了解Flink状态管理
    什么叫做Flink的有状态计算呢?说白了就是将之前的中间结果暂时存储起来,等待后续的事件数据过来后,可以使用之前的中间结果继续计算。本文主要介绍Flink状态计算和管理、代码示例。1、有状态的计算什么是Flink的有状态的计算。在流式计算过程中将算子的中间结果保存在内存或者文......