Maxcompute-使用values table模拟一个有任意数据的、多行的表进行计算
如果需要向表中插入少量数据,您可以通过insert … values或values table操作向数据量小的表中插入数据。由于insert .... values就是我们平常使用的方式,这里不再介绍,本篇内容我们只介绍values table。
如果您需要对插入的数据进行简单的运算,推荐使用MaxCompute的values table。values table可以在insert语句和任何DML语句中使用。功能如下:
- 在没有任何物理表时,您可以模拟一个有任意数据的、多行的表,并进行任意运算。
- 取代
select * from与union all组合的方式,构造常量表。 values table支持特殊形式。您可以不通过from子句,直接执行select,select表达式列表中不可以出现其它表中的数据。其底层实现为从一个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,列为a和b,数据类型分别为STRING和BIGINT的表。列的类型需要从values列表中推导。
示例2、取代select * from与union 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 |
+------------+
本文来自博客园,作者:业余砖家,转载请注明原文链接:https://www.cnblogs.com/yeyuzhuanjia/articles/18453584

浙公网安备 33010602011771号