差异数据的对比和整理

简介: 在我们日常的工作中,常常会遇到很多结构相同,但来源不同的数据。有时,这些数据之间完全独立,互不重叠,例如各个分公司从自己系统中导出的销售数据;但有时,这些数据之间又会有大量的重叠,例如常见的一个完整业务流程中涉及的各个系统、各个环节,都可能根据各自收到的单据进行录入。

cysj

在我们日常的工作中,常常会遇到很多结构相同,但来源不同的数据。有时,这些数据之间完全独立,互不重叠,例如各个分公司从自己系统中导出的销售数据;但有时,这些数据之间又会有大量的重叠,例如常见的一个完整业务流程中涉及的各个系统、各个环节,都可能根据各自收到的单据进行录入。这时,如何对这些重叠数据进行对比,从而发现和纠正其中的错误,就需要我们常说的“自动对账”操作了。

在一般业务系统的设计开发中,这种对账功能的逻辑基本上都是通过循环遍历一套数据的记录,在另一套记录数据中逐一比对查找。虽然代码逻辑高度类似,但又常常因为比对所用关键字的差异,以及可能发生的需求变化而需要单独编写,最终导致开发成本居高不下,维护难度越来越大。

现在有了集算器,类似问题的处理,就会变得直观而且便捷,因为集算器中提供了真正面向集合的各种运算。具体到差异数据的对比和整理,只需要sort()和merge()两个函数既可以了。


我们以一个简化了的销售记录合并的例子来进行说明。

下表显示的两个文件old.csv和new.csv分别代表预计销售的情况和实际销售的情况,都包含了销售人员姓名userName、销售日期date、销售额saleValue、销售数量saleCount。在业务分析时,需要分别找出新增的、删除的、修改的数据行进行分析,其中userName和date作为进行比对的关键字,也称为逻辑主键:

Old.csv New.csv
.
1
2
3
4
5
6
7
8
9
userName,date,saleValue,saleCount
Rachel,2015-03-01,4500,9
Rachel,2015-03-03,8700,4
Tom,2015-03-02,3000,8
Tom,2015-03-03,5000,7
Tom,2015-03-04,6000,12
John,2015-03-02,4000,3
John,2015-03-02,4300,9
John,2015-03-04,4800,4
.
userName,date,saleValue,saleCount
Rachel,2015-03-01,4500,9
Rachel,2015-03-02,5000,5
Ashley,2015-03-01,6000,5
Rachel,2015-03-03,11700,4
Tom,2015-03-03,5000,7
Tom,2015-03-04,6000,12
John,2015-03-02,4000,3
John,2015-03-02,4300,9
John,2015-03-04,4800,4

可以看到new.csv中的第2、3行是新增的记录,可能对应额外成交的新订单,第4行是修改的记录,可能对应成交价格变化,old.csv中第3行是删除的记录,可能对应撤销的订单。


传统逻辑的比对代码我们不再赘述,直接看一看在集算器中是如何处理的:

A B
1 =file(“d:\\old.csv”).import@t(;”,”) =file(“d:\\new.csv”).import@t(;”,”)
2 =A1.sort(userName,date) =B1.sort(userName,date)
3 =new=[B2,A2].merge@d(userName,date)
4 =detete=[A2,B2].merge@d(userName,date)
5 =diff=[B2,A2].merge@d(userName,date,saleValue,saleCount)
6 =update=[diff,new].merge@d(userName,date) result update

没错,就这么几行,没有循环遍历,没有查询算法优化,而且如果比对的关键字变化了,只需要修改这么一目了然的几行。让我们从上到下捋一下:

A1,B1:以逗号为分隔符读入文件,形成两个原始的数据集合。这里也可以从其他格式的文件或数据库的数据表中读取。

A2,B2:使用sort()函数,将数据按照关键字,也就是逻辑主键排序,形成新的集合。以便后面的merge()函数使用。

A3:查找新增记录,也就是关键字userName和date在集合B2中同时不在集合A2中,这就是集合的“差集”计算,是通过函数选项@d指定的,类似的还有并集@u,交集@i。计算得到一个新的集合“new”如下:

cysj-1

A4:这次查找被删除的记录,也就是关键字userName和date在集合A2中但不在B2中的记录,注意merger()函数前方括号中A2、B2的次序不同。同样计算得到一个新的集合“delete”结果如下:

cysj-2

A5:和A3一样,查找B2与A2的差集,但这次将所有字段都作为关键字,因此会找到所有变化的记录,包括修改过的和新增的记录。这个结果形成的新集合“diff”如下:

cysj-3

A6:很明显“diff”集合中去掉新增的记录,也就“new”集合,就是被修改过的记录,对应的集合“update”如下:

cysj-4

可以看到,在集合的概念下,记录的新增、删除、修改都有着直观的含义,无非就是新、老集合的不同部分,通过相应的集合运算可以非常方便的表示。


这样计算得到的结果,除了可以在计算的IDE中查看,或者通过文件处理函数输出到文件中,还可以通过JDBC方式返回给 Java 程序或其他报表工具,代码中的 B6 就显示如何将这种对账处理的结果非常简单作为结果集返回给其他系统模块,下面是Java程序中使用这个结果集的示例:

//建立esProc jdbc连接
Class.forName(“com.esproc.jdbc.InternalDriver”);
con= DriverManager.getConnection(“jdbc:esproc:local://”);
//调用esProc,其中test是脚本文件名,可接收参数
st =(com.esproc.jdbc.InternalCStatement)con.prepareCall(“call test()”);
st.execute();//执行esProc存储过程
ResultSet set = st.getResultSet();//获得计算结果

可以看到,集算器处理差异数据,真正体现和“差异”的本质含义,也就是集合的差异。事实上,这种差异数据广泛存在与各种系统之中和不同系统之间,大到银行、运营商系统中的账目数据,小到个人文件系统中的查重和版本比较,只要明确了需要对比的数据集合和关键字,就可以灵活地通过集合运算进行各种整理工作了。

相关文章
|
3月前
|
存储 数据处理 数据库
InfluxDB数据之谜:如何巧妙地删除和修改你的时间序列数据?
【8月更文挑战第20天】InfluxDB是一款高性能时间序列数据库,专为快速存储与检索时间序列数据设计。本文通过Python示例介绍如何在InfluxDB中执行数据删除与间接修改操作。首先安装`influxdb`库,接着连接数据库。使用`DELETE`语句可按条件删除数据;因InfluxDB不直接支持数据修改,可通过查询、更新并重写数据的方式来实现。注意这种方式可能影响性能,需谨慎使用。随着社区发展,未来将提供更多高效的数据管理工具。
231 1
|
6月前
|
机器学习/深度学习 编解码 数据挖掘
实例分割综述总结综合整理版
实例分割综述总结综合整理版
189 0
实例分割综述总结综合整理版
|
6月前
|
监控 安全 定位技术
技术写作概述:内容分析、平台和转化追踪以及内容老化
内容分析是一种技术作家用来解释和量化文本数据的研究方法。它涉及从不同来源的文本中编码和识别主题或模式的系统过程,这些来源包括书籍、博客、文章或其他文档类型。其主要目标是提供主观解释的、但有效且可重复的、从数据中得出的推论。这种技术有助于确定所讨论的内容是否有效地传达了所需的交流,或者是否存在需要改进的领域。例如,您可以进行内容分析来衡量软件手册的用户友好性或教学指南的清晰性和易懂性。
104 0
|
存储 并行计算 算法
GWAS结果自动批量整理算法(下)
GWAS结果自动批量整理算法(下)
|
存储 算法 Serverless
GWAS结果自动批量整理算法(上)
GWAS结果自动批量整理算法
|
JSON 前端开发 JavaScript
2022-6月工作问题整理记录
2022-6月工作问题整理记录
2022-6月工作问题整理记录
|
开发者
差异 | 学习笔记
快速学习差异。
差异 | 学习笔记
|
数据采集 消息中间件 分布式计算
最终整体回顾总结(代码-预处理及爬虫识别)|学习笔记
快速学习最终整体回顾总结(代码-预处理及爬虫识别)
122 0
最终整体回顾总结(代码-预处理及爬虫识别)|学习笔记
|
存储 XML JavaScript
日志原理与开发分析这篇完全指南就够了!适应各种规模!
日志原理与开发分析这篇完全指南就够了!适应各种规模!
929 0
日志原理与开发分析这篇完全指南就够了!适应各种规模!