本文示例源代碼或素材下載
IBM® WebSphere® DataStage™ XML 和 Web Services 包是 DataStage 中的組件,用於在涉及 XML 和 Web 服務時交付快速數據集成解決方案。研究 DataStage Web Services 和 XML 包的主要功能和操作。學習如何使用這兩個包轉換、集成數據以及獲取 Google 搜索 Web 服務。本文包括 4 個示例,每個示例都有簡單的概述、詳細的步驟、說明和圖片。
簡介
DataStage XML 和 Web Services 包概述
Ascential DataStage 是 IBM 在 2005 年收購得到的,現名 IBM WebSphere DataStage。它是一款方便的、基於 GUI 的提取、轉換和裝載(ETL)工具,可用於集成不同結構和格式的數據,並且有效地支持客戶關系管理(CRM)分析、決策支持系統(DSS)和電子商務。
DataStage 基於一個客戶機-服務器基礎設施,包括設計器、管理器、導控器(director)和管理員組件,同時提供了健壯的功能。DataStage 可以大大簡化從開發到維護的任務。
DataStage 的 XML 包和 Web Services 包是本文的焦點。通過這兩個包,很容易將 XML 和 Web 服務集成到 DataStage 解決方案中。使用 DataStage 的這兩個包的優點有:
縮短開發時間
加快用戶響應
用戶友好的開發、管理和維護 GUI 環境
DataStage XML (DataStage 的 XML 包)由 XML 摘要、XML 發布和轉換功能組成。本文的 XML 部分介紹 XML 包提供的一種主要的轉換:XML 文檔與表數據之間的轉換。
Web Services 包能夠使 DataStage 可以調用遠程服務,並將那些遠程服務當作簡單的數據源、數據目標或交互式數據接口。本文的 Web 服務部分將介紹提供交互式數據接口的 Web Services Transformer。
本文包括 4 個關於使用 DataStage(Version. 7.5.1A,安裝了 XML 和 Web Services 包) 開發數據解決方案的示例,對於每個示例都進行了分析和注解。這 4 個示例基於以下典型的場景:
根據表數據發布 XML 文檔
將 XML 文檔解析為表數據
訪問具有輸入和輸出數據的 Web 服務
先決條件
安裝有 WebSphere DataStage V7.5.1A,其中含 DB2® 包、XML 包和 Web services 包。
安裝有 IBM® DB2 for Linux®, UNIX®, and Windows® V8.2(或更高版本)。
讀者具有 XML、Web 服務和 DB2 等方面的一些實踐經驗,並且有 DataStage 方面的基礎知識。
第 1 部分. 根據表數據發布 XML 文檔
根據已有的表數據發布 XML 文檔是一個常見的場景。有時候,需要將關系表或順序文件轉換成 XML 分層結構,例如 XML 文檔或 XML 塊。在這個例子中,可以使用 XML 輸出 stage 來生成 XML 輸出。它使用 XPath 表達式將輸入表字段映射到輸出文檔中的某些位置。
示例 1. 使用 XML 輸出 stage 根據兩個表生成 XML 文件
圖 1. XML 發布的任務圖示例 1 概述
在示例 1 中,分別從兩個對應的 DB2 表中提取客戶數據和聯系方式數據,如 圖 1 所示。接著,使用轉換器替換復雜的 SQL,集成數據,並通過 DSLink6 將連接後的數據提供給 XML 輸出 stage。然後,XML 輸出 stage 生成 XML 結果,並將結果保存到文件系統。圖 1 簡要地描述了整個應用程序 demo。
部署的通常步驟是:
定義和部署 DB2 表
准備 XML 結構
導入 DB2 表和 XML 表定義
設置 DB2 stage,以便用轉換器提供連接的數據
設置 XML 輸出 stage,以生成 XML 文檔
編譯和運行
我們來詳細討論這些步驟:
步驟 1. 定義和部署 DB2 表
使用清單 1 中的 DDL,將這些表部署到本地 DB2 服務器上的示例數據庫中,並裝載一些示例數據,如圖 2.1 和 2.2 所示:
清單 1. 用於客戶表和聯系方式表的 DDL
--customer table
CREATE TABLE S_CUST
(
CUST_NUM CHARACTER(10) PRIMARY KEY,
CUST_NAME VARCHAR(100) NOT NULL
);
--contact table
CREATE TABLE S_CONTACT
(
CNT_NUM INTEGER
GENERATED ALWAYS AS IDENTITY( START WITH 1, INCREMENT BY 1 )
PRIMARY KEY,
CUST_NUM CHARACTER(10) NOT NULL,
F_NAME VARCHAR(50) NOT NULL,
L_NAME VARCHAR(50) NOT NULL,
EMAIL VARCHAR(100) NOT NULL
);
圖 2.1. 客戶表的示例數據
圖 2.2. 聯系方式表的示例數據
步驟 2. 准備 XML 結構
目標 XML 結構可以通過 XSD 模式文件來定義,也可以通過 XML 示例文檔來定義。清單 2 是一個要導入 DataStage 中的 XML 示例文檔:
清單 2. target.xml - 示例 XML 文件
<CustomerInfo xmlns="http://www.ibm.com/schemas/SimpleXMLDemo"
XMLns:cnt="http://www.ibm.com/schemas/ContactDemo"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CustomerID>0000000001</CustomerID>
<CompanyName>MindLight Corp.</CompanyName>
<Contacts>
<cnt:Contact>
<cnt:FirstName>Lee</cnt:FirstName>
<cnt:LastName>Chen</cnt:LastName>
<cnt:Email>LeeChen@gmail.com</cnt:Email>
</cnt:Contact>L
</Contacts>
</CustomerInfo>
如清單 2 所示,XML 文件中有 5 個主要的字段:CustomerID、 CompanyName、FirstName、LastName 和 Email。每個字段在數據庫表中有一個對應的列。
步驟 3. 導入 DB2 表和 XML 表定義
為了輸入數據源信息,需要在 DataStage 中手動輸入表定義,或者直接從源數據導入定義。DataStage 表定義包括很多表格式的數據源的元數據(參見 圖 3),包括存放數據的表或文件的名稱和位置,以及它們所包含的列的定義。這些信息存儲在 DataStage 儲存庫中的表定義中。
這個示例從 DB2 中導入兩個數據庫表,並從示例文件中提取 XML 結構。
注:應該安裝 DB2 和 XML 插件模塊,以啟用這些特性。
圖 3. 表定義結構導入 DB2 表定義
選擇 Plug-in Meta Data Definitions(如圖 4 所示,在紅色圓圈內),導入一個 DB2 表。
圖 4. 插件元數據定義從彈出窗口中選擇 DB2 plug-in,單擊 OK。在 “Import DSDB2 Meta Data” 窗口的第一個頁面(參見圖 5),選擇 SAMPLE 數據庫作為導入元數據的源,並使用適當的用戶名和密碼。確認勾選了 Tables 和 Fully QualifIEd Table Names 復選框,以便下一個窗口中顯示的表名中包含模式名。單擊 Next 按鈕。
圖 5. 導入 DSDB2 元數據 1DB2 表定義可以存儲在 “PlugInsample” 編目中,如圖 6 所示:
圖 6. 導入 DSDB2 元數據 2導入 XML 表定義
在 repository 視圖中,右鍵單擊 Table definitions,選擇 Import > XML Table Definition(類似於 圖 4 顯示的動作)。這樣做之後,XML Meta Data Importer 將被激活(參見圖 7)。
圖 7. XML Meta Data importerXML Meta Data Importer 可以從 XML 示例文件或 XSD 文件中導入 XML 結構。在 XML Meta Data Importer 中打開 target.xml 文件。這個 XML 文件被打開後,就會被映射到表結構中。如圖 7 所示,選擇作為表定義的列的 5 個數據元素的 TEXT 字段(以紅圈標記),以提取 XML 元素的文本內容。“Description” 字段(在圖 7 中以紅框標記)包含 XPath,它表明一個列在 XML 文檔中相應的位置。在這個示例中,假設每個聯系方式記錄都有一個惟一的 e-mail 地址,作為“Key” 列。將表定義保存在 “PlugInsample” 編目中,命名為 “target_XML”。
至此,三個表定義(圖 8 中以紅圈標記)都已經被成功地導入到編目中。
圖 8. 導入的表定義步驟 4. 設置 DB2 stage,以便用轉換器提供連接的數據
有了儲存庫中的表定義,現在可以設置用於 XML 輸出的數據源。提取數據的方式有兩種:
在一個 DB2 stage 中使用 SQL,如圖 3 所示。
使用轉換器連接來自多個 stage 的數據
本示例采用第二種方式:
清單 3. 用於數據提取的查詢
SELECT cnt.CUST_NUM,c.CUST_NAME,cnt.F_NAME,cnt.L_NAME,cnt.EMAIL
FROM S_CONTACT cnt
JOIN S_CUST c ON cnt.CUST_NUM=c.CUST_NUM ;
圖 9. 清單 3 中的查詢的結果
要在 DataStage 中獲得圖 9 所示的輸出,可以采用兩個 DB2/UDB API stage(在 Palette 的 Database 編目中)和一個 Transformer stage(在 Palette 的 Processing 編目中)。這些 stage 被添加到一個新的任務圖中,並命名如下:
兩個 DB2 stage:“CONTACT” 和 “CUST”
轉換器:“JOIN_CUST_CNT”
分別使用 DSLink3 和 DSLink4 將 “CONTACT” 和 “CUST” 連接到 “JOIN_CUST_CNT”。(參見圖 10。)
圖 10. 任務圖作為數據庫開發人員,您通常將客戶表與聯系方式表連接,並將客戶表視作主表。但是在本示例中,聯系方式表是主表,DSLink3 的實線箭頭表明了這一點。對於主表的記錄,轉換器對非主表進行查找。對於主表的每條記錄,只從非主表中檢索一條記錄。
注:只有 ODBC 和 UniVerse stage 支持多行查找。
“CONTACT” stage 配置
雙擊 “CONTACT” stage,配置它的屬性。在 “Stage” 頁面,填入 DB2 連接信息:數據庫名稱、用戶名和密碼。切換到 “Output” 頁面,單擊 columns 選項卡。列信息包括列名、來源、類型等。可以直接對列進行編輯,或者從已有的表定義中導入列。對於這個 stage,使用導入的 CHENLI.S_CONTACT 表定義來裝載列。單擊 Load 按鈕,在彈出的表定義窗口中選擇 CHENLI.S_CONTACT,單擊 OK,然後,在接下來的列選擇窗口中,選擇表定義中的所有列。裝載好列之後,結果如圖 11 所示:
圖 11. 裝載的列設置 “CONTACT” stage 中的 SQL,以便從 DB2 中提取數據。選擇 SQL 選項卡,單擊 SQL Builder。默認情況下,這樣做會激活 SQL Builder,這是一個 GUI 工具,用於輔助完成 SQL 查詢(參見圖 12)。
圖 12. SQL builder設置好 SQL 後,單擊 OK。“SQL” 選項卡看上去應該如圖 13 所示。現在可以選擇 “VIEw Data” 按鈕查看 “CONTACT” 表的內容。
圖 13. SQL 選項卡至此,“CONTACT” stage 配置完畢。可以遵循相同的步驟設置 “CUST” stage。然後,兩個鏈接上將顯示兩個表的圖標。
“JOIN_CUST_CNT” stage 配置
現在可以配置轉換器 “JOIN_CUST_CNT”,以便將兩個輸入 DB2 stage 聚合在一起,從而產生連接的數據。將 CUST_NUM from DSLink 3 拖放到 DSLink4 的 CUST_NUM,如圖 14 所示:
圖 14. 轉換器 stage步驟 5. 設置 XML 輸出 stage,以生成 XML 文檔
將 XML 輸出 stage 添加到 “Palette” 的 “Real Time” 編目中名為 “Gen_Cust_XML” 的圖中,並將來自 “JOIN_CUST_CNT” 轉換器 stage 的鏈接添加到該圖中,如圖 15 所示:
圖 15. 將 XML Output 添加到任務圖中雙擊 Gen_Cust_XML stage,以便設置它的屬性。對於當前解決方案,在 “Stage” 頁面上,只需在 “Document Settings” 選項卡(參見圖 16)中設置 “Namespace Declarations”,並在 “Options” 選項卡(參見圖 17)中設置輸出 XML 文件的文件路徑。名稱空間聲明的裝載類似於從表定義中裝載列 —— 從 XML 表定義中裝載名稱空間。
圖 16. 裝載名稱空間聲明 圖 17. 設置輸出文件路徑在 “Input” 頁面上,需要填充 columns 選項卡。這個過程類似於為 DB2 stage 裝載輸出列。裝載 XML 表定義 “target_xml” 之後,XML 輸出 stage 如圖 18 所示。
圖 18. 從 XML 表定義裝載列注:在目標 XML 結構中,每個客戶可以有多個聯系方式,所以需要聚合每個客戶的聯系方式信息,以減少冗余。為此,像圖 19 中那樣設置 “transformation settings”:
圖 19. 轉換設置通過使用觸發器列 “CustomerID”,僅當 “CustomerID” 字段被更改為一個新值時,輸出將生成一條包含一個 XML 文檔的新記錄。圖 9 中的數據將被聚合為一個單獨的 XML 文檔。
回到 “JOIN_CUST_CNT” stage,通過拖動字段,將左側的輸入列鏈接到右側的輸出(參見圖 20。)
圖 20. 修改後的轉換器 stage單擊 OK。 至此,XML 發布解決方案已經完成。
步驟 6. 編譯和運行
在設計器中編譯和運行這個任務。如果沒有錯誤,那麼可以將它作為一個例程任務添加到任務調度中。當在設計器中運行該任務時,如果沒有發現錯誤,則含有相關統計信息的鏈接將變成綠色(參見圖 21)。 如果發生了錯誤,那麼這些鏈接會變成紅色。為了進行調試,必須查看日志。在圖 21 中,這個任務成功地生成了一個目標 XML 文件:SampleOutput1.XML。
圖 21. 運行示例 1 的任務第 2 部分. 將 XML 文檔解析為表數據
這個場景與發布 XML 數據的過程相反 —— 接受 XML 數據,將其解析到表記錄中,然後將這些記錄插入到數據庫表中。本文將演示兩個示例,以展示如何將 XML 文檔解析為表數據。示例 2 是前面 XML 發布示例的反向過程,它將 XML 文檔裝載到客戶表和聯系方式表中。示例 3 包含一個更復雜的 XML 輸入和 db2 輸出(3 個表)。這兩個例子中將使用不同的部署方法。
示例 2. 使用 XML 輸入 stage 從 XML 文檔中提取客戶和聯系方式信息
示例 2 概述
在示例 2 中,使用示例 1 中的表定義(參見 圖 8),並使用一個 XML 文件准備輸入數據,該 XML 文件有一家新的公司和兩個聯系方式(參見 input_cust_cnt.xml)。在這個例子中,使用一個文件夾 stage 來讀取 XML 文件,將內容傳遞給 XML 輸入 stage 以解析出表記錄,然後使用轉換器將列劃分到不同的表中。圖 22 顯示了任務圖:
圖 22. 示例 2 任務圖“XML_CUST_CNT” stage 的預期輸出如 圖 9 所示。
注:在 CUST_NUM 和 CUST_NAME 列上有重復信息,它們將被傳遞到客戶表,導致主鍵沖突。為了處理這個問題,可以使用一個聚合器將每個客戶的重復記錄合並為一個記錄。
開發這個示例解決方案的通常步驟為:
設置用於讀取 XML 文件的文件夾 stage
設置 XML 輸入 stage
設置接收數據的 DB2 stage
配置聚合器
設置用於分發數據的轉換器 stage
編譯和運行
我們來詳細討論這些步驟。
對於這個示例,可以首先將 圖 22 中顯示的所有 stage 和鏈接添加到新任務中,然後逐步設置每個 stage。
步驟 1. 設置用於讀取 XML 文件的文件夾 stage
雙擊 XML_FOLDER stage。在 “Stage” 頁面中設置文件夾 pathname 屬性。在 “Output” 頁面中填充通配符屬性(例如文件名 wildcard*.txt;對於這個例子,我們使用 *.XML)。
然後可以采用內置的表定義 “Folder” 裝載用於 “XML_FOLDER” stage 的列,如 圖 23 所示。“Folder” 定義包含兩個字段:“FileName” 和 “Record”。“Record” 列將包含來自源文件夾的輸入文件的內容。
圖 23. 從 “Folder” 表定義中裝載列步驟 2. 設置 XML 輸入 stage
雙擊 XML_CUST_CNT,打開它的屬性窗口。指定 “Record” 作為 XML 源列,以便從這個列獲得輸入 XML 文檔。然後相應地將 “Column content” 設置為 “XML document”。
圖 24. 設置 XML 源如 圖 25 所示,在 “Output” 頁面上,填充 “Transformation Settings” 選項卡和 “Columns” 選項卡,以使 “XML_CUST_CNT” stage 解析輸入 XML 文檔,並生成輸出記錄。首先,選擇 Repetition element required,因為輸入文檔包含多個聯系方式元素。然後,從 XML 表定義裝載名稱空間(類似於 圖 16 顯示的那樣)。
注:如果輸入文檔包含多個名稱空間和前綴,則名稱空間聲明是必需的。
圖 25. “XML_CUST_CNT” stage 的轉換設置通常不需要手動為 XML 輸入 stage 裝載列定義,因為裝載名稱空間的同時會導致將 XML 表定義的列裝載到 “Columns” 選項卡中(參見圖 26)。
注:在 XML 輸入 stage 中,名稱空間和列是同時裝載的,這與 XML 輸出 stage 不同,後者必須分開裝載。
圖 26. “XML_CUST_CNT” stage 的輸出列每個列定義在其 description 字段中有一個 XPath 表達式,用於將 XML 文檔中的某個元素映射到相應的輸出數據列。這些 XPaths 是用於解析 XML 的最關鍵的設置。此外,key 字段指定重復元素。在這裡,e-mail 元素被選作鍵,因為它惟一對應一個聯系方式。
至此,“XML_CUST_CNT” stage 的設置即告完成。
步驟 3. 設置接收數據的 DB2 stage
首先配置 “CONTACT” 和 “CUST” 這兩個 DB2 stage 的服務器信息。
但是,與之前的 DB2 stage 示例不同,現在在 DB2 stage 的 “Input” 頁面上操作,因為這裡使用輸入鏈接,而不是輸出鏈接。選擇目標表(參見圖 27),為每個 DB2 stage 裝載列。
注:不應該包括自動生成列。
圖 27. 選擇目標表對於聯系方式表,沒有選擇 “CNT_NUM” 列,因為它是一個自動增加的 id 列,它的值是在插入新記錄時自動生成的。另一方面,客戶表的所有列都選擇了,因為它們都來自 XML 文檔。
步驟 4. 配置聚合器
由於 XML 輸入 stage 將為相同的客戶生成多個行,因此需要使用一個聚合器 stage 為 “CUST” stage 合並客戶的冗余信息。
聚合器接收的輸入數據應該與輸出鏈接具有相同的結構,這種結構由 “CUST” stage 定義。(實際上,它是由 DB2 表 “CHENLI.S_CUST” 定義。)所以,這裡裝載表定義 “CHENLI.S_CUST” 作為這個聚合器的輸入。
在聚合器的輸出頁面上,輸出列為 “CUST_NUM” 和 “CUST_NAME”。這裡需要定義兩個輸出列的來源,以消除冗余記錄,如圖 28 所示。
圖 28. 聚合器 stage雙擊圖 28 中來源列下高亮顯示的單元。這時將顯示一個 “Derivation” 對話框,用於進行配置。圖 29 顯示了一個詳細的來源配置,其中包含聚合函數 “grouped”。
圖 29. Derivation 對話框除了 “grouped” 之外,在 Aggregate function selection 對話框中,在其它情況下還可以使用 Max、Min、Count、Average、Sum 等函數。
步驟 5. 設置用於分發數據的轉換器 stage
在轉換器屬性窗口中,將源鏈接到目標(參見圖 30)。
圖 30. 在轉換器中分發數據完成時,單擊 OK。示例 2 現在就可以運行了。
步驟 6. 編譯和運行
完成上述所有步驟後,當裝載完成時,可以看到如圖 31 所示的視圖。
圖 31. 成功裝載一個 XML 文檔使用清單 4 中的 SQL 檢查 DB2 中的表,結果如圖 32 所示:
清單 4. 檢查 DB2 中的表
SELECT * FROM S_CUST cust WHERE cust.CUST_NUM='0000000002';
SELECT * FROM S_CONTACT cnt WHERE cnt.CUST_NUM='0000000002';
圖 32. 清單 4 中 SQL 的結果
示例 3. 使用一組 XML 輸入 stage 將數據從 XML 文檔提取到 3 個表中
示例 3 概述
在示例 2 中,XML 文檔(input_cust_cnt.xml)代表這樣一個典型的場景:其中包含只分發到兩個表的數據,且其中一個表引用另一個表。而現在這個示例是更復雜的情況:XML 文檔有多組重復元素(參見 清單 5)或嵌套重復元素(參見 清單 6),並且將數據分發到 2 個以上的表中。相應的關系模型可以描述如下:
一個頭表引用 3 個或更多表
3 個或更多表嵌套在一個樹結構中
1 和 2 混合
雖然這類文檔很難用一個 XML 輸入來處理,但它們是最常見的情況,因為可以將各種不同的相關數據一次封裝到一個文檔中。
清單 5. XML 文檔有多組重復元素
<A>
<A_DATA/>
<B>
<B_DATA/>
<B_DATA/>
<B_DATA/>
</B>
<C>
<C_DATA/>
<C_DATA/>
</C>
</A>
清單 6. XML 文檔有多組嵌套的重復元素
<A>
<B>
<B_DATA/>
<C/>
<C/>
<C/>
</B>
<B>
<B_DATA/>
<C/>
<C/>
<C/>
</B>
</A>
為了處理清單 5 和 6 中那樣的 XML 文檔,一個簡單的解決方案是使用一組 XML 輸入 stage,這些 stage 以轉換器 stage 鏈接起來,以分別接收和處理文檔的不同分支。在示例 3 中,元素 “Orders” 被添加到示例 2 中的 XML 結構中(參見 input_cust_cnt.xml),以構建一個新文檔 input_cust_cnt_ord.XML(參見下面的清單 7)。 對於清單 5 中的每個結構,相應地會創建一個新表 “S_ORDER”(參見 清單 8)。
清單 7. Input_cust_cnt_ord.XML
<?XML version="1.0" encoding="UTF-8"?>
<CustomerInfo XMLns:cnt="http://www.ibm.com/schemas/ContactDemo"
xmlns="http://www.ibm.com/schemas/SimpleXMLDemo"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CustomerID>0000000003</CustomerID>
<CompanyName>Eastway software Inc.</CompanyName>
<Orders>
<OrderItem>
<OrderNum>00001</OrderNum>
<OrderQty>1.00</OrderQty>
<PartId>A01</PartId>
</OrderItem>
<OrderItem>
<OrderNum>00002</OrderNum>
<OrderQty>2.00</OrderQty>
<PartId>A02</PartId>
</OrderItem>
<OrderItem>
<OrderNum>00003</OrderNum>
<OrderQty>4.00</OrderQty>
<PartId>A03</PartId>
</OrderItem>
</Orders>
<Contacts>
<cnt:Contact>
<cnt:FirstName>Andy</cnt:FirstName>
<cnt:LastName>Lin</cnt:LastName>
<cnt:Email>AndyLin@eastway.com</cnt:Email>
</cnt:Contact>
<cnt:Contact>
<cnt:FirstName>Tom</cnt:FirstName>
<cnt:LastName>Zheng</cnt:LastName>
<cnt:Email>TomZ@eastway.com</cnt:Email>
</cnt:Contact>
</Contacts>
</CustomerInfo>
清單 8. 訂單表的 DDL
CREATE TABLE S_ORDER
(
ORDER_NUM CHARACTER(5) PRIMARY KEY,
CUST_NUM CHARACTER(10) NOT NULL,
PART_ID CHARACTER(3) NOT NULL,
QTY DECIMAL(10,3)
);
在這個解決方案中,使用兩層的 XML 輸入 stage 來分兩個階段處理 XML 文檔。在第一個階段,使用一個 XML 輸入 stage 解析客戶信息,並獲得聯系方式和訂單的 XML 塊。然後,將這兩個塊傳遞給下一個階段的兩個不同的 XML 輸入 stage,以提取 “S_CONTACT” 和 “S_ORDER” 表的數據。任務圖如圖 33 所示:
圖 33. 示例 3 任務圖開發這個示例解決方案的通常步驟為:
設置文件夾 stage
配置 3 個 XML 輸入 stages
設置用於鏈接相關 stage 的轉換器
設置 DB2 輸出 stage
編譯和運行
我們來詳細討論這些步驟。
前面的小節中已經討論了設置每個 stage 的方法。 因此,本節忽略這些細節,而將重點放在較為棘手的部分:這些 XML 輸入 stage 的 “Columns” 設置。首先,通過 XML Meta Data Importer(參見 圖 7)導入 XML 表定義。接著,修改定義的列列表和 XPath。
第一個 XML 輸入 stage 名為 “XML_Cust”。設置它的輸出鏈接列,以便提取表 “S_CUST” 的 CustomerID 和 CompanyName 字段,以及 <Orders/> 和 <Contacts/> 的 XML 塊,如圖 34 所示:
圖 34. “XML_Cust” 的 Output Columns 選項卡注:在這個特定的例子中,為了提取 XML 塊,不應該將 /text() 附加在 XPath 表達式的後面,例如 “/ns1:CustomerInfo/ns1:Orders”。相應地,該列將返回元素的整個 XML 結構,並且其它 stage 很容易地進一步處理該列。
為了接收 XML 塊,並產生包含對客戶表的引用的記錄,必須手動設置其它兩個 XML 輸入 stage,以獲得輸入列中的 CUST_NUM fIEld 和 XML 塊字段,如圖 35 所示。
圖 35. “XML_Contact” 的 Input Columns 選項卡當准備好 “XML_Contact” stage 和 “XML_Order” stage 的輸入列時,使用轉換器 “Div_branches” 連接它們。
圖 36. 在 “Div_branches” stage 中分發數據然後,分別配置 “XML_Contact” 和 “XML_Order” stage 的輸出列。
注:XML 輸入 stage 與 DB2 stage 之間沒有轉換器來將輸出字段映射到 DB2 列。所以必須確保 XML 輸入 stage(“XML_Contact” 和 “XML_Order”)中輸出列的名稱與數據庫表中的名稱一致。完成這些設置後,DB2 stage 中的輸入列將被自動裝載。不要通過重新裝載表定義覆蓋 DB2 stage 中的輸入列,否則前面 XML 輸入 stage 中的 XPath 將丟失。
圖 37. “XML_Contact” stage 的輸出列 圖 38. “XML_Order” stage 的輸出列注:兩個 XML Input stage 的輸入和輸出列中都有 “CUST_NUM” 字段。這個字段是一個 “傳遞(pass-through)” 字段,它被直接從輸入鏈接傳遞到輸出鏈接。
在設置所有 stage 之後,運行任務,應該可以看到如圖 39 所示的一個成功視圖。
圖 39. 成功地將一個 XML 文件裝載到 3 個表中檢查 DB2 中的數據。
清單 9. 用於檢查表數據的 SQL
SELECT * FROM S_CUST cust WHERE cust.CUST_NUM='0000000003';
SELECT * FROM S_CONTACT cnt WHERE cnt.CUST_NUM='0000000003';
SELECT * FROM S_ORDER ord WHERE ord.CUST_NUM='0000000003';
圖 40. 清單 9 中的 SQL 的結果
第 3 部分. 訪問具有輸入和輸出數據的 Web 服務
通過 Web Services 包,DataStage 很容易在一個 DataStage 服務器任務中訪問 Web 服務操作。Web service 包將添加兩個實時 stage 到 DataStage 中:Web 服務客戶機 stage 和 Web 服務轉換器 stage。當使用 Web 服務作為數據源或數據目標時,使用 Web 服務客戶機 stage。在這種情況下,一個 Web 服務操作中只需要一個輸入或輸出鏈接。但是,Web 服務轉換器 stage 同時具有輸入鏈接和輸出鏈接,可以在數據事務中與遠程服務交互。Web services 包還使 DataStage 支持 Web 服務例程,Web 服務例程被用於作為轉換器 stage 中的轉換器函數。本文的這一部分只使用和討論示例中的 Web 服務轉換器,因為它是用於在 DataStage 中采用 Web 服務的最典型、最靈活的 Web 服務轉換器。Web 服務客戶機 stage 和 Web 服務例程更簡單一些,“Web services Pack Designer Guide”(參見 參考資料)中對它們作了很好的說明。
為了將一個 Web 服務轉換器集成到一個解決方案中,需要導入 WSDL Web 服務描述文件,將 Web 服務轉換器添加到解決方案中,並在這個 Web 服務轉換器中選擇目標服務。然後,向它提供數據,並以適當的方法處理輸出,例如將數據提取並保存到文件或數據庫中。下面的示例用於通過一個實際案例演示該特性。
示例 4. 用來自數據庫表的關鍵字查詢 Google,並將響應存儲在另一個表中
示例 4 概述
這裡選擇 GoogleSearch 服務作為目標服務,因為它是一個典型的場景:提交一個查詢,然後返回記錄。此外,這個 Web 服務方便使用並且是免費的。GoogleSearch 服務在 Google SOAP Search API 項目(參見 參考資料)中,其中包括 3 個操作:doGoogleSearch、doGetCachedPage 和 DOSpellingSuggestion。 在這個例子中,使用 doGoogleSearch 操作。在訪問該服務之前,必須注冊一個免費賬戶(一個 Web 頁面地址),以獲得一個許可鍵,這個許可鍵包含在被請求的消息中被發送,用於標識請求者。在 doGoogleSearch 操作的事務中,先將一個查詢和許可鍵發送給 Google,然後返回一個響應消息,其中包含一些命中結果,以重復結構表示。
注:這裡有一個限制,DataStage 7.5.1A 中的 Web 服務轉換器不能將響應中的重復元素解析到多行記錄中。每個輸入行只能生成一行輸出數據。幸運的是,Web 服務轉換器使用 XPath 從響應文檔中提取數據,並支持 XML 塊輸出。因此,可以從原始消息中提取包含重復結構的 XML 塊,然後將它們傳遞到接下來的 XML 輸入 stage。通過這種方法可以繞過上述限制,甚至可以處理更復雜的結構。
示例 4 的目標解決方案將從一個 DB2 表中提取查詢關鍵字,並將它們提供給 Web 服務轉換器。Web 服務轉換器將調用 Web 服務,並將響應消息直接輸出到下一個 XML 輸入 stage。最後,將結果放入另一個 DB2 表。任務圖如圖 41 所示:
圖 41. 示例 4 預期的任務圖在這個示例中,將采取一些步驟來設置該任務,這些步驟包括:
從 WSDL 文件導入目標服務
設置 Web 服務轉換器
設置 XML 輸入 stage
創建 DB2 表,並為輸入和輸出設置數據庫 stage
編譯和運行
我們來詳細討論這些步驟。
步驟 1. 從 WSDL 文件導入目標服務
在 repository 視圖中右鍵單擊 Table Definition,選擇 Import > Web Services WSDL Definitions (參見 圖 4)。這樣將激活 Web Services Meta Data Importer(參見圖 42)。使用它裝載 WSDL 文件。選擇目標操作,然後單擊 Import 按鈕保存定義。
圖 42. Web Services Meta Data Importer對於導入的一個操作,將生成一些表定義。 doGoogleSearch 也不例外。假設會自動創建以下表定義:
Info_WS:Web Services Meta Data,例如 URI、端口名等
doGoogleSearch_IN:輸入參數
doGoogleSearch_MSGIN:輸入消息元數據
doGoogleSearch_MSGOUT:輸出消息元數據
doGoogleSearch_OP:操作元數據
doGoogleSearch_OUT:輸出參數
步驟 2. 設置 Web 服務轉換器
Web 服務轉換器是這個解決方案的核心組件,因為輸入和輸出的數據結構完全取決於它。因此,Web 服務轉換器擁有高優先級。在 Web 服務轉換器的 stage 頁面,只需配置 Web 服務操作,以訪問一個開放的公共服務,例如這個示例中所討論的含有基本函數的 GoogleSearch。
注:而且,stage 頁面還提供了很多其它選項,例如設置代理、HTTP AUTH、HTTP、Web 服務參數等,用於更高級的應用。
為了為 Web 服務轉換器配置目標操作,在 “Stage” 頁面中單擊 Select Web Service Operation,然後在 Web 服務浏覽器中雙擊目標操作,如圖 43 所示:
圖 43. Select Web Service Operation切換到 “Input” 頁面的 “Input Message” 選項卡(參見圖 44)。
圖 44. 裝載輸入消息元數據單擊 Load Message Information,以便從所選擇的 Web 服務操作中自動裝載元數據、名稱空間和列。
圖 45. 裝載元數據的同時也裝載輸入列圖 45 中顯示的列是 doGoogleSearch 操作中需要提供給 Google 的實際參數,例如許可鍵(key)、查詢關鍵字(q)和很多其它配置參數。
輸出鏈接的設置類似於輸入鏈接 —— 在它的 Output 頁面的 “Output Message” 選項卡中裝載元數據。如示例 4 的步驟 1 所述,使用一個 XML 輸入 stage 處理響應中的重復元素。該 Web 服務轉換器的輸出鏈接必須進行定制,以輸出響應的整個 SOAP 文檔。在圖 46 中,列 “RS_XML” 包含一個有效 XML 文檔格式的響應:
圖 46. 定制的 “GoogleWST” stage 輸出列步驟 3. 設置 XML 輸入 stage
前面的示例已經討論了 XML 輸入 stage 的配置(參考示例 2 的步驟 2)。這裡惟一的不同在於輸出鏈接的表定義,它不是來自一個導入的 XML 表定義,而是來自 Web 服務輸出表定義,即 “doGoogleSearch_OUT”。在這個表定義中有很多個列,它們分別表示響應消息中定義的每個數據元素。出於測試的目的,本示例只使用其中的一部分列:URL、片段、標題、緩存大小、相關信息、主機名和查詢關鍵字本身。
圖 47. “RS_parsing” XML 輸入 stage 的輸出列注:URL 列被設為 “Key” 列,因為它可以區分返回的每條搜索命中結果。
步驟 4. 創建 DB2 表,並為輸入和輸出設置數據庫 stage
創建一個簡單的查詢表 “S_GOOGLE_Q”,其中僅包含 id 和關鍵字字段,再創建一個名為 “S_GOOGLE_RS” 的結果表,其中包含前面提到的所有響應列:
清單 10. 查詢表和響應表的 DDL
CREATE TABLE S_GOOGLE_Q
(
Q_ID INTEGER
GENERATED ALWAYS AS IDENTITY( START WITH 1, INCREMENT BY 1)
PRIMARY KEY,
KEYWord VARCHAR(255)
);
CREATE TABLE S_GOOGLE_RS
(
R_ID INTEGER
GENERATED ALWAYS AS IDENTITY( START WITH 1, INCREMENT BY 1)
PRIMARY KEY,
URL VARCHAR(255) NOT NULL,
CACHEDSIZE VARCHAR(255) NOT NULL,
HOSTNAME VARCHAR(255) NOT NULL,
RELATEDINFORMATIONPRESENT VARCHAR(255) NOT NULL,
SNIPPET VARCHAR(255) NOT NULL,
TITLE VARCHAR(255) NOT NULL,
SEARCHQUERY VARCHAR(255) NOT NULL
);
為兩個 DB2 表設置兩個 DB2 stage “REQUESTS” 和 “RESULTS”。在 “REQUESTS” DB2 stage 中,列應該包括 doGoogleSearch 操作所需的所有字段。還需從 Web 服務表定義 “doGoogleSearch_IN” 中裝載表定義。
注:如果 SQL 類型列是 “未知的(unknown)”,如 圖 45 所示,那麼必須為其賦予一個常規類型,例如 “VarChar”。
圖 48. “REQUEST” DB2 stage 的輸出列在 SQL 標簽頁中選擇 Enter custom SQL statement,並輸入一個查詢,以便從 “S_GOOGLE_Q” 表提取關鍵字,包括用於 Web 服務操作的其它輸入參數(參見 圖 49)。
圖 49. 使用定制的 SQL 語句准備數據必須使用一個轉換器將 “REQUEST” stage 連接到 “GoogleWST” stage。否則,即使兩個 stage 中的列名完全匹配,該任務也不能開始。這可能是由於 Web 服務表定義中的 “UnKnown” SQL 類型導致的。
圖 50. “COL_mapping” 轉換器設置現在配置 “RESULTS” DB2 stage。這裡只需配置服務器信息和選擇目標表。XML 輸入 stage “RS_parsing” 的表定義中的列名(參見 圖 41)與數據庫表中的列名完全一致。DB2 stage 可以自動將這些列插入到 DB2 表中,因為它使用輸入列的列名來創建插入語句。
步驟 5. 編譯和運行
完成上述設置後,這個任務就可以編譯和運行了。但是,在訪問在線服務之前,在查詢表中應該准備一些關鍵字。例如,使用 3 個關鍵字 “Beijing”、“space shuttle” 和 “iguana”(參見圖 51)。
圖 51. 成功完成 google 搜索在圖 51 中,可以看到有 30 條記錄被插入到結果表中 —— 每個關鍵字 10 條記錄。檢查 “S_GOOGLE_RS” 表,以查看這些數據。
清單 11. 檢查從 google 返回的結果的 SQL
SELECT searchquery, url, hostname FROM S_GOOGLE_RS;
圖 52. 清單 11 中 SQL 的結果
附:使用用戶定義消息調用 Web 服務
有時候,輸入消息非常復雜,或者消息體已經存在。這時,使用表數據作為輸入可能不是最佳解決方案。
Web 服務轉換器支持用戶定義消息,並且可以接收 XML 文檔作為消息體。該特性提供了更多的靈活性。可以選擇適當的方法來准備請求消息,例如手動輸入一個消息文檔,或者使用第三方程序根據數據庫生成復雜的 XML 文檔。
為了展示用戶定義消息的使用,可以稍微修改示例 4 中的任務,使用一個文件夾 stage 將 XML 文件(googleReq.XML)提供給 Web 服務轉換器。新任務如圖 53 所示:
圖 53. 使用用戶定義消息的 Web 服務任務 圖 54. Web 服務轉換器 stage 的用戶定義消息設置結束語
XML 和 Web services 包是強大而方便的工具包。本文通過 4 個示例討論如何根據 DB2 表發布 XML 文檔,如何從 XML 文檔中提取數據,以及如何使用訪問 Web 服務,並給出了關鍵的過程和分析。
DataStage 還提供了很多其它有用的組件,並且允許以直觀的方式組合使用這些組件來構建非常靈活的集成解決方案。
在實踐中,您一定能發現 DataStage 的 XML 和 Web 服務功能以及其它 DataStage 組件的更多有趣的應用。