ODI開發(Oracle Data Integrator)
ODI就是一個導數的工具,用IMP,EXP加個FTP和定時crontab一樣可以實現導數,只不過,odi更加強大,可以實現更多的功能,等你上個項目,當你接口實現不了需求的時候,你就知道要用存儲過程了,odi可以刷新執行,定時執行,不同的庫數據導給同一個庫用來出報表,大致如此,沒有必要扣什麼數據挖掘,除非售前也歸你,向客戶兜售ODI,才需要扯一些什麼數據倉儲,數據挖掘之類的。
oracle的數據加載工具,說白了,就是不同庫,或不同用戶下的數據傳輸工具。上網上下載個操作說明,先在本地安裝一個ODI,熟悉熟悉操作就行了。
主要有三個工具:
1、Topology manager定義物理和邏輯架構,就是配置不同庫的url,sid什麼的。
2、Designer進行數據傳輸的操作(不同庫表數據的傳輸,傳輸方式很多種(牛B之處))
3、Operator查看數據傳輸的結果(傳輸成功,還是失敗,失敗的原因等等)。
事實表和維表
事實表和維表多對一的關係。
比如事實表每條記錄對應一次洗衣粉銷售行爲,其中一個字段爲洗衣粉品牌代碼;而維表中保存唯一的品牌和品牌代碼,兩表通過代碼關聯;這樣就可以從品牌的角度對洗衣粉銷售進行分析。
其實主要的區別我想是:
事實表是記錄你要分析的東西;
維表是你要用來度量你要分析指標的東西;
就是說一個是對象,一個是尺度。
維度:
多維數據集的一種結構特性,是描述事實數據表中的數據的類別(級別)的有組織的層次結構。這些類別通常描述相似成員的集合,用戶要根據它們進行分析。
FS表和F表是怎麼產生的?
不是ODS層導過來的,是自己手動創建的。
ETL層中:(ODI相當於一個ETL工具)
ODS:直接從數據源表導入所有數據
SDE:產生FS事實表,FS表從其他表中獲取數據,用視圖實現
SIL:根據FS表和其他與維度相關的表產生F維表
處理完後的數據會形成 DW數據倉庫
ODS層接口,主要是完成從各業務源系統到ODS的數據抽取和集成,該過程的原則是儘量保持ODS層的表結構和數據與各業務源系統的表結構和數據一致。
SDE層,是完成從ODS的數據導到數據倉庫DW的表的提前步驟。從ODS的數據到DW前,都會在先加載到SDE層的臨時表,然後在SIL層的時候再導入DW表。
SIL層將數據從SDE臨時表裏加載到DW表,其中事實表在SIL過程中,需要把對應的維度字段轉換成維表生成的代理鍵。
(一下過程不涉及SDE和SIL)
創建主資料庫->創建工作資料庫(->創建源數據庫和目標數據庫)->創建數據服務器(在物理體系結構模塊下)->創建物理方案->創建邏輯方案(可單獨創建或者創建物理方案時自動創建)->創建表->創建模型->逆向工程模型->創建項目->導入知識模塊->創建接口->映射、快速編輯、流(上下文Global)->執行
這其中會涉及到ODI的操作,先由設置物理層和邏輯層,物理層是和數據源的JDBC URL關聯,邏輯層和物理層一一對應其命名一般都保持一致,轉到模型新建模型,每個模型和一個邏輯層關聯,新建反向表,反向表是不含數據的表結構,反向表弄好後轉到項目,新建文件和接口,再就是在關係圖中將源表和目標表映射起來,這些表需要從模型中拖來再在流中選擇目標表選擇 IKM SQL control append 將truncate設爲是。建立好接口後執行接口將數據跑到目標表中。整個過程完成。詳見10GODI\Oracle Data Integrator.doc和11GODI\浙江電子口岸BI項目_ODI操作手冊.doc ODI\Oracle__Data_Integrator的使用教程.doc。
逆向工程的實質就是通過剛纔建立的邏輯和物理方案連接到數據庫,將源表和目標表的表結構等信息(源數據)導入到模型中。
只導入了源表的結構信息,源表數據是怎麼通過執行接口就遷移到了目標數據表中呢???
源表通過邏輯架構遷移到了目標數據表中,一個模型中會有一個對應的邏輯架構
通常來說一個接口的遷移過程中,應該至少包含LKM和IKM知識模塊,LKM負責將數據從源表裝載至臨時區域,IKM負責將數據從臨時區域再整合進入目標表。
增量過濾器
>=TO_DATE('#BI_CLAIM_LAST_EXTRACT_DATE_VAR','YYYY-MM-DD')
WID
一般由對應表的序列的nextval值
ODI常見錯誤
1. 缺少某個字段,會提示某個字段不存在
2. LKM選擇問題修改後刪掉同義詞,會提示數據庫連接出錯(ORA-02019: connection description for remotedatabase not found)
3. FULL表中TRUNCATE屬性設置爲是;FLOW CONTROL設置爲否,否則會在delete previous出錯
4. name isalready used by an existing object,刪除和表名相同的同義詞
5. invalidrelational operator,過濾器裏面缺少條件或者符號(>=)
6. 0 : 08S01: com.microsoft.sqlserver.jdbc.SQLServerException:不支持此服務器版本。目標服務器必須是 SQL Server 2000或更高版本。原因是字段爲空?
7. 2287 :42000 : java.sql.SQLException: ORA-02287: sequence number not allowed here
8. 936 :42000 : java.sql.SQLException: ORA-00936: missing expression
是因爲缺少主鍵
9. 942 :42000 : java.sql.SQLException: ORA-00942: table or view does not exist
錯誤原因是創建表出錯,找到建表的步驟即找到第二步,查看執行,發現錯誤原因如下
10. 當有很大的數據量時將下面策略設置爲NONE可加快速度
11. 1747 :42000 : java.sql.SQLException: ORA-01747: invalid user.table.column,table.column, or column specification
IKM的選擇問題
12. 接口執行錯誤
原因是開啓了 FLOW_CONTROL
13. LKM SQL to Oracle 會創建臨時表所以慢,DBlinkto Oracle 不創建臨時表所以快。
14. 0 : 08S01 :com.microsoft.sqlserver.jdbc.SQLServerException: 通過端口 1433 連接到主機172.18.84.32 的 TCP/IP 連接失敗。錯誤:“connect timed out。請驗證連接屬性。確保 SQL Server 的實例正在主機上運行,且在此端口接受 TCP/IP 連接,還要確保防火牆沒有阻止到此端口的 TCP 連接。”。
原因連接SqlServer數據庫出錯。
15. 911 : 42000 :java.sql.SQLException: ORA-00911: invalid character
KM中多了一個分號,KM每一句不需要分號。
16. 1400 : 23000 :java.sql.SQLException: ORA-01400: cannot insert NULL into("EDW"."DW_SUPPLIER_COUNT_F"."SUPPLIER_WID")
籠統上wid不要設置成not null也可能是其他原因造成的
17. 12170 : 66000 :java.sql.SQLException: ORA-12170: TNS:Connect timeout occurred
資源被搶佔了