1. 程式人生 > >我對ORACLE BI 的ETL的一些總結(原)

我對ORACLE BI 的ETL的一些總結(原)

資料倉庫中的ETL詳細的分為四個階段:提取,傳輸,轉換,裝載。我先簡單的介紹一下提取和傳輸的分類和方法:
一:提取
   提取可以分為邏輯提取,和物理提取。
   1:邏輯提取按照規模分為:完全提取,增量提取。
 完全提取簡單運用EXP或者全表掃描可以完成。
      增量提取是提取相比上次提取增加了的資料,也可以是按照資料產生時間PATITION了的一個分割槽等等。Oracle's Change Data Capture 是ORACLE為增量提取提供的一個完備的機制。可以運用基於Timestamps,Partitioning,Triggers的增量提取。
   2:物理提取又分為線上提取和離線提取。
      線上提取是直接連線資料庫,訪問資料庫的表,然後提取。
      離線提取是指提取資料庫以外的一些檔案,比如Flat file,Dump file,Redo or Archive log.Transportable tablespaces。等等。

提取的方法很多。可以用sqlplus把資料提取到FLAT file中,也可以用exp,甚至可以直接用oracle net處理。比如:
CREATE TABLE country_city AS SELECT distinct t1.country_name, t2.cust_city
FROM [email protected]_db t1, [email protected]_db t2
WHERE t1.country_id = t2.country_id 
AND t1.country_name='United States of America';

所有提取不是ETL中困難的過程。

二:傳輸
通過FTP或者Transportable Tablespaces(建立一個臨時的表空間用來存提取出來需要傳輸的資料,然後EXP這個表空間)

三:轉換
轉換的過程是ETL最複雜,處理時間最長的過程。這個過程涉及的ORACLE知識比較多。開發人員需要知道怎樣選擇最有效,最便捷的技術,我將在本文詳細說明。

我理解的轉化過程就是,通過若干個步驟來處理轉化過程中需要處理的每一個問題,而這若干步驟是通過建立若干的臨時表來完成的,後一個步驟建立的臨時表是在前一個步驟建立的臨時表的基礎上建立起來的。這樣一次一次的轉化,最後得到轉化的結果。

1:Transformation Flow
如果你自己涉及轉化的過程,你會想到什麼?首先明確,咱們的目的是什麼,我們有一個STAGING表,我們是要把這個表的資料新增到DW的事實表中,但是不是簡單的新增,這些資料需要按照SCHEMA DESIGN的要求,把所有和維表對應的描述資訊分離到維表中。這是一步,第二,我們需要考慮事實表的主鍵和staging表的主鍵一定有衝突,因為他們不是同一個SEQUENCE生成的。第三步,就是INSERT到事實表。
Transformation Flow就是按照這樣的邏輯來處理的。我們可以寫PL/SQL實現整個功能。
以下這個SQL可以建立一個表,大家一看就能明白它的作用了:
CREATE TABLE temp_sales_step2 NOLOGGING PARALLEL AS SELECT sales_transaction_id,
  product.product_id sales_product_id, sales_customer_id, sales_time_id,
  sales_channel_id, sales_quantity_sold, sales_dollar_amount
FROM  temp_sales_step1, product
WHERE temp_sales_step1.product_name = product.product_name;
解釋一下:
一般,從資料來源過來的staging錶帶有和維表某個欄位相同或者相似的資訊,比如說產品名稱。我們就可以通過產品名稱連結維表和staging表,SQL中WHERE中的連線就是這樣做的。然後就可以把在維表中的產品名稱對應的產品ID找出來,標識成為要插入的事實表中的sales_product_id。然後建立temp表把查詢結果儲存下來。這樣就實現了和維的主外來鍵對接。

這個過程會衍生出一個問題。如果product_name在product中沒有,就需要嗎?大部分情況可能答案是需要的。那就需要做一個驗證操作。咱們看看以下的程式碼:
CREATE TABLE temp_sales_step1_invalid NOLOGGING PARALLEL AS
SELECT * FROM temp_sales_step1 s
WHERE NOT EXISTS (SELECT 1 FROM product p WHERE p.product_name=s.product_name);
這個CTAS statement語句就可以把查詢出的新的SALE記錄。

咱們也可以做左連結:
CREATE TABLE temp_sales_step2 NOLOGGING PARALLEL AS
SELECT sales_transaction_id, product.product_id sales_product_id,
   sales_customer_id, sales_time_id, sales_channel_id, sales_quantity_sold,
   sales_dollar_amount
FROM  temp_sales_step1, product
WHERE temp_sales_step1.upc_code = product.upc_code (+);
把所有在維表中沒有找到product_name的記錄的sales_product_id設定為空。

2:Transformation Mechanisms
   Transformation在oracle大致有三種方法:
   a)使用sql語句
 方法一:
      CREATE TABLE ... AS SELECT (CTAS) 然後INSERT /*+APPEND*/ AS SELECT。
    先按照需求SELECT出來資料然後存在一張臨時表中,然後從臨時表取出然後插入到要load的表中。
    此外(CTAS)方式使用NOLOGGING模式可以提高效能
 方法二:
      Transforming Data Using UPDATE
     你也可以按照你的TRANSFORM規則直接用UPDATE臨時表中的資料。達到轉化的效果。
 方法三:
 Transforming Data Using MERGE
     下面我先以一個例子說明:
 MERGE INTO products t USING products_delta s
 ON (t.prod_id=s.prod_id)
 WHEN MATCHED THEN UPDATE SET
   t.prod_list_price=s.prod_list_price, t.prod_min_price=s.prod_min_price
 WHEN NOT MATCHED THEN INSERT (prod_id, prod_name, prod_desc, prod_subcategory,
   prod_subcategory_desc, prod_category, prod_category_desc, prod_status, 
   prod_list_price, prod_min_price)
 VALUES (s.prod_id, s.prod_name, s.prod_desc, s.prod_subcategory, 
   s.prod_subcategory_desc, s.prod_category, s.prod_category_desc, 
   s.prod_status, s.prod_list_price, s.prod_min_price);
       例子中運用MERGE的好處是:擴充套件維表,因為有一些從外部資料來源來的產品資料可能和DW中的維        表中的產品資料有一些重疊,為了擴充套件維表又保證資料不重複,可以使用MERGE。
      方法四:
 Transforming Data Using Multitable INSERT
      無條件的insert:
 INSERT ALL
    INTO sales VALUES (product_id, customer_id, today, 3, promotion_id,
                      quantity_per_day, amount_per_day)
    INTO costs VALUES (product_id, today, promotion_id, 3,
                      product_cost, product_price)
 SELECT ...FROM..
 有條件的ALL insert:
        INSERT ALL  
        WHEN ...THEN INTO ..TABLE VALUES(...)
   WHEN ...THEN INTO ..TABLE VALUES(...) SELECT ...FROM ...;
      有條件的FRIST insert:
   INSERT FIRST 
   WHEN ...THEN INTO... 
        WHEN ...THEN INTO...
   ELSE INTO ... SELECT...FROM... 
   b)使用PL/SQL
   運用PL/SQL可以處理更加複雜的轉化邏輯,以前我參與的郵政的資料倉庫專案就是直接寫  PL/SQL來完成ETL過程的。

四:裝載
1:using sql*loader
sql*loader是一個很好的從FLAT檔案load資料到DW中來的工具。可以處理非常複雜的LOAD過程。有自己的control file語法
2:External Tables
External Tables是對sql*loader的一個補充,提供了一些高階的功能,它使你像訪問資料庫裡的資料一樣訪問外部源資料。
我有一個文章也對外部表做了一個簡單的介紹:
http://blog.chinaunix.net/u/25176/showart_2036046.html
外部表和普通表有個功能缺陷是外部表不能做DML(UPDATE/INSERT/DELETE)操作,也不能在外部表上建立索引。

相關推薦

ORACLE BIETL一些總結

資料倉庫中的ETL詳細的分為四個階段:提取,傳輸,轉換,裝載。我先簡單的介紹一下提取和傳輸的分類和方法:一:提取   提取可以分為邏輯提取,和物理提取。   1:邏輯提取按照規模分為:完全提取,增量提取。 完全提取簡單運用EXP或者全表掃描可以完成。      增量提取是提

UiAutomator學習的一些總結

學習UiAutomator主要是能掌握基本函式以及adb命令 1.首先環境變數的配置:JAVA_HOME,ANDROID_HOME,ANT_HOME,PATH,CLASSPATH 注意此時要保證JDK的版本跟系統的版本是對應的,即:64位系統下要安裝64位的JDK, 1)J

stm32記憶體理解,檢視以及面試題的一些總結

基礎知識儲備 1、keil中如何調用出map檔案,以及map檔案的作用 我是拿正點原子的標準工程來使用分析。 如何獲得map檔案, 雙擊工程名即可得到map檔案。 2、map檔案包含哪些東西 1.Section CrossReferences:模組、段(入口)

的SQL筆記&一些練習題

eat sid UNC score server 隔離性 回退 sql命令 sql數據庫 Oracle 數據庫使用的端口為:1521在Windows平臺下需保證 Oracle server xe 和 Oraclelistener 服務正常運行才可以連接到數據庫MySQL數據

初學JDBC的一些總結

1、關於JDBC的的個人理解:   JDBC(Java Data Base Connectivity,java 資料庫連線)是用於執行 SQL 語句的 JavaAPI,可以為多種關係型資料庫提供統一的訪問方式,它由一組用 Java 語言編寫的類和介面組成。JDBC 提供了一種基準,據此可以構建更高階的工具和

Oracle資料庫常用操作總結

--oracle cs架構軟體 --客戶端 --tns  --協議 --ip --埠 --資料庫名字 --監聽如果出了問題,先刪除所有監聽,再重建。netca。tns檔案中名字不能重複, --oracle預設自帶兩個管理員使用者 sys system 這兩個使用者在登入時

談談攻讀計算機研究生的看法

跨專業考研階段,給自己的一種勉勵!       就我自己的理解,談談我對讀研和軟體學院的看法,不妥之處一笑了之即可。      如果你有實際開發工作經驗,感覺自己的水平和實力進入了一個高原期,迫切需要從理論上提高,那麼計算機學院是唯一選擇。因

Oracle 資料庫基礎知識點總結

 1.資料庫表的完整性  ①實體完整性:靠主鍵來維護,資料唯一且不能為空 ②參照完整性:靠外來鍵來維護,主鍵表無記錄外見表則無法操作資料 ③域完整性:check()約束 not null 約

國內軟體行業的看法

  對於目前國內應用軟體的發展情況,在很多媒體和網站上都有報道,在這裡就不想多說。這裡的軟體情況主要是根據個人觀點,談一下自己的想法。相對來說國內的應用軟體是比較難做的,而且質量不高,問題主要有幾個方面,第一個方面是國內客戶對軟體的認知,第二個是國內的人文體制,第三個是國內的

關於雙目立體視覺的一些總結

https://blog.csdn.net/u014629875/article/details/51340144上一篇只是對於雙目立體視覺做了一個簡單的介紹,這裡就我在做這個的時候碰到的一些問題做一個梳理。1.首先要糾正一下之前一個錯誤:cvRemap函式只接受灰度圖。其實這個函式要求src與dst大小格式

關於雙目立體視覺的一些總結

https://blog.csdn.net/u014629875/article/details/51227534由於專案和畢設的需要,最近在做一些立體視覺的東西,總算是把立體視覺建立起來了,中途查了很多相關資料,這裡做一個總結。1.簡介:雙目視覺是模擬人類視覺原理,使用計算機被動感知距離的方

關於spark利用jar包跑job的一些總結

分別利用eclipse和IDEA打jar包 用eclipse打包: 用eclipse打包最終還是不能放在spark上用,如果是需要解決問題的,可以直接跳到IDEA部分,這裡只介紹一些eclipse的過程,以及最後的問題(如果有能指出問題所在的小夥伴,求指

國內軟體行業的看法

  1.軟體高效贏利模式 那麼在這種環境下,如何通過軟體來最大程度化的贏利呢,最簡單的想法就是兩點,論述如下: 1.1.程式碼複用 在前面也有提到,軟體的成本主要是在其開發階段,一旦開發成功,後續的成本是非常之少的,所有的軟體都可以通過拷貝來解決。如果能對軟體的程式碼進行復用

Hibernate 一對多 多一 例項 及一些 問題1插入及查詢

 Clazz.java /** * */ package com.wonders.task.sample.bo; import java.util.Set; import javax.persistence.CascadeType; import javax.p

Oracle資料庫常見錯誤總結

實際專案實踐過程中,經常會遇到一些形如“ORA-XXXX”的Oracle錯誤提示,此時,我們便會開啟百度、Google,搜尋相關技術解決方案。本系列博文的目的就在於,對常見的Oracle錯誤提示進行總結,不斷完善。 ORA-12560 ORA-1

arcgis for android 100.2一些總結

中離線地圖格式:.shp:可編輯、查詢、刪除、更新的向量地圖格式。展示比較慢,可以搭配.tpk一起使用。MPK、TPK、GPK和GCPK分別對應地圖資料包、切片資料包、地理處理工具包以及地理編碼工具包。MPK、TPK、GPK、GCPK需要在ArcMap中製作生成。Map pa

關於 Vue 中 中央事線管理器enentBus的誤解

由於這段時間公司比較閒,就對vue 中的一些模糊的點做了一些加強,突然就想到了常掛在嘴邊兄弟元件傳值 我理解的兄弟元件的傳值是可以路由由傳值的,比如我從http://localhost:8080/login 裡面的值可以傳遞到 http://localhost:8080/home 這個頁面

RxJava總結

-s ble get react ren xtend ima 等待 而是 ---恢復內容開始--- 1、RxJava的作用       RxJava is a Java VM implementation of Reactive Extensions: a library

.net Kafka.Client多個Consumer GroupTopic消費不能完全覆蓋研究總結

eight 分享 stat .com ima topic consumer 閱讀 padding 依據Partition和Consumer的Rebalance策略,找到Kafka.Client Rebalance代碼塊,還原本地環境,跟蹤調試,發現自定義Consumer G

Oracle中Merge into用法總結 轉載

字符 存在 sin 刪除 ron mic 但是 多個 前段時間 Oracle中Merge into用法總結 (出處:http://www.cnblogs.com/dongsheng/p/4384754.html) 起因:   前段時間,因為涉及到一張表的大數據操作,要同時