fbpx

使用 SAS EG 的 3 種 Delete 功能自動化刪除檔案,告別手動刪除越積越多的資料!

Author:Omniwaresoft / Data and Analytics team / Kane Tu

#SAS #EG #Delete #Function #刪除

如何利用 SAS Delete 功能管理檔案

根據專案內容與客戶需求,有些資料來源會以日批產檔的方式每天落地 1 份檔案,也因此每年都會有 365 個檔案存在指定目錄裡,若在一開始沒有規劃好檔案管理這一環節,該目錄便容易隨著時間越來越多檔案、佔據更多的硬體容量。若檔案讀取的數量逐漸增多,ETL 過程便需要藉助 Function 來做更有效率的資料處理。

下圖為全部流程,本篇著重在 SAS EG(Enterprise Guide) 並應用 3 種 Delete (標記紅色格子的 Funtion 1 ~ Function 3)來實現檔案刪除、資料刪除及釋放運算空間的功能。

  • Funtion 1:應用 FDELETE Function 將指定檔案刪除。 
  • Funtion 2:應用 SQL Procedure – DELETE Statement 在 ETL 過程刪除不需要用到的資料列。
  • Funtion 3:資料處理結束後,應用 Delete Procedure – PROC DELETE Statement 刪除已使用完畢的暫存表(Temporary Table),釋放運算空間。

SAS Delete flow chart

Delete 功能介紹

進入情境演示前,先簡單介紹三種不同的 Delete 功能與語法。

1. FDELETE Function

刪除外部檔案或是空白目錄

FDELETE(fileref | directory)

2. SQL Procedure – DELETE Statement

運用 SQL FROM 語法來刪除 Table 的資料列(row)

DELETE FROM table-name | sas/access-view | proc-sql-view
<AS alias>
<WHERE sql-expression>;

3. Delete Procedure – PROC DELETE Statement

刪除 SAS 資料館當中的 Table

PROC DELETE <LIBRARY=libref> DATA=SAS-file(s)
		(<GENNUM=ALL | HIST | REVERT | integer>
		<MEMTYPE=member-type>
		<ENCRYPTKEY=key-value>
		<ALTER=alter-password>);

使用者情境(User Context

了解 Delete 功能後,我們回到一開始設定的情境中,我們的目標是「蒐集並運用近 1 年資料,最後使用 Tableau 報表呈現這些資料」。

以下為本次情境條件與設置:

  1. 資料來源端每天固定在 7 點左右落地 1 份當日原始資料(Raw Data)檔案在指定目錄裡。
  2. 已設定每日 8 點 Windows 工作排程自動執行 SAS 程式。
  3. 已確定 1 年之後的資料不會再使用到,可以進行刪除。
  4. 每天 ETL 結束後需落地並直接取代舊的 BigTable.csv。
  5. Tableau 工作簿讀取 BigTable.csv 並呈現報表。

情境假設:

  • CARS 資料集每日落地 1 份當日原始資料檔案在 E 槽 test 資料夾,檔案命名規則為 cars_YYYYMMDD.csv。例如在 20221214 落地的檔案,檔名就會是 cars_20221214.csv。
  • 彙總表 BigTable 已先創建 Table 在 SAS 環境。

以下會依照流程圖依序演示,內容聚焦在 SAS 的 3 種 Delete 來實現檔案刪除、資料刪除及釋放運算空間的功能,並運用 SAS 內建資料集 – SASHELP.CARS 做程式範例,關於資料集的詳細內容請參考:SAS Help Data Sets

流程圖 – FDELETE Function (Funtion 1)

SAS Delete flow chart - Function 1

以日期 20221214 為例,往前回推一年的日期會是 20211214,因此只要 Test 資料夾裡面有 20211213 的資料,就不是 Tableau 報表的來源資料,可以刪除。

設置 1 個變數 DAY366AGO 當作超過 1 年的日期變數,再應用 FDELETE Function 把超過一年的 csv 檔,也就是 cars_20211213.csv 刪除掉,便能實現刪除超過 1 年的檔案。

%LET DAY366AGO = %SYSFUNC(INTNX(DAY, %SYSFUNC(DATE()), -366), YYMMDDN8.); 
%PUT &DAY366AGO.;

DATA _NULL_;
	FNAME = "SAMPLE";
		RC = FILENAME(FNAME, "E:\\test\\cars_&DAY366AGO..csv");
		IF RC = 0 AND FEXIST(FNAME) THEN  /* 檢查指定目錄是否有超過一年的 csv 檔 */
		   RC = FDELETE(FNAME);           /* 刪除超過一年的 csv 檔 */
		RC = FILENAME(FNAME);
RUN;

流程圖 – SQL Procedure – DELETE Statement (Funtion 2)

SAS Delete flow chart - Function 2

匯入(import)最近 1 年的檔案,也就是需要匯入 365 個 csv 檔案。

下面就僅以匯入今日 (20221214) 落地檔案,也就是 cars_20221214.csv 為範例。

成功匯入檔案之後,此情境是想知道 來源地(Origin)在 亞洲(Asia)的資料,換句話說:來源地不是在亞洲的資料就都可以刪除。便能應用 SQL Procedure – DELETE Statement 刪除不需要用到的資料列。

/* 匯入 csv */
%LET TODY = %SYSFUNC(DATE(), YYMMDDN8.);  /* 今日的日期變數 */
%PUT &TODY.;

PROC IMPORT FILE = "E:\\test\\cars_&TODY..csv"
	OUT = WORK.CARS_&TODY.
	DBMS = csv
	REPLACE;
	GETNAMES = YES;
RUN;

/* SQL Procedure - DELETE Statement */
PROC SQL;
	DELETE FROM WORK.CARS_&TODY.
	WHERE Origin NOT IN ('Asia');           /* 刪除 Origin 不在 Asia 的所有資料 */
RUN;

流程圖 – Delete Procedure – PROC DELETE Statement (Funtion 3)

SAS Delete flow chart - Function 3

經過上述的 SQL Procedure – DELETE Statement 的資料處理流程,下一步流程便是將 WORK.CARS_20221214 插入(insert into)到 BigTable 裡。

當成功插入 BigTable 後,WORK.CARS_20221214 這張 Table 就已經不會再使用到,之後就能應用 Delete Procedure – PROC DELETE Statement 將 WORK.CARS_20221214 從 SAS 運算空間釋出。

/* 刪除在 WORK 資料館的 CARS_20221214 */
PROC DELETE DATA = WORK.CARS_&TODY.;
RUN;
QUIT;

結論

透過 3 種 Delete,控制指定資料夾占硬體容量在一定範圍,且在 ETL 過程中只保留需要做資料處理的內容,並且在使用完畢後,將不會再用到的 Table 刪除來釋出運算空間。

參考資料

延伸閱讀


相關文章