共计 1500 个字符,预计需要花费 4 分钟才能阅读完成。
【摘要】
本文介绍小文件与大文件在进行数据去重时的几种解决方法,比方按整行或要害列去除反复数据或留下反复数据,并用 esProc SPL 举例实现。请点击文件数据去重示例理解详情
在数据处理业务中,有时须要革除文件中的反复数据或只留下反复数据,本文将从小文件、大文件两方面介绍整行去重、要害列去重的几种解决方法,并提供用 esProc SPL 编写的代码示例。esProc 是业余的数据计算引擎,SPL 中有一套欠缺的汇合运算畛域的函数库,很适宜解决文件去重,写出的代码十分简洁。
1. 小文件
1.1 整行去重
有一个文本文件,其每一行是一个字符串,要将文件中的反复行只保留一行。解决此问题能够把文件的每一行读成一个字符串,组成一个汇合,而后通过汇合去重运算得出后果。
示例:报名绘画兴趣班的同学学号姓名记录在 paint.txt 中,可能有些同学报了屡次,请删除文件中反复的报名后保留在 paint1.txt 中。原文件局部数据如下所示
20121102-Joan
20121107-Jack
20121113-Mike
20121107-Jack
esProc SPL 脚本如下:
1.2 要害列比拟
一个文件,有多列数据,第一行是列名,第二行开始是数据记录,要对文件中要害列的内容进行比拟,对要害列内容反复的行进行删除或只保留反复的行。
现有 2018 年的销售订单表 order_2018.xlsx,局部数据如下所示:
1.2.1. 去除反复
示例 1:申请出 2018 年购买产品的所有不同的客户 Id,保留在文件 2018c.xlsx 中。
esProc SPL 脚本如下:
示例 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》中还有更多相干计算示例。