MaxCompute支持STRUCT(结构体)数据类型,可以将不同类型的字段组合成一个逻辑单元。本文为您介绍STRUCT数据类型的使用方法。
构造方式
构造方式介绍及区别
MaxCompute支持STRUCT EXPRESSION、STRUCT函数和NAMED_STRUCT函数三种不同的构造STRUCT数据类型的方式。
构造方式 | 构造示例 | 数据类型 |
支持使用value列表和Named Expression(命名表达式)列表。 |
|
|
|
| |
支持使用*将表的所有列构造成一个STRUCT。 |
| |
支持使用value列表。 |
|
|
|
| |
|
| |
支持使用name/value列表。 |
|
|
|
|
STRUCT EXPRESSION与STRUCT函数的区别是:STRUCT函数不支持对每个参数指定别名名称,系统在构造STRUCT时会自动按照参数顺序补充field的名称依次为col1,col2,...。
注意事项
不同的构造语法支持嵌套使用,也支持跟其他复杂类型ARRAY、MAP的构造函数嵌套组合使用。
STRUCT数据类型默认不支持NULL作为字段值。如果需要使用NULL值,需要打开Bigquery兼容模式开关
SET odps.sql.bigquery.compatible=true;
,同时仅支持使用STRUCT EXPRESSION方式进行构造。
STRUCT EXPRESSION
STRUCT EXPRESSION(STRUCT表达式)提供了构造复杂类型STRUCT的一种方法,支持在构造STRUCT的时候使用value列表和Named Expression(命名表达式)列表。
构造语法
STRUCT(expression1 [[AS] field_name1], expression2 [[AS] field_name2], ...)
参数说明:
参数
是否必填
说明
expression
是
可以是任意表达式和数据类型,可以使用列名、常数及表达式等。
as
否
STRUCT表达式中字段名称的前置关键字。
field_name
否
生成的STRUCT中对应的字段名称,字段名大小写不敏感。同一个STRUCT表达式内部多个输入表达式的字段名不能重复。
返回值:返回STURCT类型,STRUCT <field_name1:T1, field_name2:T2, ...>,其field的名称依次为field_name1, field_name2, ...。
使用示例
使用非NULL值作为字段值。
SELECT * FROM VALUES (STRUCT (1 AS a, 2 AS b, 3 AS c, 4 AS d)) AS tbl1(struct1); -- 返回结果 {a:1, b:2, c:3, d:4} SELECT struct1.b FROM VALUES (STRUCT (1 AS a, 2 AS b, 3 AS c, 4 AS d)) AS tbl1(struct1); -- 返回结果 +------------+ | b | +------------+ | 2 | +------------+
使用NULL值作为字段值。您需要执行命令
SET odps.sql.bigquery.compatible=true;
开启Bigquery兼容模式。SET odps.sql.bigquery.compatible=true; SELECT STRUCT (NULL AS Col_1, 2 AS Col_2); -- 返回结果 {col_1:NULL, col_2:2}
STRUCT函数
MaxCompute支持使用STRUCT函数对给定的value列表建立STRUCT数据类型。
构造语法
STRUCT STRUCT(value1,value2, ...)
参数说明:value可以为任意类型,不支持NULL。
返回值:返回STRUCT类型,STRUCT<col1:T1, col2:T2,...>类型,filed的名称依次为col1,col2,...。
使用示例
SELECT STRUCT('a',123,'true',56.90);
-- 返回结果
{col1:a, col2:123, col3:true, col4:56.9}
NAMED_STRUCT函数
MaxCompute支持使用NAMED_STRUCT函数对给定的name/value列表构建STRUCT数据类型。
构造语法
STRUCT NAMED_STRUCT(string_name1, T1 value1, string_name2, T2 value2,...)
参数说明:
string_name:指定的string类型的field名称,必须为常量,字段名大小写不敏感。
value:可以为任意类型,不支持NULL。
返回值:返回STURCT类型,STRUCT<string_name1:T1, string_name2:T2, ...>类型, 其中field的名称依次为string_name1, string_name2, ...。
使用示例
SELECT NAMED_STRUCT('user_id',10001,'user_name','LiLei','married','F','weight',63.50);
-- 返回结果
{user_id:10001, user_name:LiLei, married:F, weight:63.5}