Maxcompute-使用values table模拟一个有任意数据的、多行的表进行计算

如果需要向表中插入少量数据,您可以通过insert … valuesvalues table操作向数据量小的表中插入数据。由于insert .... values就是我们平常使用的方式,这里不再介绍,本篇内容我们只介绍values  table。

如果您需要对插入的数据进行简单的运算,推荐使用MaxCompute的values tablevalues table可以在insert语句和任何DML语句中使用。功能如下:

  • 在没有任何物理表时,您可以模拟一个有任意数据的、多行的表,并进行任意运算。
  • 取代select * fromunion all组合的方式,构造常量表。
  • values table支持特殊形式。您可以不通过from子句,直接执行selectselect表达式列表中不可以出现其它表中的数据。其底层实现为从一个1行0列的匿名VALUES表中进行选取操作。在测试UDF或其它函数时,您可以通过该方式免去手工创建DUAL表的过程。

命令格式:

--values table
values (<col1_value>,<col2_value>,...),(<col1_value>,<col2_value>,...),<table_name> (<col1_name> ,<col2_name>,...)...
  • col_value:可选。目标表中列对应的列值。多个列值之间用英文逗号(,)分隔。该列值支持常量,同时还支持非常量表达式,例如自定义函数或内建函数表达式。

示例1、通过values table操作插入数据。

命令示例如下:

--创建分区表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   |
+------------+------------+------------+

values (…), (…) t(a, b)相当于定义了一个名为t,列为ab,数据类型分别为STRING和BIGINT的表。列的类型需要从values列表中推导。

示例2、取代select * fromunion all组合的方式,构造常量表。

命令示例如下:

select 1 c union all select 2 c;
--等价于如下语句。
select * from values (1), (2) t(c);

--返回结果。
+------------+
| c          |
+------------+
| 1          |
| 2          |
+------------+

示例3、通过values table的特殊形式插入数据,不带from子句。命令示例如下:

--创建分区表srcp。
create table if not exists srcp (key string,value bigint) partitioned by (p string);

--向表srcp中插入数据。
insert into table srcp partition (p) select abs(-1), length('abc'), getdate();

--查询表srcp。
select * from srcp;

--返回结果。
+------------+------------+------------+
| key        | value      | p          |
+------------+------------+------------+
| 1          | 3          | 2020-11-25 18:39:48 |
+------------+------------+------------+

示例4、使用非常量表达式,命令示例如下:

select * from values ('a'),(to_date('20190101', 'yyyyMMdd')),(getdate()) t(d);

返回结果如下:

+------------+
| d          |
+------------+
| 2021-02-01 18:01:38 |
| 2019-01-01 00:00:00 |
| a          |
+------------+

 

posted @ 2024-10-09 09:41  业余砖家  阅读(50)  评论(0)    收藏  举报