MaxCompute SQL支持您在一条SQL语句中通过insert into
或insert overwrite
操作将数据插入不同的目标表或者分区中,实现多路输出。
前提条件
执行操作前需要具备目标表的修改权限(Alter)及源表的元信息读取权限(Describe)。授权操作请参见MaxCompute权限。
功能介绍
在使用MaxCompute SQL处理数据时,multi insert
操作可以将数据插入不同的目标表或分区中,实现多路输出。
使用限制
multi insert
操作的使用限制如下:
单条
multi insert
语句中最多可以写255路输出。超过255路,会上报语法错误。单条
multi insert
语句中,对于分区表,同一个目标分区不允许出现多次。单条
multi insert
语句中,对于非分区表,不允许多次INSERT OVERWRITE数据至同一个表,也不允许INSERT OVERWRITE和INSERT INTO数据至同一个表,但是可以多次INSERT INTO数据至同一个表。
命令格式
from <from_statement>
insert overwrite | into table <table_name1> [partition (<pt_spec1>)]
<select_statement1>
insert overwrite | into table <table_name2> [partition (<pt_spec2>)]
<select_statement2>
...;
from_statement:必填。
from
子句,代表数据来源。例如,源表名称。table_name:必填。需要插入数据的目标表名称。
pt_spec:可选。需要插入数据的目标分区信息,此参数不允许使用函数等表达式,只能是常量。格式为
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)
。插入多个分区时,例如pt_spec1和pt_spec2,目标分区不允许出现多次,即pt_spec1和pt_spec2的分区信息不相同。select_statement:必填。
select
子句,从源表中查询需要插入的数据。
使用示例
示例1:将表sale_detail的数据插入到表sale_detail_multi的2010年及2011年中国的销售记录中。命令示例如下:
--创建表sale_detail_multi。 create table sale_detail_multi like sale_detail; --开启全表扫描,仅此Session有效。将表sale_detail中的数据插入到表sale_detail_multi。 set odps.sql.allow.fullscan=true; from sale_detail insert overwrite table sale_detail_multi partition (sale_date='2010', region='china' ) select shop_name, customer_id, total_price insert overwrite table sale_detail_multi partition (sale_date='2011', region='china' ) select shop_name, customer_id, total_price; --开启全表扫描,仅此Session有效。执行select语句查看表sale_detail_multi中的数据。 set odps.sql.allow.fullscan=true; select * from sale_detail_multi; --返回结果。 +------------+-------------+-------------+------------+------------+ | shop_name | customer_id | total_price | sale_date | region | +------------+-------------+-------------+------------+------------+ | s1 | c1 | 100.1 | 2010 | china | | s2 | c2 | 100.2 | 2010 | china | | s3 | c3 | 100.3 | 2010 | china | | s1 | c1 | 100.1 | 2011 | china | | s2 | c2 | 100.2 | 2011 | china | | s3 | c3 | 100.3 | 2011 | china | +------------+-------------+-------------+------------+------------+
示例2:同一目标分区不允许出现多次,否则会返回报错。错误命令示例如下:
from sale_detail insert overwrite table sale_detail_multi partition (sale_date='2010', region='china' ) select shop_name, customer_id, total_price insert overwrite table sale_detail_multi partition (sale_date='2010', region='china' ) select shop_name, customer_id, total_price;