kettle开发-Day38-超好用自定义数据处理组件

news2024/11/18 23:00:35

目录

前言:

一、半斤八两,都不太行

        1、表输入,速度快,但不稳妥

        2、稳的一批,但是慢的像蜗牛 

二、各诉衷肠,合作共赢

         1、表输入,高效数据插入

          2、插入更新,一个都不能少

三、表输入的高效+插入更新的完整性

        1、思路

        2、数据对比

        3、数据插入

         4、效果查看

前言:

        上节我们讲到使用主键+索引的方式来处理数据的新增,但是对会对历史数据进行增删改的操作就不好处理了。因此我们需要一种区别于现有功能的高效历史数据DML的操作。目前kettle在处理数据方面,常用组件,分别为“表输入”、“表输出”、“插入更新”、“执行SQL脚本”、“Java 代码”、“JavaScript代码”等。其中“表输入”就是用于读取数据,就不做过多的阐述。今天主要集中讲述,怎么优化“表输出”和“插入更新”组件的问题。

                                 表输出每秒可以处理2万条记录左右

                                                        插入更新每秒只能处理400条记录左右

一、半斤八两,都不太行

        1、表输出,速度快,但不稳妥

        从上面我们可以看到,表 输出的速度还是很nice的,但是我们只能使用裁剪表的形式来处理。就是非常暴力的把历史数据全面删除再全部插入进去,即我们常说的全量更新。 这种处理方式在万级数据下还是很好用,因为处理的时间很短,效率很高,前端用户也感觉不到影响。但如下图所示,当历史数据较多时,比如20万条,处理的时间会在30s左右,这种情况大概率会影响前端使用,在用户的眼里就是,哎怎么突然没有数据?哎,怎么我刚刚查有6条,怎么现在只有2条数据了?等等,数据不是少了就没有的数据真空期,我们也叫数据等待期。显然,我们针对超2万左右的历史数据,我们应该采用增量更新的方式。

        2、稳的一批,但是慢的像蜗牛 

        前面我们讲到,表输出虽然效率是插入更新的50倍,但是它再怎么快,也需要一定的运行时间,就会出现数据等待期。 数据等待期造成的后果就是影响前端用户使用

        前面我们提到采用增量更新的方式来处理,因此我们深入 剖析下插入更新这个组件,使用插入更新有个大的前提就是需要一个主键,不管是单纯的主键id,还是联合主键iid。这个组件需要一个更新的关键字

         当然,对于大多数的业务场景来说,我们都能找到唯一性的主键,因此这也不是大问题。现在我们来剖析下,插入更新,在性能层面的问题。

        如前言中,所说,插入更新每秒只能处理400条数据左右,效率只有表输入的1/50。因此插入更新能保证不影响前端使用,但是更新数据的时间成本较高。因此体现在前端的用户体验就是,哎,我们的数据一个小时了,怎么还没更新呢?哎,我们能不能实时显示数据呢?这种表现我们通常叫做数据延迟。对于医疗、零售等高响应式行业来说是不太能接受。因此,插入更新虽说能保证数据的完整、可用,但是效率跟不上。因此我们急需一种高效、稳的一批的组件用于企业数据处理。

二、各诉衷肠,合作共赢

         1、表输出,高效数据插入

        表输出处理效率非常高的原因是,它不需对历史数据进行对比,耗时主要集中在表输入的数据读取时间+数据写入时间。因此速度堪比高铁,但高铁再怎么快,从长沙到上海也得几个小时呀。因此数据量大了,必然需要一定的处理耗时。但对业务来说是不能接受,不能接受在使用的时候缺数据或者少数据,或者数据前后不一致。

        当然我们不能说表输入就一文不值了,比如我们针对生产类的数据,比如机器运转数据,数据是跟着时间跑的,不存在历史数据的变动,此时我们就可以采用表输入,一直更新数据至数仓、数据湖等。就像一个水龙头,一直放水至蓄水池,水龙头的水永远是新的。当然,怎么去控制水龙头里面的水都是新的呢,我们可以参考我上一节的内容。

kettle开发-Day37-SQ索引优化_他们叫我技术总监的博客-CSDN博客说是kettle开发优化,不如说是SQ的优化或者说是思路的优化,我们在走路的同时记得抬头看天。https://blog.csdn.net/qq_29061315/article/details/129011372

           2、插入更新,一个都不能少

        通常我们在使用插入更新的时候,是为了保证数据的完整性,这样我们没必要去担心,我们数仓里面的数据会存在异常数据。通过主键来保证,每条数据都会被保存至数仓,当然也包括被删除的数据,通过我们在删除的操作是通过删除标识,比如dr等,当dr=0的时候是未删除的状态,当dr=1的时候,我们就证明数据被删除,虽然保证了数据的完整性。但是,速度确实忒慢了,但是为啥会这么慢呢?其实是因为每一条插入更新的数据都要和历史数据去做对比,看数据库是否存在,然后再进行插入,当历史数据较多时候,比较的耗时就会比较长。因此此时,数据的耗时就表现在表输入数据读取时间+数据对比时间+数据更新插入时间

        因此相比较,表输入,插入更新的耗时较多表现在数据对比耗时和更新数据耗时。这也是为啥插入更新的效率是表输入的1/50。

        因此插入更新常用于,基础档案数据方面和历史数据增量较小的场景。

        总的来说,我们需要一种表输出组件的高效和插入更新的完整性,因为我们有没有办法,通过组件的整合来达到这个目的呢?

三、表输入的高效+插入更新的完整性

        1、思路

        前面我们讲到了,我们需要表输出的高效,又需要插入更新的完整性。因此我们需要定位数据耗时较长的环节。在传统的插入更新场景中,我们是一条一条的数据去对比,然后更新插入的。那我们能不能先一次性完成数据的对比,再一次性把数据进行插入呢。这时候我们的耗时有了保障,而且准确完整性也达到了要求。具体实现的作业思路如下图所示。

         因此我们的作业最后包括,数据对比+数据插入。下面我们详细讲解下这两个组件。

        2、数据对比

        在这里,我们应用到合并记录的功能,我们用新旧数据合并,来标记对应数据是被删除、更新、新增、还是没变的来标记数据的状态。对应转换如下图所示。

         合并记录的应用场景可以参考我的历史文章。

kettle开发篇-合并记录-Day26_kettle合并记录_他们叫我技术总监的博客-CSDN博客前言: 昨天我们讲了数据库相关操作,流查询,通过流查询我们进行等值查询,从而实现类似数据库内连接的效果,今天我们来讲一个类似的组件,叫合并记录,合并记录顾名思义就是将数据进行合并,具体来讲就是将两个不同来源的数据合并,这两个来源的数据分别为旧数据和新数据,该步骤将旧数据和新数据按照指定的关键字匹配、比较、合并。一、合并记录今天我们讲的连接是转换里面的第八个分类。连接是结果集通过关键字进行连..._kettle合并记录https://blog.csdn.net/qq_29061315/article/details/129401286        最后我们保持到数据库的效果是这样的。用另外一个表来保持对应每条记录的状态。

                 这一步相当于我们将需要处理的数据,都整理好了

        3、数据插入

         此时我们再利用,插入更新组件来处理少量的数据即可。这样在保证数据完整性的同时也保证了速度。       

         4、效果查看

        如下图所示,我们一共比较了4万多条数据,真正要处理的数据就55条左右,整个过程耗时在5秒左右, 平均时速是8000条/s,效率是插入更新的20倍,可以满足企业大部分的应用场景了。当然这些场景的基础都是能找到唯一性主键,如果我们是没有唯一性主键的情况,我们又该怎么去组合处理呢?下一节将讲解,另一种自定义必杀技,欢迎持续关注~

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

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

相关文章

## flink- mysql同步数据至starrocks-2.5.0之数据同步

flink- mysql同步数据至starrocks-2.5.0之数据同步 mysql 创建 表 CREATE TABLE t_user (id bigint NOT NULL AUTO_INCREMENT,user_name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,age int DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB…

手机app测试杂谈

手机上的 app 分为基于 HTML5 的 app(类似于 pc 上的 b/S 应用)和本地 app(类似于 C/S 结构)。 所以测试上我们也可以充分吸收 web 的 b/s 和 c/s 测试经验。但是不同于 pc 上的应用 测试,手机上的测试有其独特性 测试前的思考:我们这个产品主要是做什么的?为什么我…

03. 青龙面板配置B站快速升级任务天选时刻脚本(保姆级图文)

目录 功能介绍与环境要求1. 修改配置文件拉取.sh脚本2. 拉取库脚本3. 安装 dotnet 环境4.1 扫码登录方式4.2 b站cookie方式登录(如果你扫码成功了就不用看这个了)获取cookie新建cookie的环境变量 5. 配置任务设置变量6. 运行每日任务测试一下总结 欢迎关…

搭建cloud项目以及各个依赖和配置说明

文章目录 背景步骤配置父pom文件spring-cloud和spring-cloud-alibaba的区别 添加网关模块配置网关的application.yml文件网关入口 普通模块普通模块的配置文件:普通模块的pom文件启动类:application.yml文件和bootstrap.yml文件的区别 总结 背景 最近在…

chatgpt赋能python:Python描述符:更加灵活的属性管理方式

Python描述符:更加灵活的属性管理方式 Python是一种高级编程语言,它的简单易用、高效性和灵活性使得它成为了现代企业和开发者的首选开发语言之一。然而,在使用Python编写代码时,很多时候需要对属性进行访问和修改,而…

C++单目运算符和特殊运算符的重载(9)

运算符的重载 原理和机制 C中运算符只支持基本数据类型运算,如果需要运算符支持类类型的运算,需要使用C提供的新语法 ------- 运算符的重载 运算符的重载本质上是通过函数来实现的,将类类型数据的运算过程写成一个特殊的函数,当…

YOLOv8 图像分割

一、背景 二、环境配置 官网:Previous PyTorch Versions | PyTorch cuda 11.7 pytorch 1.13.0 torchvision 0.14.0 pytorch-cuda 11.7 三、安装yolov8 官网:GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX &…

Mendix 10 树形组件分析及应用

一、前言 产品研发目标是服务于业务,解决具体业务问题,带来业务价值。 因此,任何产品功能的推出,都应该秉承“从实践中来,到实践中去”的原则,在实战中发现问题,通过新功能设计和功能改进解决…

chatgpt科普

引言 chatgpt没有国内开放,为什么如此重要。抛开技术细节,少用专业名词,在整体功能上讲解 ChatGPT 的工作原理、制造过程、涌现的能力、未来的影响以及如何应对。让大家明白: ChatGPT是如何回答问题的。 它是怎么被制造的&…

Go语言实现单链表

博主最近在学习Go语言,所以打算更新一期Go语言版本的数据结构。这篇文章将的是Go语言如何实现单链表。 文章目录 前言一、个人见解,为什么学GO?二、Go语言实现单链表1.创建节点2.通过数组创建一个单链表3.遍历单链表4.单链表插入操作4.1 伪代…

HOOPS Visualize SDK 2023 Crack

桌面和移动工程应用程序的图形引擎 HOOPS Visualize 是 3D 图形 SDK,支持来自市场领导者 Hexagon、Trimble、Ansys、SOLIDWORKS、™ Autodesk 等的数百个工程应用程序。 用于 3D CAD 渲染的图形 SDK HOOPS Visualize 是一个以工程为中心的高性能图形库&#xff0c…

安卓蓝牙ATT协议介绍

介绍 ATT,Attribute Protocol,用于发现、读、写对端设备的协议(针对BLE设备) ATT允许蓝牙远程设备(比如遥控器)作为服务端提供拥有关联值的属性集,让作为客户端的设备(比如手机、电视)来发现、…

通用能力及AI核心能力表现优异!合合信息智能文档处理系统(IDP)高评级通过中国信通院评估

数字经济快速发展的背后,全球数据总量呈现出爆发式增长趋势。智能文档处理(IDP)技术能够高效地从多格式文档中捕捉、提取和处理数据,帮助机构和企业大幅提升文档处理效率,节约时间和人力成本。近期,合合信息…

C语言进阶--字符函数与内存函数

目录 一.字符函数 1.strlen函数 模拟实现strlen 2.strcpy函数 模拟实现strcpy 3.strcat函数 模拟实现strcat strcat能否用于自己追加自己? 4.strcmp函数 模拟实现strcmp 5.strncpy函数 6.strncat函数 7.strncmp函数 模拟实现strncmp 8.strstr函数 模…

哨兵2号数据下载与利用Python处理(波段融合、降采样、可视化、裁剪等)

简单介绍 网址:https://scihub.copernicus.eu/dhus/#/home 哨兵2号(Sentinel-2)是欧洲空间局(European Space Agency,简称ESA)推出的一组遥感卫星,旨在为地球观测和环境监测提供高质量的光学图像数据。 S2MSI2A是哨兵2号卫星的一种传感器。 S2MSI2A是哨兵2号卫星搭载…

huggingface - PEFT.参数效率微调

GitHub - huggingface/peft: 🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning. 最先进的参数高效微调 (PEFT) 方法 Parameter-Efficient Fine-Tuning (PEFT) 方法可以使预训练语言模型 (PLM) 高效适应各种下游应用程序,而无需微调模型的所有…

记录--Vue3 封装 ECharts 通用组件

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 按需导入的配置文件 配置文件这里就不再赘述,内容都是一样的,主打一个随用随取,按需导入。 import * as echarts from "echarts/core"; // 引入用到的图表…

ctfshow web入门 php特性 web93-97

1.web93 intval($num,0),0代表根据变量类型进行使用哪一种进制进行取整 可以使用8进制,正负数,小数点 payload: 010574 4476.0 4476.0 2.web94 过滤了0,不能使用8进制了,还可以使用小数点,正负数等 payload&#xff1…

【Java算法题】剑指offer_算法之02动态规划

对于动态规划问题,我将拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了! 确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 JZ42 连续子数组的…

CTFshow-pwn入门-栈溢出pwn35-pwn36

pwn35 首先还是先下载pwn文件拖进虚拟机加上可执行权限,使用checksec命令查看文件的信息。 chmod x pwn checksec pwn32位的我们直接拖进ida中反编译: // main int __cdecl main(int argc, const char **argv, const char **envp) {FILE *stream; // […