复杂类型的系统表
所有复杂类型的信息都记录在 COMPLEX_TYPES 系统表中。您必须对使用某种类型的外部表具有读取权限,才能在此系统表中查看其条目。TYPES 系统表中未显示复杂类型。
对于 ROW 类型,COMPLEX_TYPES 中的每一行代表一个 ROW 的一个字段。字段名称是表定义中使用的名称(如果存在),否则是生成的以 _field 开头的名称。每行还包括其包含类型的(生成的)名称,即一个以 ct 开头的字符串。("CT" 代表“复杂类型”。)
以下示例定义一个外部表,然后显示 COMPLEX_TYPES 中的类型:
=> CREATE EXTERNAL TABLE warehouse(
name VARCHAR, id_map MAP<INT,VARCHAR>,
data row(record INT, total FLOAT, description VARCHAR(100)),
prices ARRAY[INT], comment VARCHAR(200), sales_total FLOAT, storeID INT)
AS COPY FROM ... PARQUET;
=> SELECT type_id,type_kind,type_name,field_id,field_name,field_type_name,field_position
FROM COMPLEX_TYPES ORDER BY type_id,field_name;
type_id | type_kind | type_name | field_id | field_name | field_type_name | field_position
-------------------+-----------+-----------------------+----------+-------------+-----------------+----------------
45035996274278280 | Map | _ct_45035996274278280 | 6 | key | int | 0
45035996274278280 | Map | _ct_45035996274278280 | 9 | value | varchar(80) | 1
45035996274278282 | Row | _ct_45035996274278282 | 9 | description | varchar(80) | 2
45035996274278282 | Row | _ct_45035996274278282 | 6 | record | int | 0
45035996274278282 | Row | _ct_45035996274278282 | 7 | total | float | 1
45035996274278284 | Array | _ct_45035996274278284 | 6 | | int | 0
(6 rows)
此表显示表中定义的两种 ROW 类型的字段。当一个 ROW 包含另一个 ROW 时(就像这里嵌套地址字段的情况一样),field_type_name 列使用包含的 ROW 的生成名称。去掉前导 "ct" 后的数字用作 field_id。