【摘要】在資料處理業務中,有時需要清除檔案中的重複資料或只留下重複資料,本文將從小檔案、大檔案兩方面介紹整行去重、關鍵列去重的幾種處理辦法,並提供用 esproc spl 編寫的**示例。esproc 是專業的資料計算引擎,spl 中有一套完善的集合運算領域的函式庫,很適合處理檔案去重,寫出的**非常簡潔。
有乙個文字檔案,其每一行是乙個字串,要將檔案中的重複行只保留一行。處理此問題可以把檔案的每一行讀成乙個字串,組成乙個集合,然後通過集合去重運算得出結果。
示例:報名繪畫興趣班的同學學號姓名記錄在paint.txt中,可能有些同學報了多次,請刪除檔案中重複的報名後儲存在paint1.txt中。原檔案部分資料如下所示
20121102-joan
20121107-jack
20121113-mike
20121107-jack
esproc spl指令碼如下:
a注釋
1=file("e:/txt/paint.txt").read@n()
讀出paint.txt的每一行組成集合
2=a1.id()
刪除a1集合中重複的成員
3=file("e:/txt/paint1.txt").write(a2)
將刪除重複行後的a2寫入檔案paint1.txt中
乙個檔案,有多列資料,第一行是列名,第二行開始是資料記錄,要對檔案中關鍵列的內容進行比較,對關鍵列內容重複的行進行刪除或只保留重複的行。
現有2023年的銷售訂單表order_2018.xlsx,部分資料如下所示:
示例1:請求出2023年購買產品的所有不同的客戶id,儲存在檔案2018c.xlsx中。
esproc spl指令碼如下:
a注釋
1=file("e:/txt/order_2018.xlsx").xlsimport@t()
讀出2018訂單表資料
2=a1.id(customerid)
取出所有不重複的客戶 id
3=file("e:/txt/2018c.xlsx").xl***port(a2)
將客戶id儲存到檔案2018c.xlsx
示例2:請求出2023年各位客戶購買了哪些不同產品,將customerid和productid儲存在檔案2018c_p.xlsx中。
esproc spl指令碼如下:
a注釋
1=file("e:/txt/order_2018.xlsx").xlsimport@t(customerid,productid)
讀出2018訂單表關鍵列資料
2=a1.group@1(customerid,productid)
按關鍵列分組,@1表示只取分組中的一條記錄
3=file("e:/txt/2018c_p.xlsx").xl***port@t(a2)
將結果a2儲存到檔案2018c_p.xlsx
示例:請求出2023年回頭客(即多次購買同種產品的客戶)的訂單情況,將結果儲存在檔案2018c_rebuy.xlsx中。
esproc spl指令碼如下:
a注釋
1=file("e:/txt/order_2018.xlsx").xlsimport@t()
讀出2018訂單表資料
2=a1.group(customerid,productid)
同一客戶購買同種產品的訂單分為一組
3=a2.select(~.count()>1).conj()
選出訂單數大於1的組,把各組的訂單並集為乙個資料表
4=file("e:/txt/2018c_rebuy.xlsx").xl***port@t(a3)
將結果a3儲存到檔案2018c_rebuy.xlsx
大檔案資料不能一次性全部裝進記憶體,不能象小檔案資料那樣全部讀出來再進行重複性比較,需要分批讀出資料去比較。esproc spl提供了游標來處理大檔案運算,使大檔案去重運算也變得十分方便。
有大文字檔案,其每一行是乙個字串,要將檔案中的重複行只保留一行。處理此問題要把檔案的每一行讀成乙個字串,成為游標中的一條記錄,然後通過游標的去重運算得出結果。
示例:現有全國房產產權人員登記表大檔案all.txt,裡面記錄產權人的身份證及姓名,部分資料如下所示:
510121198802213364-joan
110113199203259852-jack
201264197206271113-mike
由於有些人員在多個州擁有房產,所以檔案中會有重複的登記,請將重複的登記只保留乙個,將結果儲存在all2.txt中。esproc spl指令碼如下:
a注釋
1=file("e:/txt/all.txt").cursor@s()
建立游標,@s表示用整行構成單字段串的序表
2=a1.groupx(_1)
對游標中的單字段分組,就可去掉重複的行
3=file("e:/txt/all2.txt").export(a2)
將去重後的結果寫入檔案all2.txt中
本節仍用銷售訂單表為例,是所有年份的合併銷售訂單表orders.xlsx,是個大檔案。
示例1:請找出購買產品的所有不同的客戶id,儲存在檔案customers.xlsx中。
esproc spl指令碼如下:
a注釋
1=file("e:/txt/orders.xlsx").xlsimport@tc()
建立訂單表資料游標
2=a1.groupx(customerid)
按customerid分組即得到不重複的客戶id
3=file("e:/txt/customers.xlsx").xl***port@t(a2)
將客戶id儲存到檔案customers.xlsx
示例2:請找出各位客戶購買了哪些不同產品,將customerid和productid儲存在檔案c_p.xlsx中。
esproc spl指令碼如下:
a注釋
1=file("e:/txt/orders.xlsx").xlsimport@tc()
建立訂單表資料游標
2=a1.groupx(customerid,productid)
按關鍵列分組,即可取得不重複的客戶id和產品id
3=file("e:/txt/c_p.xlsx").xl***port@t(a2)
將結果a2儲存到檔案c_p.xlsx
示例:請找出回頭客(即多次購買同種產品的客戶)的訂單情況,將結果儲存在檔案c_rebuy.xlsx中。
esproc spl指令碼如下:
a注釋
1=file("e:/txt/orders.xlsx").xlsimport@tc().sortx(customerid,productid)
建立訂單表資料游標,並按關鍵列排序
2=a1.group(customerid,productid)
同一客戶購買同種產品的訂單分為一組
3=a2.select(~.count()>1).conj()
選出訂單數大於1的組,把各組的訂單並集為乙個資料表
4=file("e:/txt/c_rebuy.xlsx").xl***port@t(a3)
將結果a3儲存到檔案c_rebuy.xlsx
《spl cookbook》中還有更多相關計算示例。
linux 檔案去重
兩個檔案的交集,並集 前提條件 每個檔案中不得有重複行 1.取出兩個檔案的並集 重複的行只保留乙份 cat file1 file2 sort uniq file3 2.取出兩個檔案的交集 只留下同時存在於兩個檔案中的檔案 cat file1 file2 sort uniq d file3 3.刪除交...
hive 列表去重 Hive 資料去重
實現資料去重有兩種方式 distinct 和 group by 1.distinct消除重複行 distinct支援單列 多列的去重方式。單列去重的方式簡明易懂,即相同值只保留1個。多列的去重則是根據指定的去重的列資訊來進行,即只有所有指定的列資訊都相同,才會被認為是重複的資訊。1 作用於單列 se...
Lamada List 去重及其它操作示例
import j a.util.concurrent.concurrenthashmap import j a.util.function.function import j a.util.function.predicate import j a.util.stream.collectors pr...