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

目录

前言:

一、半斤八两,都不太行

        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倍,可以满足企业大部分的应用场景了。当然这些场景的基础都是能找到唯一性主键,如果我们是没有唯一性主键的情况,我们又该怎么去组合处理呢?下一节将讲解,另一种自定义必杀技,欢迎持续关注~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

express的使用(四) nodejs转发表单到后台

原文链接 搬砖的林小白-express的使用(四) 个人博客地址,求关注,也希望大家在里面批评我的不足之处 看前提示 本篇所讲述的内容是node端转发前端发送过来的表单到第三方中,应用的场景有很多,如我们经常做的将文件存储到七牛云或…

Scala学习笔记

累了,基础配置不想写了,直接抄了→Scala的环境搭建 这里需要注意的是,创建新项目时,不要用默认的Class类,用Object,原因看→scala中的object为什么可以直接运行 一、Scala简介 1.1 图解Scala和Java的关系 1…

大数据测试基本知识

常用大数据框架结构 1.大数据测试常用到的软件工具 工具推荐,对于测试数据构造工具有:Datafaker、DbSchema、Online test data generator等;ETL测试工具有:RightData、QuerySurge等;数据质量检查工具:great…

MySQL-SQL存储过程/触发器详解(上)

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏&#xf…

Three.js--》实现3d地月模型展示

目录 项目搭建 初始化three.js基础代码 创建月球模型 添加地球模型 添加模型标签 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本案例还…

《离散数学》:代数系统和图论导论

一、代数系统 代数系统是数学中的一个重要概念,它涉及一组对象以及定义在这些对象上的运算规则。代数系统可以是抽象的,也可以是具体的。 在抽象代数中,代数系统通常由一组元素和一组操作(或称为运算)组成。这些操作…

【MySQL新手入门系列四】:手把手教你MySQL数据查询由入门到学徒

SQL语言是与数据库交互的机制,是关系型数据库的标准语言。SQL语言可以用于创建、修改和查询关系数据库。SQL的SELECT语句是最重要的命令之一,用于从指定表中查询数据。在此博客中,我们将进一步了解SELECT语句以及WHERE子句以及它们的重要性。…

vue进阶-vue-route

Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得轻而易举。 本章只做学习记录,详尽的内容一定要去官网查看api文档 Vue Router-Vue.js 的官方路由 1. 路由的基本使用 1.1 安装vue-router npm install vue-…

SpringCloud Eureka注册中心高可用集群配置(八)

当注册中心扛不住高并发的时候&#xff0c;这时候 要用集群来扛&#xff1b; 我们再新建两个module microservice-eureka-server-2002 microservice-eureka-server-2003 第一步&#xff1a; pom.xml 把依赖加下&#xff1a; <dependencies> <dependency…

golang 协程的实现原理

核心概念 要理解协程的实现, 首先需要了解go中的三个非常重要的概念, 它们分别是G, M和P, 没有看过golang源代码的可能会对它们感到陌生, 这三项是协程最主要的组成部分, 它们在golang的源代码中无处不在. G (goroutine) G是goroutine的头文字, goroutine可以解释为受管理的…

Prompt 范式产业实践分享!基于飞桨 UIE-X 和 Intel OpenVINO 实现跨模态文档信息抽取

近期 Prompt 范式备受关注&#xff0c;实际上&#xff0c;其思想在产业界已经有了一些成功的应用案例。中科院软件所和百度共同提出了大一统诸多任务的通用信息抽取技术 UIE&#xff08;Universal Information Extraction&#xff09;。截至目前&#xff0c;UIE 系列模型已发布…

Selenium 相对定位

目录 前言&#xff1a; 相对定位 工作原理 可用的相对定位 Above Below Left of Right of Near 链式相对定位 相对于WebElement的相对定位 实例演示 前言&#xff1a; Selenium传统定位基本能解决80%的定位需求&#xff0c;但是还是有一些复杂场景传统定位定不到的…

express框架学习笔记

express简介 express是一个基于Node.js平台的极简的、灵活的WEB应用开发框架。express是一个封装好的工具包&#xff0c;封装了很多功能&#xff0c;便于我们开发WEB应用&#xff08;HTTP服务&#xff09; express使用 新建express文件夹新建文件test01.js&#xff0c;代码如…

深蓝学院C++基础与深度解析笔记 第 5 章 语句

1. 语句基础 ● 语句的常见类别 – 表达式语句&#xff1a;表达式后加分号&#xff0c;对表达式求值后丢弃&#xff0c;可能产生副作用 – 空语句&#xff1a;仅包含一个分号的语句&#xff0c;可能与循环一起工作 – 复合语句&#xff08;语句体&#xff09;&#xff1a;由大…

电商数仓(用户行为采集平台)数据仓库概念、用户行为日志、业务数据、模拟数据、用户行为数据采集模块、日志采集Flume

1、数据仓库概念 数据仓库&#xff08; Data Warehouse &#xff09;&#xff0c;是为企业制定决策&#xff0c;提供数据支持的。可以帮助企业&#xff0c;改进业务流程、提高产品质量等。 数据仓库的输入数据通常包括&#xff1a;业务数据、用户行为数据和爬虫数据等。 业务数…

流场粒子追踪精度数值实验

在计算流线&#xff0c;拉格朗日拟序结构等流场后处理时&#xff0c;我们常常需要计算无质量的粒子在流场中迁移时的轨迹&#xff0c;无质量意味着粒子的速度为流场当地的速度。此时&#xff0c;求解粒子的位移这个问题是一个非常简单的常微分方程问题。 假设流场中存在 i 个粒…

Java版本+企业电子招投标系统源代码之电子招投标系统建设的重点和未来趋势

计算机与网络技术的不断发展&#xff0c;推动了社会各行业信息化的步伐。时至今日&#xff0c;电子政务、电子商务已经非常普及&#xff0c;云计算、大数据、工业4.0、“互联网”等发展理念也逐步深入人心&#xff0c;如何将传统行业与互联网科技有效结合起来&#xff0c;产生1…

Vue实现元素沿着坐标数组移动,超出窗口视图时页面跟随元素滚动

一、实现元素沿着坐标数组移动 现在想要实现船沿着下图中的每个河岸移动。 实现思路&#xff1a; 1、将所有河岸的位置以 [{x: 1, y: 2}, {x: 4, y: 4}, …] 的形式保存在数组中。 data() {return {coordinateArr: [{ x: 54, y: 16 }, { x: 15, y: 31 }, { x: 51, y: 69 }…

升级Nginx

目录 前言 一、升级Nginx 1&#xff09;首先在官网下载一个新版本的Nginx 2&#xff09;首先将下载的压缩包进行解包 3&#xff09;进入已解包的目录中 4&#xff09;配置安装路径 5&#xff09;make 6&#xff09;备份原来Nginx的资源 7&#xff09;重启Nginx服务 8&#…

【2023最全教程】Web自动化测试怎么做?Web自动化测试的详细流程和步骤

一、什么是web自动化测试 自动化&#xff08;Automation&#xff09;是指机器设备、系统或过程&#xff08;生产、管理过程&#xff09;在没有人或较少人的直接参与下&#xff0c;按照人的要求&#xff0c;经过自动检测、信息处理、分析判断、操纵控制&#xff0c;实现预期的目…