Vertica系列:從一些細節看Vertica為什么是一個優秀的數據倉庫平台



===========================================
對象名稱可以長到128字符
===========================================
1. Vertica 中字段名/表名/視圖名/projection名/schema名, 名稱最長達128個字節, 所以我們不用費盡心思縮寫表名和字段名.
2. Vertica中的名稱在catalog系統表能區分出大小寫, 但使用的時候是大小寫不銘感的.

在Oracle中, 因為表名不能超過30個字符, 所以單詞必須要用縮寫, 縮寫單詞之間用下划線分割, 以便提升辨識度. 但放到數據倉庫場景中, 因為數據倉庫不像單一業務系統, 它一定會包含很多種業務的數據, 用30個字符起表名其實是很難的, 經常碰到用了下划線名字就超過30個字符, 不用下划線可讀性又不好. Vertica沒這個問題.

推薦的表名的命名規范為:
產品線_表類型_業務名_[特殊后綴]
產品線: 可以理解為產品線或BU
表類型有: Dim/Fact/Agg/Cfg/Stg/Med
特殊后綴, 一般是Err/Tmp/Bak或Bak_20171231這樣, Err是某個表錯誤數據表, Tmp是臨時表, Bak表是備份表(往往需要加上備份日期)
比如: CRM_Fact_UserCall_Tmp

===========================================
字段可設置default值, Default值支持 Sequence和函數
===========================================
1. 每個表都可增加一個 DWH_ID 代理主鍵字段, 可以使用sequence作為每行的unique字段, 而且是遞增的, 這將對於后續的數據清洗非常有幫助. 另外該字段也非常適合作為分段字段.
2. 每個表都可增加一個 DWH_ITime/DWH_UTime 時間字段, 可以使用 sysdate() 作為其缺省值
3. 因為 null 取值的SQL查詢寫法比較特殊, 不能用等於或不等於比較符, 為了簡化后期的分析的難度, 字段如果能設置not null就盡量設置, 配合default約束.

create sequence CRM.CRM_Fact_UserCall_Seq;
create table CRM.CRM_Fact_UserCall(
UserId varchar(50)
,CallType varchar(30) NOT NULL DEFAULT 'OnSite'
,DWH_ID numeric(38,0) DEFAULT nextval('CRM.CRM_Fact_UserCall_Seq')  
,DWH_ITime timestamp DEFAULT  sysdate() 
,DWH_UTime timestamp DEFAULT  sysdate() 
) 
order by UserId
SEGMENTED BY HASH(DWH_ID) ALL NODES  
;


===========================================
Vertica 強大的數據清洗能力
===========================================
實際項目中, 會遇到各類數據問題, 簡單的問題可以用 like /ilike /case when 處理, 但復雜一些的問題最好是用正則表達式. 下面是常用的幾個正則函數:
regexp_substr()
regexp_not_like()
regexp_like()
regexp_replace()


===========================================
簡單夠用的事務
===========================================
在ETL實現過程中, 經常會使用Delete+Insert的方式來更新數據, 如果維度表用了這種更新方式, 一旦事實表跑批正好是在維度表Delete和Insert動作之間, 就會出現數據質量問題. Vertica 支持事務操作.

不同的客戶端工具, 有着不同的缺省的提交模式:
1. vsql 默認是關閉自動事務提交的.
2. 采用vertica jdbc/odbc連接的客戶端工具, 默認開啟自動事務提交的.

我們可以也可以手工修改事務提交模式:

    SET SESSION AUTOCOMMIT TO OFF;
    SET SESSION AUTOCOMMIT TO ON;
    begin transaction ;   --*甚至begin transaction都可以省略
    .... 
    end; -- 這里的 end 也可以用 commit 代替;

    -- 在關閉 AUTOCOMMIT 下, 回滾事務的方法
    begin transaction --*甚至begin transaction都可以省略
    .... 
    rollback; 

 


===========================================
表和字段支持comment
===========================================
SQL代碼加上必要的comment, 對於系統維護幫助很大. 非常推薦為所有的視圖級/表級/字段級加上comment, 這對於大型數倉運維意義重大.

COMMENT ON COLUMN customer_dimension_vmart_node01.customer_name IS 'Last name only';
COMMENT ON TABLE promotion_dimension IS '2011 Promotions';
COMMENT ON VIEW curr_month_ship IS 'Shipping data for the current month';



===========================================
臨時表
===========================================
在ETL過程中經常會用到臨時表, 尤其是Vertica的local 臨時表更是經常使用, 可以加上Order by 子句和 segment 子句.

drop table if exists Tmp_Table;
create local temp table Tmp_Table
on commit preserve rows
as /*+direct*/
select * from table_a 
order by uid  
segmented by hash(uid) all nodes ksafe 1;


===========================================
字段級的 mask 控制機制.
===========================================
數據安全是數倉中重要的一環, 敏感數據在使用的時候往往需要脫敏, Vertica 提供能字段級的mask機制.

CREATE ACCESS POLICY ON customers_table
 FOR COLUMN SSN
    CASE
        WHEN ENABLED_ROLE('manager') THEN SSN
        WHEN ENABLED_ROLE('operator') THEN SUBSTR(SSN, 8, 4)
        ELSE NULL
    END
ENABLE;


===========================================
時間序列語法
===========================================
在很多時候, 我們需要處理時序數據, 比如初始化日期維度表, 比如檢查每分鍾的數據量, 比如補跑堆積的批次, 可以用時序語句構建一個批次的循環記錄集.

SELECT slice_time1 FROM 
(select '20171110'::timestamp date_value from dual  
 union all 
 select '20171120'::timestamp date_value from dual 
) t 
TIMESERIES slice_time1 AS '1 days' OVER(ORDER BY date_value)
order by slice_time1 asc


===========================================
和Oracle的兼容性
===========================================
Vertica 在很多時候都盡量和Oracle保持一致, 比如普通的一個Oracle建表語句, 直接可以在Vertica上執行, 再比如dual偽表在Vertica中也可以使用, 還有很多函數都差不多.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM