在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博客 ” ,链接:https://blog.itpub.net/26613085/viewspace-1327474/
,如需转载,请注明出处,否则将追究法律责任。