文件数据去重示例

【摘要】
本文介绍小文件与大文件在进行数据去重时的几种处理办法,好比按整行或关键列去除重复数据或留下重复数据,并用 esProc SPL 举例实现。请点击文件数据去重示例了解详情函数

在数据处理业务中,有时须要清除文件中的重复数据或只留下重复数据,本文将从小文件、大文件两方面介绍整行去重、关键列去重的几种处理办法,并提供用 esProc SPL 编写的代码示例。esProc 是专业的数据计算引擎,SPL 中有一套完善的集合运算领域的函数库,很适合处理文件去重,写出的代码很是简洁。spa

1. 小文件

1.1 整行去重

有一个文本文件,其每一行是一个字符串,要将文件中的重复行只保留一行。处理此问题能够把文件的每一行读成一个字符串,组成一个集合,而后经过集合去重运算得出结果。blog

示例:报名绘画兴趣班的同窗学号姓名记录在 paint.txt 中,可能有些同窗报了屡次,请删除文件中重复的报名后保存在 paint1.txt 中。原文件部分数据以下所示
    20121102-Joan
    20121107-Jack
    20121113-Mike
    20121107-Jackip

esProc SPL 脚本以下:内存

1.2 关键列比较

一个文件,有多列数据,第一行是列名,第二行开始是数据记录,要对文件中关键列的内容进行比较,对关键列内容重复的行进行删除或只保留重复的行。字符串

现有 2018 年的销售订单表 order_2018.xlsx,部分数据以下所示:产品

1.2.1. 去除重复

示例 1:请求出 2018 年购买产品的全部不一样的客户 Id,保存在文件 2018c.xlsx 中。it

esProc SPL 脚本以下:class

示例 2:请求出 2018 年各位客户购买了哪些不一样产品,将 CustomerId 和 ProductId 保存在文件 2018c_p.xlsx 中。请求

esProc SPL 脚本以下:

1.2.2. 只保留重复

示例:请求出 2018 年回头客 (即屡次购买同种产品的客户) 的订单状况,将结果保存在文件 2018c_rebuy.xlsx 中。

esProc SPL 脚本以下:

2. 大文件

大文件数据不能一次性所有装进内存,不能象小文件数据那样所有读出来再进行重复性比较,须要分批读出数据去比较。esProc SPL 提供了游标来处理大文件运算,使大文件去重运算也变得十分方便。

2.1 整行去重

有大文本文件,其每一行是一个字符串,要将文件中的重复行只保留一行。处理此问题要把文件的每一行读成一个字符串,成为游标中的一条记录,而后经过游标的去重运算得出结果。

示例:现有全国房产产权人员登记表大文件 all.txt,里面记录产权人的身份证及姓名,部分数据以下所示:
    510121198802213364-Joan
    110113199203259852-Jack
    201264197206271113-Mike

因为有些人员在多个州拥有房产,因此文件中会有重复的登记,请将重复的登记只保留一个,将结果保存在 all2.txt 中。esProc SPL 脚本以下:

2.2 关键列比对

本节仍用销售订单表为例,是全部年份的合并销售订单表 orders.xlsx,是个大文件。

2.2.1. 去除重复

示例 1:请找出购买产品的全部不一样的客户 Id,保存在文件 customers.xlsx 中。

esProc SPL 脚本以下:

示例 2:请找出各位客户购买了哪些不一样产品,将 CustomerId 和 ProductId 保存在文件 c_p.xlsx 中。

esProc SPL 脚本以下:

2.2.2. 只保留重复

示例:请找出回头客 (即屡次购买同种产品的客户) 的订单状况,将结果保存在文件 c_rebuy.xlsx 中。

esProc SPL 脚本以下:

《SPL CookBook》中还有更多相关计算示例。