
文章目录一、分类总览1、函数分类2、全部函数二、STRUCT基础1、定义2、区别3、简单记忆4、案例三、构造类1、定义2、区别3、简单记忆4、案例四、读取类1、定义2、区别3、简单记忆4、案例五、展开类1、定义2、区别3、简单记忆4、案例六、最容易混淆的函数对比七、常用案例1、构造业务对象2、获取指定字段3、使用点号访问字段4、ARRAY中存储STRUCT5、展开ARRAYSTRUCT6、将整行字段封装成STRUCT八、参考资料一、分类总览1、函数分类分类主要解决的问题代表函数1、构造类将多个不同类型字段组合成一个 STRUCTSTRUCT、NAMED_STRUCT2、读取类获取 STRUCT 中指定成员变量的值FIELD3、展开类将ARRAYSTRUCT展开为多行多列INLINE2、全部函数分类函数功能1、构造类STRUCT使用给定Value列表建立STRUCT。1、构造类NAMED_STRUCT使用给定的Name、Value列表建立STRUCT。2、读取类FIELD获取STRUCT中的成员变量的取值。3、展开类INLINE将指定的STRUCT数组展开。每个数组元素对应一行每行每个STRUCT元素对应一列。二、STRUCT基础内容说明STRUCT将多个不同类型的字段组合成一个逻辑对象FieldSTRUCT 内部字段Field NameSTRUCT 中字段名称Field ValueSTRUCT 中字段对应的值ARRAYSTRUCT多个 STRUCT 组成的数组可通过INLINE展开1、定义STRUCT 是 MaxCompute 的复杂数据类型之一。它适合把一组有业务关联、但类型可能不同的字段组合为一个整体。例如{ user_id: 10001, user_name: LiLei, married: F, weight: 63.5 }其类型可以表示为STRUCT user_id: BIGINT, user_name: STRING, married: STRING, weight: DOUBLE 2、区别STRUCT 与 ARRAY、MAP 的核心区别类型结构特点ARRAYT[v1,v2,v3]元素类型通常一致按位置组织MAPK,V{key:value}Key-Value 结构STRUCT...{field:value}固定字段结构不同字段可以是不同类型STRUCT 更像一行“小表记录”或一个对象。3、简单记忆ARRAY 一列值。MAP Key-Value。STRUCT 多字段对象。4、案例-- 结果{col1:a,col2:123,col3:true,col4:56.9}SELECTSTRUCT(a,123,true,56.90);三、构造类函数功能STRUCT使用给定Value列表建立STRUCT。NAMED_STRUCT使用给定的Name、Value列表建立STRUCT。1、定义STRUCT直接传入多个 Value 构造 STRUCT字段名自动生成。NAMED_STRUCT按照字段名、字段值成对传入可自定义 STRUCT 字段名称。此外MaxCompute 还支持STRUCT EXPRESSION写法STRUCT(1ASa,abcASb)它不是独立函数列表中的函数但在实际开发中很常用。2、区别对比区别STRUCT只能传 Value字段名自动生成col1、col2…NAMED_STRUCT可以明确指定字段名称STRUCT EXPRESSION可以通过AS直接给字段命名STRUCT(*)STRUCT EXPRESSION 还支持将整行字段构造成 STRUCT例如STRUCT(1L,abc)结果结构STRUCTcol1:BIGINT,col2:STRING而NAMED_STRUCT(id,1L,name,abc)结果结构STRUCTid:BIGINT,name:STRINGNULL 使用方面需要特别注意STRUCT函数不支持字段值直接为 NULL。NAMED_STRUCT不支持字段值直接为 NULL。如果需要构造包含 NULL 的 STRUCT可开启 BigQuery 兼容模式并使用 STRUCT EXPRESSION。3、简单记忆STRUCT 只给值字段名系统自动生成。NAMED_STRUCT Name Value字段名自己定。STRUCT EXPRESSION 用AS给字段命名。4、案例-- 结果{col1:a,col2:123,col3:true,col4:56.9}SELECTSTRUCT(a,123,true,56.90);-- 结果{user_id:10001,user_name:LiLei,married:F,weight:63.5}SELECTNAMED_STRUCT(user_id,10001,user_name,LiLei,married,F,weight,63.50);四、读取类函数功能FIELD获取STRUCT中的成员变量的取值。1、定义FIELD用于从 STRUCT 中获取指定成员变量的值。基本形式FIELD(struct_value,field_name)也可以在已知字段名称时使用点号访问struct_col.field_name2、区别对比区别FIELD(struct, name)通过函数和字段名获取 Valuestruct.name通过点号直接访问字段FIELD字段名以字符串参数传入点号访问SQL 更简洁适合字段结构明确的场景3、简单记忆FIELD 从 STRUCT 里拿一个字段。4、案例-- 结果helloSELECTFIELD(NAMED_STRUCT(f1,hello,f2,3),f1)ASresult;五、展开类函数功能INLINE将指定的STRUCT数组展开。每个数组元素对应一行每行每个STRUCT元素对应一列。1、定义INLINE用于展开ARRAYSTRUCT...数组中的每一个 STRUCT 对应输出一行STRUCT 中的每一个 Field 对应输出一列。因此INLINE同时完成了数组展开 STRUCT 字段展开。2、区别INLINE与EXPLODE很容易混淆。假设输入[ {id:1,name:A}, {id:2,name:B} ]函数输出EXPLODE两行每行还是一个 STRUCTINLINE两行并直接展开成id、name两列因此EXPLODE只负责把 ARRAY 拆成多行。INLINE不仅拆行还会把 STRUCT 字段拆成多列。3、简单记忆INLINEARRAYSTRUCT一次性展开成“行 列”。4、案例-- 结果-- 1 A-- 2 BSELECTINLINE(ARRAY(NAMED_STRUCT(id,1,name,A),NAMED_STRUCT(id,2,name,B)));六、最容易混淆的函数对比函数组合最核心区别STRUCTvsNAMED_STRUCT自动字段名 vs 自定义字段名STRUCTvsSTRUCT EXPRESSION只传 Value vs 可用AS指定字段名NAMED_STRUCTvsSTRUCT EXPRESSIONName-Value 参数形式 vs SQL 表达式形式FIELDvsstruct.field函数取字段 vs 点号直接取字段INLINEvsEXPLODEARRAYSTRUCT展开成多行多列 vs 只把 ARRAY 展开为多行STRUCTvsMAP固定字段结构 vs 动态 Key-ValueSTRUCTvsARRAY多字段不同类型对象 vs 同类元素序列七、常用案例1、构造业务对象-- 结果{shop_id:10001,shop_name:北京朝阳店,platform:美团}SELECTNAMED_STRUCT(shop_id,10001,shop_name,北京朝阳店,platform,美团)ASshop_info;2、获取指定字段-- 结果北京朝阳店SELECTFIELD(NAMED_STRUCT(shop_id,10001,shop_name,北京朝阳店),shop_name)ASshop_name;3、使用点号访问字段-- 结果10001SELECTt.shop_info.shop_idFROM(SELECTNAMED_STRUCT(shop_id,10001,shop_name,北京朝阳店)ASshop_info)t;4、ARRAY中存储STRUCT-- 结果包含两个门店对象的 ARRAYSELECTARRAY(NAMED_STRUCT(shop_id,10001,shop_name,北京店),NAMED_STRUCT(shop_id,10002,shop_name,上海店))ASshop_list;5、展开ARRAYSTRUCT-- 结果-- 10001 北京店-- 10002 上海店SELECTINLINE(ARRAY(NAMED_STRUCT(shop_id,10001,shop_name,北京店),NAMED_STRUCT(shop_id,10002,shop_name,上海店)));6、将整行字段封装成STRUCT-- 结果将当前记录的指定字段组合为一个 STRUCTSELECTSTRUCT(shop_idASshop_id,shop_nameASshop_name,cityAScity)ASshop_infoFROMshop_table;八、参考资料阿里云 MaxCompute 官方文档https://help.aliyun.com/zh/maxcompute/struct-functionSTRUCT 数据类型说明https://help.aliyun.com/zh/maxcompute/user-guide/struct-data-type