技术标签: MaxCompute SQL
本文介绍使用INSERT OVERWRITE和INSERT INTO两种命令更新表数据,主要内容包括:
INSERT INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2,...)][(co1name1,colname2,...)]
[VALUES (col1_value,col2_value,...),(col1_value,col2_value,...),...]
,
)分隔。此列值必须为常量,列值未指定时,缺省为NULL。
注意:通过VALUES
写入DATETIME、TIMESTAMP类型数据时,需要在VALUES
中指定类型名称,如下所示。
insert into table srcp (p='abc') values (datetime'2017-11-11 00:00:00',timestamp'2017-11-11 00:00:00.123456789');
1. 特定分区内插入数据:
insert into table sale_detail
partition (sale_date='202003', region='hangzhou')
values ('unique', 'user1', 1000),
('adidas', 'user2', 2000),
('zara', 'user3', 1500),
('veromoda', 'user1', 2000),
('nike', 'user4', 1000),
('ur', 'user2', 1400),
('ochirly', 'user1', 2000),
('lily', 'user3', 3000),
('onemore', "user2", 1200);
查询插入数据结果如下:
shop_name customer_id total_price sale_date region
+----------+------------+------------+----------+-------+
unique user1 1000.0 202003 hangzhou
adidas user2 2000.0 202003 hangzhou
zara user3 1500.0 202003 hangzhou
veromoda user1 2000.0 202003 hangzhou
nike user4 1000.0 202003 hangzhou
ur user2 1400.0 202003 hangzhou
ochirly user1 2000.0 202003 hangzhou
lily user3 3000.0 202003 hangzhou
onemore user2 1200.0 202003 hangzhou
2. 非特定分区插入数据:
insert into table sale_detail
partition (sale_date, region)
(shop_name, customer_id, total_price, sale_date, region)
values
('unique', 'user1', 1000, '202001', 'shanghai'),
('adidas', 'user2', 2000, '202001', 'shanghai'),
('zara', 'user3', 1500, '202001', 'shanghai');
查询插入结果:
shop_name customer_id total_price sale_date region
+----------+------------+------------+----------+-------+
unique user1 1000.0 202001 shanghai
adidas user2 2000.0 202001 shanghai
zara user3 1500.0 202001 shanghai
VALUES TABLE并不仅限于在INSERT
语句中使用,任何DML语句都可以使用。VALUES TABLE功能的使用方式如下:
下例中的values (…), (…) t(a, b)
相当于定义了一个名为t
,列为a
、b
,类型分别为STRING、BIGINT的表。列的类型需从VALUES列表中推导。
使用示例:
--删除已存在的表srcp。
drop table if exists srcp;
--创建分区表srcp。
create table if not exists srcp (key string,value bigint) partitioned by (p string);
--为表srcp中插入数据。
insert into table srcp partition (p) select concat(a,b), length(a)+length(b),'20170102' from values ('d',4),('e',5),('f',6) t(a,b);
--查询表srcp。
select * from srcp where p='20170102';
+-----+------------+---+
| key | value | p |
+-----+------------+---+
| d4 | 2 | 20170102 |
| e5 | 2 | 20170102 |
| f6 | 2 | 20170102 |
+-----+------------+---
在MaxCompute SQL处理数据的过程中,INSERT OVERWRITE/INTO
用于将计算的结果保存目标表中。
INSERT INTO
到Hash Clustering表。如果您需要插入少量测试数据,可以配合VALUES语句使用。INSERT OVERWRITE
不支持指定插入列的功能,暂时只能用INSERT INTO
。INSERT OVERWRITE|INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] [(col1,col2 ...)]
select_statement
FROM from_statement;
使用示例:
1. 计算sale_detail
表中不同地区的销售额存入表sale_detail_insert中:
-- 创建目标表sale_detail_insert
create table sale_detail_insert like sale_detail;
-- 给目标表增加分区
alter table sale_detail_insert add partition (
sale_date='201912',
region='guangzhou'
);
-- 从源表sale_detail中取出数据插入目标表sale_detail_insert
insert overwrite table sale_detail_insert
partition (sale_date='201912', region='guangzhou')
select shop_name, customer_id, total_price
from sale_detail where region='beijing';
-- 查询插入的数据
select * from sale_detail_insert where region='guangzhou' and sale_date='201912';
查询插入的结果如下:
shop_name customer_id total_price sale_date region
+----------+------------+------------+----------+-------+
unique user1 1000.0 201912 guangzhou
adidas user2 2000.0 201912 guangzhou
zara user3 1500.0 201912 guangzhou
veromoda user1 2000.0 201912 guangzhou
nike user4 1000.0 201912 guangzhou
ur user2 1400.0 201912 guangzhou
ochirly user1 2000.0 201912 guangzhou
lily user3 3000.0 201912 guangzhou
onemore user2 1200.0 201912 guangzhou
2. 源表与目标表的对应关系依赖于在select
子句中列的顺序,而不是表与表之间列名的对应关系。例如如下语句:
insert overwrite table sale_detail_insert partition (sale_date='2018', region='china')
select customer_id, shop_name, total_price from sale_detail;
此时,会将sale_detail.customer_id
的数据插入sale_detail_insert.shop_name
,将sale_detail.shop_name
的数据插入sale_detail_insert.customer_id
。
3. 向某个分区插入数据时,分区列不允许出现在select
列表中。下面语句报错返回,sale_date,region
为分区列,不允许出现在静态分区的insert语句中。
insert overwrite table sale_detail_insert partition (sale_date='2013', region='china')
select shop_name, customer_id, total_price, sale_date, region from sale_detail;
4. partition
的值只能是常量,不可以出现表达式。以下为错误用法。
insert overwrite table sale_detail_insert partition (sale_date=datepart('2016-09-18 01:10:00', 'yyyy') , region='china')
select shop_name, customer_id, total_price from sale_detail;
如果您需要更新表数据到动态分区,请注意以下事项:
insert into partition
时,如果分区不存在,会自动创建分区。insert into partition
作业并发时,如果分区不存在,会自动创建分区,但只会成功创建一个分区。MaxCompute SQL支持在一个语句中将数据插入不同的目标表或者分区中实现多路输出。
命令格式
FROM from_statement
INSERT OVERWRITE | INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)]
select_statement1 [FROM from_statement]
[INSERT OVERWRITE | INTO TABLE tablename2 [PARTITION (partcol1=val3, partcol2=val4 ...)]
select_statement2 [FROM from_statement]]
使用示例:
1. 将表sale_detail的数据插入到sale_detail_multi里的202003年及202004年中hangzhou和beijing的销售记录中:
-- 创建表sale_detail_multi
create table sale_detail_multi like sale_detail;
-- 开启全表扫描,仅此session有效
set odps.sql.allow.fullscan=ture;
-- 将表sale_detail中的数据插入到表sale_detail_multi
from sale_detail
insert overwrite table sale_detail_multi partition (sale_date='202003', region='hangzhou')
select shop_name, customer_id, total_price where region='hangzhou'
insert overwrite table sale_detail_multi partition (sale_date='202004', region='beijing')
select shop_name, customer_id, total_price where region='beijing';
select * from sale_detail_multi;
查询插入的数据如下:
shop_name customer_id total_price sale_date region
+----------+------------+------------+----------+-------+
unique user1 1000.0 202003 hangzhou
adidas user2 2000.0 202003 hangzhou
zara user3 1500.0 202003 hangzhou
veromoda user1 2000.0 202003 hangzhou
nike user4 1000.0 202003 hangzhou
ur user2 1400.0 202003 hangzhou
ochirly user1 2000.0 202003 hangzhou
lily user3 3000.0 202003 hangzhou
onemore user2 1200.0 202003 hangzhou
unique user1 1000.0 202004 beijing
adidas user2 2000.0 202004 beijing
zara user3 1500.0 202004 beijing
veromoda user1 2000.0 202004 beijing
nike user4 1000.0 202004 beijing
ur user2 1400.0 202004 beijing
ochirly user1 2000.0 202004 beijing
lily user3 3000.0 202004 beijing
onemore user2 1200.0 202004 beijing
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;
3. 如果同一张表的不同分区,同时有insert overwrite和insert into操作,如下语句则报错返回:
from sale_detail
insert overwrite table sale_detail_multi partition (sale_date='2010', region='china' )
select shop_name, customer_id, total_price
insert into table sale_detail_multi partition (sale_date='2011', region='china' )
select shop_name, customer_id, total_price;
在使用INSERT OVERWRITE语句将数据插入到分区表时,MaxCompute提供了如下两种方式:
INSERT OVERWRITE|INTO TABLE tablename PARTITION (partcol1, partcol2 ...)
select_statement FROM from_statement;
使用示例:
示例1:将源表中的数据插入到目标表中。在SQL运行之前,无法得知会产生哪些分区。只有在语句运行结束后,才能通过region字段产生的值确定产生的分区。
-- 创建目标表total_revenues
create table total_revenues (revenue bigint) partitioned by (region string);
-- 将源表sale_detail中的数据插入到目标表total_revenues
-- MaxCompute 2.0 支持total_price的自动类型转换,这里MaxCompute 1.0不支持
insert overwrite table total_revenues partition (region)
select cast(total_price as bigint) as revenue, region from sale_detail where region='hangzhou';
select * from total_revenues;
插入数据查询结果如下:
revenue region
+--------+-------+
1000 hangzhou
2000 hangzhou
1500 hangzhou
2000 hangzhou
1000 hangzhou
1400 hangzhou
2000 hangzhou
3000 hangzhou
1200 hangzhou
示例2:将源表中的数据插入到目标表中。多级分区,指定一级分区sale_date。
insert overwrite table sale_detail_dypart partition (sale_date='2013', region)
select shop_name,customer_id,total_price,region from sale_detail;
示例3:动态分区插入时,动态分区列必须在SELECT列表中,否则会执行失败,例如下面语句。
insert overwrite table sale_detail_dypart partition (sale_date='2013', region)
select shop_name,customer_id,total_price from sale_detail;
示例4:动态分区插入时,不能仅指定低级子分区,而动态插入高级分区,否则会执行失败,例如下面语句。
insert overwrite table sales partition (region='china', sale_date)
select shop_name,customer_id,total_price,sale_date from sale_detail;
文章浏览阅读1.1k次。贝塞尔曲线算法之JS获取点贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。这个一阶贝塞尔曲线绘制过程,黑点按百分比t从P0->P1移动,看不出什么呢~ 那继续看后面的图这个是二阶贝塞尔曲线,从P0->P1有个小绿点按百分比t运动,从P1->P2也有个小绿点按百分比t运动,两个绿点之间也有个小黑点按百分比t运动,这个黑..._bezier-js
文章浏览阅读364次。编译环境:mac os 10.13 xcode:Version 9.2 (9C40b)jdk:1.8.0_151源码版本:android-8.1.0_r1编译过程中我碰到4个问题,前两个的解决方案详细可以看这里Mac 10.12 编译 Android 源码第一个问题是找不到对应的MacOSX.sdk,比如找不到MacOSX10.12.sdk,你需要到 https://github.com/phra..._mac编译android aosp13
文章浏览阅读2k次。对于时间相关的查询我们可以直接用数据库底层命令来做:where_str << "at_moment between ? AND ?"where_vals << date_start << "#{date_end} 23:59:59"where_str << (where_str == "" ? "(now() - '#{days_interval}'::INTERVAL) < at_moment"_rails activerecord 查询条件
文章浏览阅读3.7k次,点赞2次,收藏4次。jdk1.9 Api 英文文档:http://www.pbteach.com/jdkapi/jdk-9_doc-api-enjdk1.9 Api 中文文档:http://www.pbteach.com/jdkapi/jdk-9_doc-api-cnjdk1.8 Api 英文文档:http://www.pbteach.com/jdkapi/jdk-8_doc-api-enjdk1.8 Api ..._jdk8中文chm
文章浏览阅读54次。题目n场比赛,每场比赛对应为一行输出,格式为A队战胜B队,经历过n场比赛,请判断是否有冠军产生。算法由题意得但凡是输过的队伍都不能作为冠军,我们只需要把所有队伍放进一个集合,再把比赛失败的队伍放入另一个集合,当全部比赛结束后,比较两个集合的大小,如果A-B=1,说明已经产生冠军了,如果=0则没有冠军,如果>1则说明冠军还未产生。数据结构放入set中进行代码#include<iostream>#include<string>#include<set>_hdu2094 为什么集合a-集合b能判断是否产生
文章浏览阅读599次。1、stroll函数:(将字符串转换为长整型)可以转换任何进制 第一个参数:字符串开始地址; 第二个参数:二级指针,返回字符串解析时停下来的位置 第三个参数:x进制int main(){ const char* arr = "100!"; int flg = strtol(arr, NULL, 8);//将100转换为8进制 printf("%d\n", flg); return 0;}..._stroll函数
文章浏览阅读698次,点赞4次,收藏6次。用 Seaborn 绘制统计型数据可视图Seaborn 是基于 matplotlib 开发的高阶Python 数据可视图库,用于绘制优雅、美观的统计图形。使用下列别名导入该库(一般取别名为sns):import matplotlib.pyplot as pltimport seaborn as sns使用 Seaborn 创建图形的基本步骤:1.准备数据2.设定画布外观3.使用 Seaborn 绘图4.自定义图形import matplotlib.pyplot as plt_plt.savefig() urlopenerror
文章浏览阅读127次。前言现实就是,99%的职业,年龄增大后都没前途。没前途是绝大多数普通人的宿命,有前途的人也用不着等到老。有没有前途已然不重要,无论做哪一行,健康的心态永远是首位。从我个人的角度写写30多岁码工的感受:的确是受年龄压力开始增大了。比如二十多岁的小年轻,可能什么都懂,对组里的东西很熟悉。有时候我也怀疑自己是不是智商不够,是不是自学能力太差,是不是基础不行,别人是不是都玩命加班,你知道30多岁的人那种危机感。Java基础知识点Jvm相关Java内存结构及分区Java对象的创建、存储及访问Java判_android hook broadcast
文章浏览阅读1k次。tf.image.resize_images(image, (w, h), method):image表示需要改变此存的图像,第二个参数改变之后图像的大小,method用于表示改变图像过程用的差值方法。0:双线性差值。1:最近邻居法。2:双三次插值法。3:面积插值法。tf.layers.conv2d_transpose https://blog.csdn.net/ningning52107/..._tf.image.resize_images()
文章浏览阅读8.9k次。原来用的环境是php5.5-ts,但今天因一个项目需要使用到php7.0-nts的环境,所以只好现在本地配置个工作环境,用的php7.0-nts环境,发现页面始终报No input file specified.问题。 php中ts和nts区别:ts(Thread-Safety)即线程安全,多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到..._thinkphp5 nginx配置 宝塔 no input file specified.
文章浏览阅读9.9k次,点赞41次,收藏360次。Java实现简单的增删改查小项目_java编程实现简单超市管理
文章浏览阅读8.8k次,点赞9次,收藏93次。电路设计以及PCB制作中,经常碰见电源符号:VCC、VDD、VEE、VSS、VBAT一、解释VCC:C=circuit 表示电路的意思, 即接入电路的电压 VDD:D=device 表示器件的意思, 即器件内部的工作电压; VSS:S=series 表示公共连接的意思,通常指电路公共接地端电压 VEE:负电压供电;场效应管的源极(S) VBAT:当使用电池或其他电源连接到VBAT脚上时,当VDD 断电时,可以保存备份寄存器的内容和维持RTC的功能。如果应用中没有使用外部电池,VBAT引脚应接到_芯片供电角vdd