Teradata

Teradata 基本介紹 (11)

基本介紹

教學目標

初步了解 Teradata 查詢模式的基本概念。

重點概念

首先在 Teradata 中主要有兩種模式分別為 Teradata 模式和 ANSI 模式。當我們在透過 Teradata 系統查詢資料時,需要選擇適當的模式進行查詢,建議採用 Teradata 模式。

接著所謂 Teradata 模式主要是針對資料比較不區分大小寫,允許顯示資料進行 Truncation,交易隱含 Commit ,以及建立資料表預設為 Set。

再來所謂 ANSI 模式主要是針對資料比較區分大小寫,不允許顯示資料進行 Truncation,交易不含 Commit,以及建立資料表預設為 Multiset。

Teradata 模式 ANSI 模式
比較資料 區分大小寫。 不區分大小寫。
顯示資料 允許 Trunction。 不允許 Truncation。
交易作業 內含 Commit。 不含 Commit。
建立資料表 預設 Set。 預設 Multiset。

最後許多資料分析與管理平台若與 Teradata 系統整合查詢時通常預設皆為 ANSI 模式,此時將會造成一些問題發生,像是「Error - Right truncation of string data - Teradata Community」的錯誤訊息。若要解決此問題除了修改讀取的資料表設定之外,我們就只能要想辦法將其設定為 Teradata 模式進行查詢。

相關資源

Teradata 認證考試 (1)

基本介紹

教學目標

初步了解 Teradata 認證考試基本概念。

重點概念

Teradata 資料庫主要是在伺服器端,並且藉由平行 (Parallelism) 運算的能力允許 Teradata 資料庫快速處理大量資料,此外為了讓查詢速度更快因此我們會在關聯式資料表中,透過主鍵值 (Primary Key) 欄位或欄位集合為獨立識別該列資料。

接著對於使用者而言,因為 Teradata 資料庫為關聯式資料庫,所以會透過 SQL 結構化查詢語言存取在 Teradata 資料庫中的資料表 (Tables)。當然除了資料表之外,在 Teradata 資料庫中還有檢視表 (Views)、巨集 (Macros)、觸發 (Triggers)、預儲程序 (Stored Procedures)、使用者定義函數 (User Defined Functions,UDFs)、聯集和雜湊索引 (Join and Hash Indexes),以及永久日誌 (Permanent Journals) 等主要物件。其中所謂檢視表為針對一個或多個資料表進行欄或列的過濾,以及所謂巨集為預先定義儲存執行單一交易的 SQL 敘述集合,上述這兩者皆不會佔用 PERM 空間。

最後 Teradata 架構主要有四個元件,分別為 PEs、BYNET、AMPs、Vdisks,首先在客戶端的使用者會透過連接工具,像是 CLI、ODBC、JDBC、.NET、TDP (Teradata Director Program) 和 MTDP (Micros Teradta Director Program) 進行連接將 SQL 指令傳送給 Teradata 伺服器,接著會先由 PE 檢查 SQL 語法 (每個 PE 最多僅支援 120 Sessions,此外會搭配 TDP 平衡 Session,以及 MTDP 管理例行性工作。),以及針對 SQL 語法進行轉換 (Parse)、化(Optimize) 和分派 (Dispatch) 查詢計劃,再來透過訊息傳送層 BYNET 與 AMP 連線,再由 AMP 管理和擷取來自於虛擬磁碟機的資料,進行聚合和鎖定等相關工作。

相關資源

R 快速入門 (1)

基本介紹

教學目標

R 語言的快速入門和如何取得第三方資料。

重點概念

最近參與公司指派的 R 語言二天專業課程,主要是由 Teradata 資深顧問來授課,老師非常有經驗,過程中教了許多重點概念,一開始先教如何安裝 R 軟體和 RStudio 軟體,並且建議安裝版本為 3.1.1。接著針對 R 語言的資料型態進行基本介紹,R 語言有許多不同種類的資料型態,主要有純量、向量、矩陣、資料框、清單和因數,首先我們主要透過 <- 指定資料內容,透過 [] 取得資料內容和透過 is. 判斷資料型態和 as. 轉換資料型態。

指定資料內容

1
2
3
4
5
6
7
8
a <- 1
a <- a + 1
n <- c(1,2,3,4,5)
s <- c("one","two","three","four","five")
l <- c(TRUE,FALSE,TRUE,FALSE,FALSE)
m <- matrix(1:30, nrow=5,ncol=6)
d <- data.frame(n,s,l)
l <- list(name="Leo", company="Cathaybk", skill=c("Teradata","IBM","SAS"))

(註: 其中純量、向量、矩陣中的內容必為相同型態,僅有資料框和清單能為不同型態)

取得資料內容

1
2
3
4
n_v <- n[n>3]
s_v <- s[c(4,5)]
m_v <- m[1,3]
l_v <- l$skill

(註: 一般來說判斷式會比索引值處理較快)

轉換資料型態

1
2
3
4
5
6
7
8
9
is.vector(n)
is.matrix(m)
is.data.frame(d)
is.list(l)

m_v <- as.vector(m)
n_v <- as.matrix(n)
l_v <- as.data.frame(l)
d_v <- as.list(d)

(註: 此時輸入 as.list(d)$s 會發現有 Levels 的資訊,這主要就是自動轉換後的因數 (Factor) ,在未來若發生將資料呈現圖表發生錯誤時,可先確認資料是否已經向動轉換成因數。)

接著 R 語言有許多不同資料處理的方式,首先當沒有資料進行分析時,我們可以先透過函數產生隨機變數和產生客製圖表,接著透過函數讀取檔案內容,以及針對多個有規則的檔名搭配 seq 、 format 和 paste 函數進行處理,會將資料處理的過程匯整成使用者自訂函數重複應用。

產生隨機圖表

1
2
3
4
# set.seed(1234)
x <- rnorm(15,sd=5,mean=20)
y <- 3.5 * x - 2.0 + rnorm(5,sd=9,mean=0)
plot(x,y,xlab="X 軸",ylab="Y 軸",main="隨機變數")

(註: 若要每次隨機執行結果皆一樣可以透過 set.seed() 指令,若要客製不同種類的混合圖表,則可以疊圖方式進行處理。)

選取特定檔案

1
data <- read.table("c:/資料夾/記錄201501.csv", header = TRUE, sep = ",")

(註: 若要以選取檔案的方式進行讀取,則可以透過 choose.file() 取代檔名實作。)

讀取多個檔案

1
2
3
4
5
6
7
link <- "c:/資料夾/"
seq_date <- format(seq(as.Date("2015-01-01"), as.Date("2015-12-31"), by="month"), "%Y%m")
data_source <- paste(link, "記錄", seq_date, ".csv", sep="")
for (i in seq(length(data_source))) {
data <- read.table(data_source[i], header = TRUE, sep = ",")
# 資料處理
}

使用者自訂函數

1
2
3
4
5
myfunc <- function (arg1 = "參數1" ,arg2 = "參數2") {
data <- c()
# 資料處理
return (data)
}

當然 R 語言更能夠針對網站內容進行文字探勘應用,首先我們會先從開始觀察網址的變化開始,接著透過檢視原始碼確保網址是否有特別規則和特別參數,待確認之後就能開始透過 RCurl 套件中的函數讀取網站內容。針對不同網站的原始碼內容,接著再透過 paste、cat、substr、substring、grep、regexpr、gsub、sub、strsplit、… 等字串處理和正規表示式函數等應用。當然我們最好分析如何進行拆解成許多不同區塊的處理函數,以避免當網站內容修改時,在最短的時間內找出問題進行修改,更能搭配 RSelenium 等自動化套件模擬使用者行為動態存取網站資料,並且將匯整至 R 語言中進行資料處理與分析應用,例如: 透過政府公開資料匯整天氣資訊圖表、透過新聞網站進行關鍵字資料探勘、透過一卡通網站獲取生活商圈的特店資料、…等相關應用。

取得網頁內容

1
2
3
4
library(RCurl)
# curl <- getCurlHandle()
# curlSetOpt(.opts = list(proxy = '代理伺服器網址:80'), curl = curl)
html <- getURL("http://www.google.com.tw")

(註: 透過 getURL 可以存取 HTTPS 的網站,以及可以透過 getCurlHandle 設定代理伺服器。)

最後針對初學者,特別強調解決問題流程,下述範例以如何使用 R 透過 ODBC 連接至 Teradata 資料倉儲連線執行 SQL 指令,並將結果回傳,以利進行後續資料處理,進行示範。

解決問題流程

  1. 透過 Google 搜尋關鍵字。

    1
    > R ODBC TERADATA SQL
  2. 安裝相關套件。

    1
    > install.packages("RODBC")
  3. 載入相關套件。

    1
    > library("RODBC")
  4. 查詢套件使用方法。

    1
    > ?RODBC
  5. 開始使用套件。

    1
    2
    3
    > channel <- odbcConnect("Teradata", uid="使用者名稱", pwd="密碼")
    > odbcGetInfo(channel)
    > dataframe <- sqlQuery(channel, "SELECT * FROM TABLENAME SAMPLE 100;")

此外 Teradata 資源顧問和我們分享 R 語言實作的相關經驗,並且提到 R 語言比較適用於概念性的驗證,但是實際部署應用則必須針對現有環境選擇最適當的解決方案。總結雖然碩士論文和新創公司工作時有應用 R 語言解決問題的經驗分別為分群演算法和推薦分析應用,但上完二門課之後對 R 又有更深一層的了解,其實教的很不錯。

相關資源

資料分析 Data Management Solutions for Analytics (1)

基本介紹

教學目標

初步了解資料倉儲和資料管理解決方案的分析應用。

重點概念

Gartner 國際研究機構在 2016 年發表一篇有關資料儲存和資料管理解決方案的分析應用,目前的企業皆需要透過資料管理的解決方案進行分析應用,主要在於管理和處理多元型態內部和外部的多元格式資料的能力,此時除了傳統資料倉儲廠商之外,更有全新的資料管理解決方案廠商能根據企業的不同需求進行分析應用,請參考圖一。


Magic Quadrant for Data Warehouse and Data Management Solutions for Analytics
圖一、Magic Quadrant for Data Warehouse and Data Management Solutions for Analytics

其中 Teradata 為領先者的角色,它主要提供資料倉儲內部和雲端的整合式解決方式,稱為統一資料架構 (Unified Data Architecture),優勢主要為針對不同市場的變化提供適合的解決方案,像是 Teradata 就能夠在 AWS 雲端主機運行,以及執行原生的 Hadoop 的相關分析應用,當然 Teradata 的處理效能、延展能力和工作負載管理皆是最重要的競爭優勢。

總結來說 Teradata 在於資料倉儲的分析應用在過去確實為領先者,但是在於資料管理方式的分析應用,則面臨許多競爭對手針對營運型分析提出適合的解決方案,像是 Oracle 、 Microsoft 、 IBM 和 SAP 等廠商,此時 Teradata 將不再是資料管理解決方案的分析應用之領先者了。

相關資源

資料處理 Perl (1)

基本介紹

教學目標

了解如何透過 Perl 程式語言撰寫 ETL 批次程式。

重點概念

企業主要是以 Windows 平台之個人電腦為主,因此會透過編輯工具 (例如: UltraEdit) 以 SFTP 方式進行遠端程式碼的撰寫,再透過遠端工具 (例如: Putty) 連線至 Unix 主機直接執行 Perl 批次程式碼並且進行除錯。Perl 全名為 Practical Extraction and Report Language ,也就是實務擷取與報表語言,其開發者為 Larry Wall 是一位語言學家,語言學直接想到不是單字就是句子,透過單字和句子拆解和組合就能在日常生活中表達更豐富的內容,其所代表的意義完全取決於句子的結構、語意和文章中實際的位置,因此 Perl 能夠以言簡意賅地方式表達想法。

在 1987 年 Perl 被發表目前已經能夠支援 Unicode 萬國碼,其最大的特色性就是以 C 語言為基礎開發的腳本語言 (Script),不需編譯直接執行,此外 Perl 不需要宣告變數即可使用,可是建議使用 use strict 強制使用變數一定要宣告,此外 Perl 可以搭配 DBI 函式庫依據資料表動態產生變數,變數只是便於保存某些東西的地方,必須有個名字,好讓我們回來取用時知道何處尋找某個特定物件,並且為了要能立即有用的方法就是按照變數所能存放資料的類別分類,類似英文名詞中的單數與複數之分,在 Perl 中會將數字和字串以單數變數儲存,單數變數稱為純量 (Scalar),將數字列和字串以複數變數儲存,複數變數稱為陣列 (Array) ,且在宣告變數時會以「$」前置符號告訴 Perl 為單數變數,以及會以「@」前置符號告訴 Perl 為複數變數。

然而若要透過 Perl 設計以 Teradata 資料倉儲為基礎的 ETL 批次程式框架,必須具備藉由 Perl 透過 Teradata BTEQ 命令執行 SQL 陳述式和藉由 Perl 將批次程式進行模組化的功能,也就是能夠將程式邏輯與查詢語法獨立個別檔案,彼此之間的關聯可以透過檔案存取的方式處理,宣告共用的自動依環境轉之變數藉由子程式的方式載入應用,以及針對不同處理階段獨立個別檔案再透過 ETL 工具整合為可行的批次程式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Perl 透過 BTEQ 命令執行 SQL 陳述式
#!/usr/bin/perl

use strict;

my $bteq_rc = open(BTEQ, "| bteq");

unless ($bteq_rc) {
print "無法正常驅動 BTEQ 命令。\n";
return -1;
}

print BTEQ << END_OF_BTEQ;

.SET ERROROUT STDOUT

# 相關 SQL 陳述式,其中可以透過 ${變數名稱} 自動置換 SQL 陳述式的內容
SELECT * FROM DBC.TABLES;

END_OF_BTEQ;

此外 Perl 還能夠搭配 DBI 函式庫執行 SQL 陳述式,並且透過資料表為基礎動態建立變數,更進一步動態修改批次中的 SQL 陳述式,也就是說 SQL 陳述式會根據資料表中的對應值進行動態調整,如此一來就能夠減少因為報表需求的頻繁更新,導致因為上線流程繁鎖所產生的困擾,但此應用只建議用於報表用途的批次程式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# Perl 透過 DBI 執行 SQL 陳述式
#!/usr/bin/perl

use strict;

my $hostname = "主機名稱";
my $username = "帳號";
my $password = "密碼";

my $dbh = DBI->connect("dbi:Teradata:${hostname}", $username, $password)

unless ( defined($dbh) ) {
print "無法正常連線至資料庫。\n";
return -1;
}

$sql = " SQL 陳述式";

$sth = $dbh->prepare(${sql});

unless ($sth) {
print "無法正常準備 SQL 陳述式。\n";
return -1;
}

$sth->execute();

# 透過資料表為基礎動態建立變數
while (@row = $sth->fetchrow()) {
my $key = trim($row[0]);
my $value = trim($row[1]);
$value =~ s/\"/\'/ig;
eval ("\${$key} = \"$value\"");
}

$sth->finish();

$dbh->disconnect();

最後 Perl 也支援正規表示法 (Regular Expressions) 和直接執行 Unix 指令等實用功能,因此能夠因應不同系統針對資料進行更強大的擷取應用,接著再搭配 Teradata BTEQ 進行快速載入和應用需求調整「動態」轉換為報表資料表的應用。雖然初學者來說的確很難上手,但在面對企業中龎大且複雜的系統時,以 Perl 為基礎撰寫的批次的確有能力解決所有複雜的問題,並且穩定執行,可惜維護與更新管理將會是其所面臨最大的挑戰。

相關資源