【flink-sql实战】flink 主键声明与upsert功能实战

文章目录

  • 一. flink 主键声明语法
  • 二. 物理表创建联合主键表
  • 三. flink sql使用

一. flink 主键声明语法

主键用作 Flink 优化的一种提示信息。主键限制表明一张表或视图的某个(些)列是唯一的并且不包含 Null 值。 主键声明的列都是非 nullable 的。因此主键可以被用作表行级别的唯一标识。

主键可以和列的定义一起声明,也可以独立声明为表的限制属性,不管是哪种方式,主键都不可以重复定义,否则 Flink 会报错。

 
有效性检查

SQL 标准主键限制可以有两种模式:ENFORCED 或者 NOT ENFORCED。 它申明了是否输入/出数据会做合法性检查(是否唯一)。
 
Flink 不存储数据因此只支持 NOT ENFORCED 模式,即不做检查,用户需要自己保证唯一性。

注意: 在 CREATE TABLE 语句中,创建主键会修改列的 nullable 属性,主键声明的列默认都是非 Nullable 的。

 
sql声明语法:

CREATE TABLE [IF NOT EXISTS] [catalog_name.][db_name.]table_name({ <physical_column_definition> | <metadata_column_definition> | <computed_column_definition> }[ , ...n][ <watermark_definition> ][ <table_constraint> ][ , ...n])...<column_constraint>:[CONSTRAINT constraint_name] PRIMARY KEY NOT ENFORCED<table_constraint>:[CONSTRAINT constraint_name] PRIMARY KEY (column_name, ...) NOT ENFORCED
...

联合主键声明

 create table t_sink_01 ( 
f1 varchar, 
f2 varchar,
f3 int,
f4 timestamp(3),
f5 varchar, 
primary key(f1,f2)  NOT ENFORCED  -- 主键声明,字段之间逗号分隔
)
with( 
..
) ;

 
 

二. 物理表创建联合主键表

CREATE TABLE test003(id INT(10),name VARCHAR(25),age int(10),PRIMARY KEY(id,name));desc test003Field|Type       |Null|Key|Default|Extra|
-----+-----------+----+---+-------+-----+
id   |int        |NO  |PRI|       |     |
name |varchar(25)|NO  |PRI|       |     |
age  |int        |YES |   |       |     |

 

三. flink sql使用

CREATE TABLE source
(   `id` int,`username` varchar,`age` int
) WITH ('connector' = 'binlog-x','username' = 'root','password' = '11111111','cat' = 'insert,delete,update','url' = 'jdbc:mysql://10.17.31.234:3306/360test','host' = '10.17.31.234','port' = '3306'-- 什么都不加:最新位置消费-- 加文件名,从此文件开头消费,'journal-name' = 'binlog.000194'--  ,'timestamp'='169944781200','table' = '360test.dimension_table','timestamp-format.standard' = 'SQL');
CREATE TABLE sink
(   `id` int,`name` varchar,`age` int,PRIMARY KEY (id,name) NOT ENFORCED
) WITH ('connector' = 'mysql-x','url' = 'jdbc:mysql://localhost:3306/360test','table-name' = 'test003','username' = 'root','password' = '11111111','sink.buffer-flush.max-rows' = '1024', -- 批量写数据条数,默认:1024'sink.buffer-flush.interval' = '10000', -- 批量写时间间隔,默认:10000毫秒-- insert时的选项,覆盖或者忽略。-- 声明了主键时,设置all-replace为true,全部更新覆盖,-- 或者是忽略,即来的新数据不插入?'sink.all-replace' = 'true', -- 解释如下(其他rdb数据库类似):默认:false。定义了PRIMARY KEY才有效,否则是追加语句-- sink.all-replace = 'true' 生成如:INSERT INTO `result3`(`mid`, `mbb`, `sid`, `sbb`) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE `mid`=VALUES(`mid`), `mbb`=VALUES(`mbb`), `sid`=VALUES(`sid`), `sbb`=VALUES(`sbb`) 。会将所有的数据都替换。-- sink.all-replace = 'false' 生成如:INSERT INTO `result3`(`mid`, `mbb`, `sid`, `sbb`) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE `mid`=IFNULL(VALUES(`mid`),`mid`), `mbb`=IFNULL(VALUES(`mbb`),`mbb`), `sid`=IFNULL(VALUES(`sid`),`sid`), `sbb`=IFNULL(VALUES(`sbb`),`sbb`) 。如果新值为null,数据库中的旧值不为null,则不会覆盖。-- 新增写入选项:默认会判断,当声明了key则是update'sink.parallelism' = '1'    -- 写入结果的并行度,默认:null);
insert into sink select id,username as name,age as age  from source;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/138723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hdlbits系列verilog解答(100输入逻辑门)-39

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 构建一个具有 100 个输入in[99:0]的组合电路。 有 3 个输出: out_and: output of a 100-input AND gate. out_or: output of a 100-input OR gate. out_xor: output of a 100-input XOR gate. 二、verilog源…

ubuntu16.04 交叉编译 mbedtls

在为客户交叉编译项目时需要依赖 mbedtls&#xff0c; 客户的机器是 arm64 的 ubuntu 16.04&#xff0c; 交叉编译过程中遇到几个问题。 首先&#xff0c; mbedtls 需要依赖 python, 在 cmake 的过程中&#xff0c; 如果不是使用系统默认的 cmake 可能会导致&#xff0c;mbedt…

189. 轮转数组

给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数 实现方法1:每次移动一位&#xff0c;直到k个位置。 void roate1(vector<int>& nums, int k) {if(k < 0){return;}int len nums.size();int stride k % len;for…

蓝桥杯算法双周赛心得——被替换的身份证(分类讨论)

大家好&#xff0c;我是晴天学长&#xff0c;分类讨论一定要细节啊&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .被替换的身份证 2) .算法思路 假设一方获胜 1.接受数据 2.假设潜梦醒 无非就是&am…

计算机组成原理之处理器(单周期)

引言 处理器的实现方式决定了时钟周期长度和CPI。实现方式有单周期与流水线&#xff0c;本篇谈谈单周期处理器。 目前CPU的频率一般是3GHZ/4GHZ&#xff0c;但是频率是有极限值的&#xff0c;受cycletime影响 基本的RISC-V实现 存储指令&#xff1a;ld,sd算术逻辑指令 &…

AI 绘画 | Stable Diffusion 进阶 Embeddings(词嵌入)、LoRa(低秩适应模型)、Hypernetwork(超网络)

前言 Stable Diffusion web ui&#xff0c;除了依靠文生图&#xff08;即靠提示词生成图片&#xff09;&#xff0c;图生图&#xff08;即靠图片提示词生成图片&#xff09;外&#xff0c;这两种方式还不能满足我们所有的绘图需求&#xff0c;于是就有了 Embeddings&#xff0…

idea代码快捷键Mac版

1、查询任何东西 双击 Shift2、文件内查找 Command F 3、文件内替换 Command R4、全局查找&#xff08;根据路径&#xff09; Command Shift F5、在当前文件跳转到某一行的指定处 Command L6、退回 / 前进到上一个操作的地方 Command Option 方向键左Command Opt…

京东数据分析:2023年Q3户外鞋服市场分析报告(冲锋衣行业销售数据分析)

从露营、骑行、徒步、桨板、垂钓、飞盘、滑雪到如今的city walk&#xff0c;近两年户外运动已经成为了年轻人新的生活方式。户外运动的爆发也刺激了人们对于鞋服在穿搭、场景化、专业性功能等方向的需求&#xff0c;户外鞋服市场迎来增长。 而全国性的降温则带给目前的户外鞋服…

json数据格式的理解(前+后)

什么是JSON&#xff1a; JSON&#xff08;JavaScript Object Notation&#xff09;是一种广泛使用的数据交换格式&#xff0c;它在前端和后端开发中都扮演着重要的角色。 JSON 的结构&#xff1a; JSON 数据由大括号 {} 包围&#xff0c;表示对象。 对象中的数据以键值对形式…

React 组件和 prop:入门教程

组件和 props React 的核心概念是组件。组件是可重用的代码块&#xff0c;用于描述 UI 中的一部分内容。组件可以通过 props 接收输入&#xff0c;通过 state 管理本地数据&#xff0c;并通过事件处理程序响应用户的操作。 例如&#xff0c;我们可以创建一个名为 Button 的组件…

vue.cli 中怎样使用自定义的组件

目录 创建自定义组件 注册并使用自定义组件 全局注册自定义组件 使用 Props 传递数据 总结 前言 在Vue CLI中使用自定义组件是构建交互式和模块化Web应用的重要一环。Vue CLI为开发者提供了使用自定义组件的灵活性和简便性。通过Vue CLI&#xff0c;你可以创建、注册和使…

【SA8295P 源码分析 (三)】120 - QNX i2c_tool 工具编译、使用方法介绍(I2C / CCI) 及 源码分析

【SA8295P 源码分析】120 - QNX i2c_tool 工具编译、使用方法介绍(I2C / CCI) 及 源码分析 一、i2c_tool 获取、编译 及 使用方法1.1 i2c_tool 源码开发1.2 i2c_tool 源码编译1.3 i2c_tool 使用方法介绍二、i2c_tool 源码分析2.1 头文件 及 数据结构体定义2.2 i2c_write_reg(…

内向基环树

基环树 基环树,也是环套树,是一种有 n 个点 n 条边的图,简单地讲就是树上在加一条边。它形如一个环,环上每个点都有一棵子树的形式。 **基环内向树:**每个点出度为 1(因此每个环上点的子树,儿子指向父亲) **基环外向树:**每个点入度为 1(因此每个环上点的子树,父亲…

yo!这里是哈希应用相关介绍

目录 前言 位图 模拟实现 应用举例 布隆过滤器 模拟实现 应用举例 后记 前言 在介绍unordered系列容器时&#xff0c;我们知道其底层使用的是哈希表&#xff0c;其实哈希是一种方法&#xff0c;是一种思想&#xff0c;哈希思想&#xff08;Hashing&#xff09;是一种在…

模拟一个js底层数据类型隐式转换

隐式转换规则 两端类型相同&#xff0c;比较值。如果一边值为NaN&#xff0c;一律返回falseundefined 和 null 只有自身与自身比较&#xff0c;或者这俩互相比较时才return true两端都是原始类型[number/string/boolean] 转成数字比较只要有一端是对象类型&#xff0c;把对象转…

【第2章 Node.js基础】2.4 Node.js 全局对象...持续更新

什么是Node.js 全局对象 对于浏览器引擎来说&#xff0c;JavaScript 脚本中的 window 是全局对象&#xff0c;而Node.js程序中的全局对象是 global&#xff0c;所有全局变量(除global本身外)都是global 对象的属性。全局变量和全局对象是所有模块都可以调用的。Node.is 的全局…

Vue3 源码解读系列(三)——组件渲染

组件渲染 vnode 本质是用来描述 DOM 的 JavaScript 对象&#xff0c;它在 Vue 中可以描述不同类型的节点&#xff0c;比如&#xff1a;普通元素节点、组件节点等。 vnode 的优点&#xff1a; 抽象&#xff1a;引入 vnode&#xff0c;可以把渲染过程抽象化&#xff0c;从而使得组…

Pytorch实战教程(二十九)-模型训练实用技巧

0. 前言 我们已经学习了多种图像分类模型的构建方法。在本节中,我们介绍在实际构建模型时影响模型性能的因素,包括数据质量(处理不平衡数据)、数据预处理(对象大小)、模型选择、超参数优化和正则化等,了解这些因素能够帮助我们更好地训练和优化机器学习模型。 1. 处理不平衡…

Oracle迁移(RAC变单机模式)

1.升级内核 systemctl stop firewalld systemctl disable firewalldrpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm yum --enablerepo"elrepo-kernel" list --showduplic…

鸿蒙原生应用开发-DevEco Studio远程模拟器的使用

使用单设备模拟器运行应用/服务 Remote Emulator支持Phone、Wearable、Tablet、TV等设备类型&#xff0c;但不同区域&#xff08;开发者帐号注册地&#xff09;支持的设备类型可能不同&#xff0c;请以实际可申请的设备类型为准。 Remote Emulator中的单设备模拟器&#xff08…