===========================================
對象名稱可以長到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中也可以使用, 還有很多函數都差不多.