基于Delta Lake的Upserts数据湖方案

news2024/11/20 20:40:46

导读

基于HDFS的传统数据存储方案由于HDFS等存储平台的限制,只能增加文件不能修改文件中的内容。想要实现某条记录的变更,就需要读取对应的文件并进行重写,效率极低,而且容易引起数据不一致和冲突。Delta Lake是基于Apache Spark的下一代数据湖存储引擎,支持Merge命令,可以高效的完成upsert或删除。

1 为什么需要Upserts?

1 迎合GDPR,general data protection regulation《通用数据保护条例》,这个法案规定需要在使用个人敏感信息时,得到数据主体的同意,并提供自由的查看删除机制。

2 传统数据的CDC,change data capture 变更数据捕获:移动端和web端基于传统数据库实现低延迟的微服务,困难是各个数据库的数据如何统一分析,因此数据分析师需要构建各种ETL把数据汇总到统一的数据湖中。同步数据时经常涉及的变更来自于schema的修改、数据的增删改。

3 会话化:在广告分析或者用户行为分析中,基于会话的事件分析需求是很常见的。但是在数据湖中由于数据都是append追加模式,想要不断的更新会话信息还是比较困难的。比如想把同一个会话中的数据汇总成一条,保存在数据湖中。传统方案需要读取所有的数据,把新的事件追加到会话中,重新写入。

4 去重:一般来说数据湖的数据都是追加模式,因此经常需要在读取数据后进行去重。比如通过每天维护一个业务表的全量信息,使用时需要读取全部数据,按照id取最新的数据。

2 Upserts的挑战

数据湖基于文件,一般都是以追加的形式修改数据。当有数据需要改变时,经常需要读取全部内容重新写回到平台。这种方式:

1 低效:读写整个分区或者表更新少量的记录,会导致延迟和消耗。需要手动调优表和查询

2 出错:手工代码可能会出现BUG,多个操作同时处理一个表时可能报错。

3 难以维护:手工代码难以理解,追踪调试,随着使用的时间,更难维护

Delta Lake就是既能解决更新效率低下,又能进行并发读写控制,还支持时间回溯,查看历史任意时间的数据快照。

3 Delta中的Merge

基于Delta可以很轻松的使用Merge命令完成上面的操作,如下所述,当userId相同时,更新address字段;当userId没有出现在原表中时,则进行插入操作。

MERGE INTO users
USING updates
ON users.userId = updates.userId
WHEN MATCHED THEN
      UPDATE SET address = updates.addresses
WHEN NOT MATCHED THEN
      INSERT (userId, address) VALUES (updates.userId, updates.address)

整个Merge的流程大致:

内部会通过待更新的数据DataFrame与原表进行inner join,找到哪些文件存在数据交集。一方面读取找到的文件的全部内容,与待更新的表进行full outer join,并按照规则更新字段,存储到delta的数据目录,并标记为新增;另一方面直接把找到的文件标记为删除。

因此可以做到如下的优点:

1 细粒度,更新的内容以文件粒度进行修改,而不是分区维度;

2 高效,有数据跳过的机制(inner join后没有标记出的文件什么也不做),不需要全表读取重写

3 事务,基于乐观锁控制并发写入,基于快照机制支持并发读取

总结来说:

在不使用Delta Lake时,需要分析表中哪些分区需要重写;读取对应分区下的所有数据,与更新数据join,重写。

使用Delta Lake时,直接基于merge命令,自动完成数据的更新插入。

4 总结

基于delta lake的merge机制,可以自动完成数据的更新插入。而且这种数据更新插入以文件为最细粒度,效率高;支持事务;支持并发读写。可以很方便的实现批流的整合。

典型的应用场景:使用structured streaming以微批的形式把变更同步到delta lake,后面对接流或者批实现业务计算。

更多系列内容:

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

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

相关文章

微前端四:qiankun在开发中遇到的问题

在qiankun开发中会遇到很多问题,上一篇微前端三:qiankun 协作开发和上线部署其实也是在解决一些经常遇到的问题,下面的两点也算是比较经典的了 1、子应用图片路径问题 2、基座是Vue2.0 element ui 配合 子应用 Vue3.0 element plus 导致的样…

idea Java代码格式化规范

引入 最近在公司开发中,遇到了一点小问题,组内各同事的格式化规范不一致。一来导致代码样式并不统一,二来有时候合并代码会出现冲突,因此做一套统一代码格式化规范很有必要。 基础知识 在idea中,可以通过快捷键Ctrl…

数字孪生技术:煤矿运输的未来革命

煤矿是我国能源工业的重要支柱,然而,煤矿运输过程中一直存在着诸多问题,如安全隐患、能源浪费、效率低下等,这不仅对煤矿行业的可持续发展构成威胁,也对环境造成负面影响。因此,数字孪生技术应运而生&#…

2023年中国有创呼吸机产量、需求量及行业市场规模分析[图]

有创呼吸机主要是通过气管插管或者气管切开,然后通过管道连接在呼吸机上,为患者提供呼吸支持,主要针对的患者是昏迷的,无自主呼吸或不能耐受无创呼吸机的患者。 有创呼吸机是高端医疗装备,设计、生产和临床验证都必须经…

element-ui中表格树类型数据的显示

项目场景&#xff1a; 1&#xff1a;非懒加载的情况 1&#xff1a;效果展示 2&#xff1a;问题描述以及解决 1&#xff1a;图片展示 2&#xff1a;html <-- default-expand-all 代表默认展开 如果不展开删除就行 --> <el-tableref"refsTable"v-loadin…

2023年中国热电厂发电装机量、热电厂发电量及市场需求分析[图]

热电厂是以热定电&#xff0c;以供热为主要目的发电厂。热电厂是同时生产供应热和电的工厂&#xff0c;既是可以对外供热的发电厂&#xff0c;也是可以发电上网的供热站&#xff0c;其核心技术就是“热电联产”。热电厂的主要应用领域涵盖了工业生产、城市供热、电力系统支撑等…

2023年中国液晶显示板产量、需求量、市场规模及价格趋势分析[图]

显示面板主要包括LCD和OLED&#xff0c;液晶显示技术&#xff08;LCD&#xff09;是利用电场改变液晶分子排列状态而调制外界背光源的一种非自发光性显示技术&#xff0c;液晶面板是决定液晶显示器亮度、对比度、色彩、可视角度的材料&#xff0c;目前液晶显示面板的主流为TFT-…

eVTOL无人驾驶载人航空器动力测试系统:500kg级-高精度专业测试系统

平台功能强大的软件操作系统&#xff0c;专用于eVTOL大型电机和螺旋桨动力系统测试。 系统简介 Flight Stand 500测试台通过测量电机和螺旋桨的拉力、扭矩、转速、电流、电压、温度、螺旋桨效率和电机效率来精准地描述和评估无人机动力系统的性能。 技术规格 技术优势 Fligh…

postgresql字符串处理的函数

1. SPLIT_PART SPLIT_PART() 函数通过指定分隔符分割字符串&#xff0c;并返回第N个子串。语法&#xff1a; SPLIT_PART(string, delimiter, position) string : 待分割的字符串 delimiter&#xff1a;指定分割字符串 position&#xff1a;返回第几个字串&#xff0c;从1开始&…

【C++心愿便利店】No.9---C++之内存管理

文章目录 前言一、 C/C内存分布二、 C语言中动态内存管理方式三、 C中动态内存管理四、 operator new与operator delete函数五、 new和delete的实现原理六、 定位new表达式(placement-new)七、 malloc/free和new/delete的区别八、 内存泄漏 前言 &#x1f467;个人主页&#xf…

基于内存的分布式NoSQL数据库Redis(六)AOF设计

文章目录 知识点21&#xff1a;Redis持久化&#xff1a;AOF设计知识点22&#xff1a;Redis持久化&#xff1a;AOF实现附录一&#xff1a;Jedis Maven依赖 知识点21&#xff1a;Redis持久化&#xff1a;AOF设计 目标&#xff1a;掌握Redis的AOF持久化机制 路径 step1&#xff1…

FPGA 图像缩放 1G/2.5G Ethernet PCS/PMA or SGMII实现 UDP 网络视频传输,提供工程和QT上位机源码加技术支持

目录 1、前言版本更新说明免责声明 2、相关方案推荐UDP视频传输--无缩放FPGA图像缩放方案我这里已有的以太网方案 3、设计思路框架视频源选择ADV7611 解码芯片配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 UDP协议栈UDP视频数据组包U…

从0到1,申请cos服务器并上传图片到cos文件服务器

目录 准备工作 Java代码编写 控制台打印 整理成工具类 编写接口 Postman测试 准备工作 1.进入网址腾讯云 产业智变云启未来 - 腾讯 (tencent.com) 2.搜索cos,点击立即使用&#xff0c;刚开始会免费赠送你 3.存储都是基于桶的&#xff0c;先创建桶&#xff0c;在桶里面创…

【C++】多态 -- 详解

⚪前言 声明一下&#xff0c;下面的代码和解释都是在 VS2019 下的 X86 程序中进行的&#xff0c;涉及的指针都是 4 bytes。如果要其他平台下&#xff0c;部分代码需要改动。比如&#xff1a;如果是 X64 程序&#xff0c;则需要考虑指针是 8 bytes 问题等等。其它编译环境下&…

TCP/IP(十八)TCP 实战抓包分析(二)TCP 三次握手和四次挥手

一 TCP三次握手和四次挥手 说明&#xff1a; 本文三次握手和四次挥手 无异常情况下的分析目标&#xff1a; 通过抓取和分析 HTTP 协议网络包,理解 TCP 三次握手和四次挥手的工作原理 ① 抓包和测试准备 1、 服务端事先执行 tcpdump 抓包 --> 172.25.2.100tcpdump -i b…

VMware 虚拟机里连不上网的解决方案

解决办法一&#xff1a; 虚拟机设置里&#xff0c;找到“网络适配器”,右边的网络连接选择“NAT 模式”&#xff0c;如果不行的话再 linux系统。还是不行的话接着看第二种解决方案。 解决方法二&#xff1a; 可能原因是VMware NET Service服务没开 win R&#xff0c;输入&a…

CSS 笔记/练习

CSS 概述 与 html 配合&#xff0c;实现内容与样式分离样式美化 标签中元素作用 class&#xff1a;class属性用于为元素指定一个或多个样式类。通过为元素添加class属性&#xff0c;可以将其与CSS样式表中的样式规则关联起来&#xff0c;从而改变元素的外观和行为。一个元素可…

Confluence 解决PDF导出乱码问题

1.原因 PDF导出乱码是因为由于服务器缺少必要字体 2.解决办法 下载字体文件将字体文件重命名为simhei.ttf Confluence→管理→PDF导出语言支持&#xff0c;导入字体即可

sqlalchemy更新json 字段的部分字段

需求描述&#xff1a; 我们有个json字段&#xff0c;存储的数据形如下&#xff0c;现在需要修改love {"dob":"21","subject":{"love":"programming"}}工程结构 main.py from sqlalchemy import Column, String, Integer,c…

微信公众号如何变更为订阅号?

公众号迁移有什么作用&#xff1f;只能变更主体吗&#xff1f;大家都知道&#xff0c;微信公众号是不支持直接变更主体的&#xff1b;但是很多情况下&#xff0c;我们又不得不进行账号主体的更换&#xff1b;这时候&#xff0c;我么就可以通过账号迁移功能&#xff0c;将A公众号…