Leo Yeh's Blog

SAS 基本介紹 (16)

教學目標

初步了解 SAS 的 DS2 程式語言提供物件導向的程式設計環境。

重點概念

首先現今我們面臨許多複雜的問題,像是許多零售商想要了解誰會買什麼,什麼時間購買、什麼地方購買、什麼在結帳時提供將會帶來更多的價值,這是個非常複雜且困難的問題,更何況在面臨大數據分析的時代,因此對於 SAS 程式設計師而言要如何有彈性的解決類似複雜的問題呢?此時 SAS 程式設計師將可以使用 PROC DS2 程式語言。

接著 SAS 程式設計師在過去幾年使用 DATA STEP 程式語言解決許多複雜的問題,然而 PROC DS2 主要是新的程序主要提供物件導向的程式設計環境,同時 PROC DS2 程式語言是基於 DATA STEP 程式語言,提供 SAS 程式設計師具備進階問題解決和進階資料處理的能力,以利開發複雜和彈性的程式解決複雜和彈性的解決方案,此外 PROC DS2 程式設計是基於物件導向,所以較容易了解與維護。

再來 PROC DS2 處理許多複雜問題主要使用物件導向程式設計 (Object-oriented Programming,OOP) 建構出隱固和彈性的程式,其中主要有四個重要的概念,分別為清晰 (Clarity)、範圍 (Scope)、模組和封裝 (Modularity and Encapsulation) 以及資料類型 (Data Types)。

清晰

當在撰寫 DS2 程式語言,我們必須清楚了解每個所使用的識別項,識別項主要透過 DECLARE 敘述進行宣告名稱和資料類型,在我們使用識別項的元素之前必須先告知 DS2 元素相關的名稱和資料類型。

範圍

當在撰寫 DS2 程式語言,我們必須了解變數可視的範圍,另一方面範圍可以讓我們知道變數在哪裡可以被存取。在 DS2 程式語言中主要有兩個層級的範圍,分別為全域 (Global) 和區域 (Local)。全域變數主要有全域範圍,我們將能夠從程式中何地方進行存取,區域變數主要有區域範圍,我們僅能夠從變數宣告的區塊且當區域執行時進行存取。在任何範圍內的每一個變數都必須是唯一的名稱,但是變數在不同範圍可以有相同名稱,如此一來將能夠讓我們在程式中不同區塊或方法使用一致性和有意義的變數名稱,像是 DO-LOOP 迴圈區塊中宣告的變數就屬於區域變數。

模組和封裝

當在撰寫 DS2 程式語言,我們必須了解程式區塊主要是在 DS2 程式階段中封裝變數和程式碼,程式區塊允許模組化和封裝,主要是使用模組化和可重覆使用的程式碼執行特行特別的任務。透過模組化將能夠引導更短的時間進行開發,並且標準化常常被重複使用的特定商業程式任務,以及階層程式區塊允許進階封裝和抽像化行為,以利強化程式的可讀性。除此之外,程式區塊定義識別項的範圍,若識別項宣告在程式區塊外面則是全域範圍,反之若識別項宣告在程式區塊裡面則是區域範圍,下表為常見的程式區塊。

區塊 語法 備註
程序 PROC DS2…QUIT
資料程式 DATA…ENDDATA 變數將會被宣告在資料程式的頂端擁有全域範圍,此外 SET 敘述參考的變數也有全域範圍,全域範圍的變數為全域變數主要存在於資料程式的期間內,同時除非我們明確的刪除變數,否則在資料程式中的全域變數將會被包括在 Program Data Vector (PDV) 中。
方法 METHOD…END 方法是資料程式、套件或執行緒的子區塊,方法名稱通常在封閉的程式區塊中擁有全域範圍,方法中主要包括所有可執行的程式碼,PROC DS2 主要有三個系統定義的方法,分別為 INIT()、RUN() 和 TERM()。接著變數通常被宣告在方法的頂端擁有區域範圍,區域範圍的變數為區域變數,請注意在方法中的區域變數不包括在 Program Data Vector (PDV) 中。
套件 PACKAGE…ENDPACKAGE 變數將會被宣告在套件的頂端在套件中擁有全域變數,套件的變數主要存在於套件實體執行的期間,套件變數不會被包括在資料程式的 Program Data Vector (PDV) 中。
執行緒 THREAD…ENDTHREAD 變數將會被宣告在套件的頂端在執行緒中擁有全域變數,此外 SET 敘述參考的變數也有全域範圍,全域範圍的變數為全域變數主要存在於資料程式的期間內,同時除非我們明確的刪除變數,否則在資料程式中的全域變數將會被包括在執行緒輸出集合中,執行緒變數存在於執行緒程式實體的執行期間,同時會透過 SET 和 FROM 敘述傳送至資料程式中。

資料類型

當在撰寫 DS2 程式語言,我們必須了解資料類型,在 DS2 中提供了豐富的資料類型,目前主要有四種類型種類,分別為字元、數值、二進位和日期與時間,不同的類型種類還會細分資料類型,請參考下表:

類型種類 資料類型 描述
字元 CHAR(n) 固定長度最大 n 個字元。
字元 VARCHAR(n) 變動長度最大 n 個字元。
字元 NCHAR(n) 固定長度最大 n 個 UNICODE 字元。
字元 NVARCHAR(n) 變動長度最大 n 個 UNICODE 字元。
數值 TINYINT 有號整數,範圍從 -128 至 -127。
數值 SMALLINT 有號整數,範圍從 -32,768 至 32,767。
數值 INTEGER 有號整數,範圍從 -2,147,483,648 至 2,147,483,647 。
數值 BIGINT 有號整數,範圍從 -9,223,372,036,854,775,808 至 9,223,372,036,854,775,807 。
數值 NUMERIC(p,s) 有號、精確和定點的十進位數字,p 代表接受的總位數,s 代表小數點之後的位數。
數值 DECIMAL(p,s) 有號、精確和定點的十進位數字,p 代表接受的總位數,s 代表小數點之後的位數。
數值 REAL 有號、精確和浮點數字,主要儲存精確結果,浮點數可能會導致近似或不精確的超果。
數值 FLOAT 有號、精確和浮點數字,主要儲存精確結果,浮點數可能會導致近似或不精確的超果。
數值 DOUBLE 有號、精確和浮點數字,主要儲存精確結果,浮點數可能會導致近似或不精確的超果。
二進位 BINARY(n) 固定長度二進位,n 為最大的位元數。
二進位 VARBINARY(n) 變動長度二進位,n 為最大的位元數。
日期與時間 DATE 日曆上的日期。
日期與時間 TIME(p) 時間,p 代表精確。
日期與時間 TIMESTAMP(p) 日期與時間,p 代表精確。

最後 PROC DS2 處理大數據時還有三個主要的功能分別為嵌入 SQL、執行續資料存取和在資料庫處理,簡單來說 DS2 可以透過 SET 敘述或嵌入 SQL 敘述存取資料,同時搭配執行緒存取更效率,此外特定資料庫支援在資料庫處理,像是 Teradata 資料倉儲,透過 SAS Embedded Process 與 AMP 溝通進行更快速的分散式平行處理。

總結 PROC DS2 主要是新的程序除了提供物件導向的程式設計環境,同時提供更有效率處理大數據的方式,以利解決大數據分析的問題。

相關資源

⬅️ Go back