基于阿里巴巴OneData方法論最佳實踐,ODS層存放您從業務系統獲取的最原始的數據,是其他上層數據的源數據。業務數據系統中的數據通常為長期累積的、非常細節的數據,且訪問頻率很高,是面向應用的數據。
數據引入層表設計
本教程中,在ODS層主要包括的數據有:交易系統訂單詳情、用戶信息詳情、商品詳情等。這些數據未經處理,是最原始的數據。在邏輯層面上,這些數據都是以二維表的形式存儲。嚴格地說,雖然ODS層不屬于數倉建模的范疇,但是合理地規劃ODS層并做好數據同步也非常重要。本教程中,使用了6張ODS表:
記錄用于拍賣的商品信息:s_auction。
記錄用于正常售賣的商品信息:s_sale。
記錄用戶詳細信息:s_users_extra。
記錄新增的商品成交訂單信息:s_biz_order_delta。
記錄新增的物流訂單信息:s_logistics_order_delta。
記錄新增的支付訂單信息:s_pay_order_delta。
表或字段命名盡量和業務系統保持一致,但是需要通過額外的標識來區分增量和全量表。在Dataphin中,di后綴的事實模型為增量表(事務型),df后綴的事實模型為全量表(周期快照型)。
命名時需要特別注意沖突處理。例如,不同業務系統的表可能是同一個名稱,為區分兩個不同的表,您可以將這兩個同名表的來源數據庫名稱作為后綴或前綴。例如,表中某些字段的名稱剛好和關鍵字重名了,可以通過規范定義后綴添加
_col1
解決。
建表示例
通過即席查詢功能,您可以編寫SQL語句創建所需的ODS表。為方便您使用,集中為您提供建表語句如下。
CREATE TABLE IF NOT EXISTS s_auction
(
id STRING COMMENT '商品ID',
title STRING COMMENT '商品名稱',
gmt_modified STRING COMMENT '商品最后修改日期',
price DOUBLE COMMENT '商品成交價格,單位元',
starts STRING COMMENT '商品上架時間',
minimum_bid DOUBLE COMMENT '拍賣商品起拍價,單位元',
duration STRING COMMENT '有效期,銷售周期,單位天',
incrementnum DOUBLE COMMENT '拍賣價格的增價幅度',
city STRING COMMENT '商品所在城市',
prov STRING COMMENT '商品所在省份',
ends STRING COMMENT '銷售結束時間',
quantity BIGINT COMMENT '數量',
stuff_status BIGINT COMMENT '商品新舊程度:0全新 1閑置 2二手',
auction_status BIGINT COMMENT '商品狀態:0正常 1用戶刪除 2下架 3從未上架',
cate_id BIGINT COMMENT '商品類目ID',
cate_name STRING COMMENT '商品類目名稱',
commodity_id BIGINT COMMENT '品類ID',
commodity_name STRING COMMENT '品類名稱',
umid STRING COMMENT '買家umID'
)
COMMENT '商品拍賣ODS'
PARTITIONED BY (ds STRING COMMENT '格式:YYYYMMDD')
LIFECYCLE 400;
CREATE TABLE IF NOT EXISTS s_sale
(
id STRING COMMENT '商品ID',
title STRING COMMENT '商品名稱',
gmt_modified STRING COMMENT '商品最后修改日期',
starts STRING COMMENT '商品上架時間',
price DOUBLE COMMENT '商品價格,單位元',
city STRING COMMENT '商品所在城市',
prov STRING COMMENT '商品所在省份',
quantity BIGINT COMMENT '數量',
stuff_status BIGINT COMMENT '商品新舊程度:0全新 1閑置 2二手',
auction_status BIGINT COMMENT '商品狀態:0正常 1用戶刪除 2下架 3從未上架',
cate_id BIGINT COMMENT '商品類目ID',
cate_name STRING COMMENT '商品類目名稱',
commodity_id BIGINT COMMENT '品類ID',
commodity_name STRING COMMENT '品類名稱',
umid STRING COMMENT '買家umID'
)
COMMENT '商品正常購買ODS'
PARTITIONED BY (ds STRING COMMENT '格式:YYYYMMDD')
LIFECYCLE 400;
CREATE TABLE IF NOT EXISTS s_users_extra
(
id STRING COMMENT '用戶ID',
logincount BIGINT COMMENT '登錄次數',
buyer_goodnum BIGINT COMMENT '作為買家的好評數',
seller_goodnum BIGINT COMMENT '作為賣家的好評數',
level_type BIGINT COMMENT '1 一級店鋪 2 二級店鋪 3 三級店鋪',
promoted_num BIGINT COMMENT '1 A級服務 2 B級服務 3 C級服務',
gmt_create STRING COMMENT '創建時間',
order_id BIGINT COMMENT '訂單ID',
buyer_id BIGINT COMMENT '買家ID',
buyer_nick STRING COMMENT '買家昵稱',
buyer_star_id BIGINT COMMENT '買家星級 ID',
seller_id BIGINT COMMENT '賣家ID',
seller_nick STRING COMMENT '賣家昵稱',
seller_star_id BIGINT COMMENT '賣家星級ID',
shop_id BIGINT COMMENT '店鋪ID',
shop_name STRING COMMENT '店鋪名稱'
)
COMMENT '用戶擴展表'
PARTITIONED BY (ds STRING COMMENT 'yyyymmdd')
LIFECYCLE 400;
CREATE TABLE IF NOT EXISTS s_biz_order_delta
(
biz_order_id STRING COMMENT '訂單ID',
pay_order_id STRING COMMENT '支付訂單ID',
logistics_order_id STRING COMMENT '物流訂單ID',
buyer_nick STRING COMMENT '買家昵稱',
buyer_id STRING COMMENT '買家ID',
seller_nick STRING COMMENT '賣家昵稱',
seller_id STRING COMMENT '賣家ID',
auction_id STRING COMMENT '商品ID',
auction_title STRING COMMENT '商品標題',
auction_price DOUBLE COMMENT '商品價格',
buy_amount BIGINT COMMENT '購買數量',
buy_fee BIGINT COMMENT '購買金額',
pay_status BIGINT COMMENT '支付狀態:1未付款 2已付款 3已退款',
logistics_id BIGINT COMMENT '物流訂單ID',
mord_cod_status BIGINT COMMENT '物流狀態:0初始狀態 1接單成功 2接單超時 3攬收成功 4攬收失敗 5簽收成功 6簽收失敗 7用戶取消物流訂單',
status BIGINT COMMENT '狀態:0訂單正常 1訂單不可見',
sub_biz_type BIGINT COMMENT '業務類型:1拍賣 2購買',
end_time STRING COMMENT '交易結束時間',
shop_id BIGINT COMMENT '店鋪ID'
)
COMMENT '交易成功訂單日增量表'
PARTITIONED BY (ds STRING COMMENT 'yyyymmdd')
LIFECYCLE 7200;
CREATE TABLE IF NOT EXISTS s_logistics_order_delta
(
logistics_order_id STRING COMMENT '物流訂單ID ',
post_fee DOUBLE COMMENT '物流費用',
address STRING COMMENT '收貨地址',
full_name STRING COMMENT '收貨人全名',
mobile_phone STRING COMMENT '移動電話',
prov STRING COMMENT '省份',
prov_code STRING COMMENT '省份ID',
city STRING COMMENT '市',
city_code STRING COMMENT '城市ID',
logistics_status BIGINT COMMENT '物流狀態:1-未發貨 2-已發貨 3-已收貨 4-已退貨 5-配貨中',
consign_time STRING COMMENT '發貨時間',
gmt_create STRING COMMENT '訂單創建時間',
shipping BIGINT COMMENT '發貨方式:1-平郵 2-快遞 3-EMS',
seller_id STRING COMMENT '賣家ID',
buyer_id STRING COMMENT '買家ID'
)
COMMENT '交易物流訂單日增量表'
PARTITIONED BY (ds STRING COMMENT '日期')
LIFECYCLE 7200;
CREATE TABLE IF NOT EXISTS s_pay_order_delta
(
pay_order_id STRING COMMENT '支付訂單ID',
total_fee DOUBLE COMMENT '應支付總金額(數量*單價)',
seller_id STRING COMMENT '賣家ID',
buyer_id STRING COMMENT '買家iD',
pay_status BIGINT COMMENT '支付狀態:1等待買家付款 2等待賣家發貨 3交易成功',
pay_time STRING COMMENT '付款時間',
gmt_create STRING COMMENT '訂單創建時間',
refund_fee DOUBLE COMMENT '退款金額(包含運費)',
confirm_paid_fee DOUBLE COMMENT '已經確認收貨的金額'
)
COMMENT '交易支付訂單增量表'
PARTITIONED BY (ds STRING COMMENT '日期')
LIFECYCLE 7200;
數據同步加載與處理
ODS的數據需要由各數據源系統同步、存儲到MaxCompute,才能用于進一步的數據開發。本教程建議您使用Dataphin的數據集成功能完成數據同步。在使用數據引入功能的過程中,建議您遵循以下規范:
一個系統的源表只允許同步一次到MaxCompute,保持表結構的一致性。
數據引入支持全量數據同步、實時增量數據同步(分鐘或小時調度實現)兩種同步方式。
ODS層的表建議以統計日期及時間分區表的方式存儲,便于管理數據的存儲成本和策略控制,Dataphin中默認時間分區的名字為ds。
數據引入支持手動調整源表和目標表的同步字段。
如果源表字段在目標表中不存在,用戶需手動添加目標字段,或刪除源表字段。
如果源表字段與目標表字段不匹配,用戶需先刪除目標字段,然后重新添加與之匹配的字段。