当前位置: 首页 > news >正文

FLINK SQL数据类型

Flink SQL支持非常完善的数据类型,以满足不同的数据处理需求。以下是对Flink SQL数据类型的详细归纳:

一、原子数据类型

  1. 字符串类型
    • CHAR、CHAR(n):定长字符串,n代表字符的定长,取值范围为[1, 2147483647]。如果不指定n,则默认为1。
    • VARCHAR、VARCHAR(n)、STRING:可变长字符串,n代表字符的最大长度,取值范围为[1, 2147483647]。如果不指定n,则默认为1。STRING等同于VARCHAR(2147483647)。
  2. 二进制字符串类型
    • BINARY、BINARY(n):定长二进制字符串,n代表定长,取值范围为[1, 2147483647]。如果不指定n,则默认为1。
    • VARBINARY、VARBINARY(n)、BYTES:可变长二进制字符串,n代表字符的最大长度,取值范围为[1, 2147483647]。如果不指定n,则默认为1。BYTES等同于VARBINARY(2147483647)。
  3. 精确数值类型
    • 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。
  4. 有损精度数值类型
    • TINYINT:-128到127的1字节大小的有符号整数。
    • SMALLINT:-32768到32767的2字节大小的有符号整数。
    • INT、INTEGER:-2147483648到2147483647的4字节大小的有符号整数。
    • BIGINT:-9223372036854775808到9223372036854775807的8字节大小的有符号整数。
  5. 浮点类型
    • FLOAT:4字节大小的单精度浮点数值。
    • DOUBLE、DOUBLE PRECISION:8字节大小的双精度浮点数值。
  6. 布尔类型
    • BOOLEAN。
  7. 日期、时间类型
    • 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:映射类型,包含键值对,键和值都可以是任意类型。
    样例:
  1. 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();
  1. POJO(Plain Old Java Object,普通旧Java对象)
// 定义一个POJO类  
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  
DataStream<PersonPOJO> personPOJOStream = env.fromElements(  new PersonPOJO("Alice", 30),  new PersonPOJO("Bob", 25)  
);  // 对DataStream进行处理  
personPOJOStream.map(person -> person.getName() + " is " + person.getAge() + " years old")  .print();
  1. Row
CREATE TABLE person_table (  id BIGINT,  name STRING,  age INT  
) WITH (  'connector' = '...,  ...  
);  -- 插入数据(假设已经有数据插入到person_table中)  -- 查询数据,并使用Row来表示结果集中的行  
SELECT id, name, age FROM person_table AS row(id BIGINT, name STRING, age INT);
  1. Map 和 Array
// 创建一个包含Map和Array的DataStream  
DataStream<Tuple2<Map<String, String>, Integer[]>> complexStream = env.fromElements(  new Tuple2<>(  new HashMap<String, String>() {{  put("key1", "value1");  put("key2", "value2");  }},  new Integer[]{1, 2, 3}  ),  // ... 其他元素  
);  // 对DataStream进行处理  
complexStream.map(tuple -> {  Map<String, String> map = tuple.f0;  Integer[] array = tuple.f1;  // ... 对map和array进行处理  return "Processed result"; // 示例返回值,实际应根据需求返回合适的类型  
})  
.print();

三、用户自定义数据类型

Flink SQL也支持用户自定义数据类型,用户可以根据自己的需求定义复杂的数据结构,并通过实现相应的接口或类来注册这些自定义类型。
1、定义与用途
用户自定义数据类型通常用于处理那些无法直接通过Flink内置数据类型表示的数据。例如,当需要处理一个包含多个字段的复杂数据结构时,就可以定义一个包含这些字段的用户自定义数据类型。

2、实现方式
在Flink中,实现用户自定义数据类型通常需要遵循以下步骤:

  1. 定义数据类型:首先,需要定义一个Java或Scala类来表示用户自定义数据类型。这个类应该包含所有需要的字段,并提供相应的getter和setter方法(如果是Java类,还需要一个无参构造方法)。
  2. 实现序列化与反序列化:为了使Flink能够处理用户自定义数据类型,需要实现相应的序列化器和反序列化器。这些序列化器和反序列化器负责将用户自定义数据类型转换为字节流,以及从字节流中恢复出用户自定义数据类型。
  3. 注册类型信息:在Flink中注册用户自定义数据类型的类型信息。这通常是通过在Flink的配置中指定类型信息的方式来实现的。
    3、注意事项
  4. 性能考虑:自定义数据类型的序列化与反序列化过程可能会对性能产生影响。因此,在实现自定义数据类型时,需要仔细考虑如何优化序列化与反序列化过程,以提高性能。
  5. 兼容性:当在不同的Flink集群或版本之间迁移时,需要确保自定义数据类型及其序列化器与反序列化器是兼容的。否则,可能会导致数据无法正确解析或处理。
  6. 错误处理:在处理用户自定义数据类型时,需要特别注意错误处理。例如,当遇到无法解析的数据时,应该能够优雅地处理这些错误,而不是导致整个作业失败。
    4、应用场景
    用户自定义数据类型在Flink中有广泛的应用场景。例如:
  7. 复杂数据结构处理:当需要处理包含多个字段的复杂数据结构时,可以使用用户自定义数据类型来表示这些结构。
  8. 自定义聚合函数:在实现自定义聚合函数时,可能需要使用用户自定义数据类型来存储中间结果或最终结果。
  9. 与外部系统交互:当Flink与外部系统(如数据库、消息队列等)交互时,可能需要将这些系统的数据类型转换为Flink能够处理的数据类型。这时,可以使用用户自定义数据类型来实现这种转换。
    5、样例
    1. 定义自定义数据类型
      首先,定义一个Java类来表示自定义数据类型。例如,我们定义一个名为Person的类,包含name和age两个字段。
public class Person {  private String name;  private int age;  // 无参构造方法  public Person() {}  // 有参构造方法  public Person(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;  }  // 重写toString方法,方便打印输出  @Override  public String toString() {  return "Person{name='" + name + "', age=" + age + "}";  }  
}
2. 实现序列化与反序列化

为了使Flink能够处理Person类型的数据,需要实现相应的序列化器和反序列化器。在Flink中,这通常通过实现TypeSerializer和TypeDeserializer接口来完成。然而,对于简单的POJO(Plain Old Java Object)类型,Flink通常能够自动推断并处理其序列化与反序列化过程,因此在这个例子中我们不需要显式实现这些接口。
3. 注册类型信息(如果需要)
在某些情况下,可能需要显式地在Flink中注册自定义数据类型的类型信息。这通常是在使用低级别的API(如DataStream API)时需要的。然而,在使用Table API或SQL时,Flink通常能够自动推断数据类型,因此不需要显式注册。
4. 使用自定义数据类型
现在,我们可以在Flink作业中使用Person类型的数据了。例如,我们可以创建一个DataStream,并向其中添加Person对象,然后对其进行处理。

// 假设已经有一个执行环境executionEnvironment  
DataStream<Person> personStream = executionEnvironment  .fromElements(new Person("Alice", 30), new Person("Bob", 25))  .name("Person Stream");  // 对DataStream进行处理,例如打印输出  
personStream.print();

综上所述,Flink SQL提供了丰富多样的数据类型,以满足不同的数据处理需求。用户可以根据实际情况选择合适的数据类型,并进行相应的数据处理操作。

相关文章:

FLINK SQL数据类型

Flink SQL支持非常完善的数据类型&#xff0c;以满足不同的数据处理需求。以下是对Flink SQL数据类型的详细归纳&#xff1a; 一、原子数据类型 字符串类型 CHAR、CHAR(n)&#xff1a;定长字符串&#xff0c;n代表字符的定长&#xff0c;取值范围为[1, 2147483647]。如果不指…...

汇编语言教程:打造你的第一款汇编语言小游戏 汇编语言教程攻略

目录 游戏详细简介 完整代码示例&#xff08;不少于70行&#xff09; 如何自学汇编语言游戏开发攻略及功能 游戏详细简介 游戏名称&#xff1a;“太空探险” 游戏简介&#xff1a;这是一款基于x86汇编语言开发的简单2D游戏。在游戏中&#xff0c;玩家扮演一名宇航员&#…...

白色简洁大方公司企业网站源码 WordPress主题2款

WordPress白色简洁大方公司企业网站主题2款 白色整洁风格wordpress主题是一款比较新颖的国际设计范风格 简洁而大方的 WordPress 主题&#xff0c;适合个人博客、企业和工作室用。 完美支持下拉菜单的wordpress企业主题。 wordpress简白企业模板是一款适合企业站以及工作室…...

MinIO分片上传超大文件(纯服务端)

目录 一、MinIO快速搭建1.1、拉取docker镜像1.2、启动docker容器 二、分片上传大文件到MinIO2.1、添加依赖2.2、实现MinioClient2.3、实现分片上传2.3.0、初始化MinioClient2.3.1、准备分片上传2.3.2、分片并上传2.3.2.1、设置分片大小2.3.2.2、分片 2.3.3、分片合并 三、测试3…...

leetcode链表(一)-移除链表元素

题目 t. - 力扣&#xff08;LeetCode&#xff09; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 例1 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]…...

python的特殊方法——魔术方法

前言 __init__(self[]) ​编辑 __call__(self [, ...]) __getitem__(self, key) __len__(self) __repr__(self) / __str__(self) __add__(self, other) __radd__(self, other) 参考文献 前言 官方定义好的&#xff0c;以两个下划线开头且以两个下划线结尾来命名的方法…...

深入浅出理解TCP三次握手与四次挥手

目录 引言1.为什么需要三次握手&#xff1f;2. 三次握手的过程3. 为什么需要四次挥手&#xff1f;4. 四次挥手的过程5. 为什么挥手需要四次&#xff0c;而握手只需三次&#xff1f;6. 三次握手与四次挥手的时序图7. TIME_WAIT状态的意义8. 总结9.面试时候问到什么是三次握手和四…...

如何在Windows和Linux查看正在监听的端口和绑定的进程

端口&#xff08;Port&#xff09;和进程&#xff08;Process&#xff09;是计算机网络和操作系统中的重要概念&#xff0c;它们之间有着密切的关系。以下是对这两个概念的详细介绍以及它们之间的关系(附Windows和Linux查看端口和进程的命令)&#xff1a; 端口&#xff08;Por…...

如何用深度神经网络预测潜在消费者

1. 模型架构 本项目采用的是DeepFM模型&#xff0c;其结构结合了FM&#xff08;因子分解机&#xff09;与深度神经网络&#xff08;DNN&#xff09;&#xff0c;实现了低阶与高阶特征交互的有效建模。模型分为以下几层&#xff1a; 1.1 FM部分&#xff08;因子分解机层&#…...

基于opencv答题卡识别判卷

我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色&#xff1a;深度实…...

ShardingSphere分库分表产品介绍

目录 一、ShardingSphere分库分表产品介绍 二、客户端分库分表与服务端分库分表 1、ShardingJDBC客户端分库分表 2、ShardingProxy服务端分库分表 3、ShardingSphere混合部署架构 三、分库分表&#xff0c;能不分就不分&#xff01; 1、为什么要分库分表&#xff1f; 2、…...

Java经典面试题-多线程打印

threadsynchronized 就好像一个圆圈&#xff0c;A->B->C->A。。。。。 synchronized能够保证多个线程进入实&#xff0c;只用一个线程能进入。 /**多线程交替打印* */ public class Task {private final Object lock new Object();private int count 0;public st…...

FireFox简单设置设置

文章目录 一 设置不显示标签页1原来的样子2新的样子3操作方法 二 设置竖直标签页栏1 效果图2 设置方法 三 设置firefox不提醒更新 一 设置不显示标签页 1原来的样子 2新的样子 3操作方法 地址栏输入 about:config搜索icon,双击选项列表中browserchrome.site icons的值&#…...

Sollong手机——一站式Web3生态解决方案

从定义上讲&#xff0c;Web3公司也属于互联网公司&#xff0c;不过与传统互联网公司相比&#xff0c;他们有一个很明显的特征&#xff1a;他们不断尝试做去中心化的事&#xff0c;一步步将数据和金融的控制权从美联储&#xff08;央行和金融机构&#xff09;、苹果&#xff08;…...

《重生到现代之从零开始的数据结构生活》—— 顺序表1

线性表 线性表&#xff1a;是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使 ⽤的 数据结构&#xff0c;常⻅的线性表有顺序表、链表、栈、队列、字符串等等 线性表在逻辑上是线性结构&#xff0c;也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连…...

2本书让你轻松入门大模型!《大模型入门:技术原理与实战应用》+《自然语言处理:大模型理论与实践》

随着大模型技术的不断完善和普及&#xff0c;我们将进入一个由数据驱动、智能辅助的全新工作模式和生活模式。个人和企业将能够利用大模型来降本增效&#xff0c;并创造全新的用户体验。 人工智能是人类探索未来的重要领域之一&#xff0c;以GPT为代表的大模型应用一经推出在短…...

【JDK17 | 1】Java 17 深入剖析:新特性与变革

引言 Java 17 是 Oracle 发布的一个重要版本,它不仅是一个长期支持(LTS)版本,还引入了许多新的特性和改进,为开发者提供了更强大的工具和更优雅的编程体验。在本专栏的文章中,我们将对 Java 17 的新特性进行深入剖析,帮助开发者更好地理解和利用这一版本。 1. 新特性概述…...

strtok

strtok函数原型 char *strtok&#xff08;conset char *str,conset char *dst&#xff09;; 功能&#xff1a; 将字符串分割成一个一个片段 当strtok&#xff08;&#xff09;在参数str的字符串中发现参数dst中包含的分割字符时&#xff0c;则会将该字符改为\0字符 当连续出现…...

零信任身份安全的基本原则

零信任身份安全的核心原则就是 “持续验证&#xff0c;永不信任”。可以通过以下6个方面理解&#xff1a; 对“谁”和“什么”进行认证和授权 在零信任身份安全模型中&#xff0c;对用户和设备的身份进行认证和授权是至关重要的。认证是确认用户或设备是其所宣称的身份的过程…...

【AAOS】Android Automotive 9模拟器源码下载及编译

源码下载 repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_r61 repo sync -c --no-tags --no-clone-bundle 源码编译 source build/envsetup.sh lunch aosp_car_x86_64-userdebug make -j8 运行效果 emulator Home界面 MAP All apps S…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...