ODPS輸出到動態分割槽(DYNAMIC PARTITION)

thamsyangsw發表於2014-11-10
在INSERT OVERWRITE到一張分割槽表時,可以在語句中指定分割槽的值。也可以用另外一種更加靈活的方式,在分割槽中指定一個分割槽列名,但不給出值。
相應的,在SELECT子句中的對應列來提供分割槽的值。
語法格式:
INSERT OVERWRITE TABLE tablename PARTITION (partcol1, partcol2 ...)
select_statement FROM from_statement;

備註:
? 目前,在使用動態分割槽功能的SQL中,在分散式環境下,單個程式最多隻能輸出512個動態分割槽,否則引發執行時異常;
? 在現階段,任意動態分割槽SQL不可以生成超過2000個動態分割槽,否則引發執行時異常;
? 動態生成的分割槽值不可以為NULL,否則會引發異常;
? 如果目標表有多級分割槽,在執行INSERT語句時允許指定部分分割槽為靜態,但是靜態分割槽必須是高階分割槽;



CREATE TABLE total_revenues (revenue BIGINT)
PARTITIONED BY (region STRING);
INSERT OVERWRITE TABLE total_revenues PARTITION(region)
SELECT total_price as revenue, region
FROM sale_detail;

按照這種寫法,在SQL執行之前,是不知道會產生哪些分割槽的,只有在SELECT執行結束後,才能由region欄位產生的值確定會產生哪些分割槽,這也是為什麼叫做”動態分割槽”的原因。



CREATE TABLE sale_detail_dypart LIKE sale_detail;
INSERT OVERWRITE TABLE sale_detail_dypart PARTITION (sale_date, region)
SELECT * FROM sale_detail;
-- 成功返回
INSERT OVERWRITE TABLE sale_detail_dypart PARTITION (sale_date='2013', region)
SELECT shop_name,customer_id,total_price,region FROM sale_detail;
-- 成功返回,多級分割槽,指定一級分割槽
INSERT OVERWRITE TABLE sales PARTITION (region='china', sale_date)
SELECT shop_name,customer_id,total_price,region FROM sale_detail;
-- 失敗返回,不能僅指定低階子分割槽,而動態插入高階分割槽

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26613085/viewspace-1327474/,如需轉載,請註明出處,否則將追究法律責任。

相關文章