- 类别:
GENERATE_COLUMN_DESCRIPTION¶
使用 INFER_SCHEMA 函数输出,从一组包含半结构化数据的暂存文件中生成列的列表。
根据暂存文件的列定义手动创建表、外部表或视图(使用相应的 CREATE <object> 命令)时,此函数的输出可用作输入。
或者,带 USING TEMPLATE 子句的 CREATE TABLE 命令可用于创建新表,其中包含从同一 INFER_SCHEMA 函数输出派生的列定义。
语法¶
GENERATE_COLUMN_DESCRIPTION( <expr> , '<string>' )
实参¶
expr
格式化为数组的 INFER_SCHEMA 函数的输出。
'string'
可以从列的列表中创建的对象的类型。此类型的相应格式适用于输出。
可能的值为
table
、external_table
或view
。
返回¶
该函数返回一组暂存文件中列的列表,在创建第二个实参中标识的类型的对象时,该列表可用作输入。
示例¶
检测、格式化和输出在 mystage
暂存区上暂存的一组 Parquet 文件中的列定义集。输出列经过格式化,用于创建表。
本例以 INFER_SCHEMA 主题中的一个示例为基础:
-- Create a file format that sets the file type as Parquet.
CREATE FILE FORMAT my_parquet_format
TYPE = parquet;
-- Query the GENERATE_COLUMN_DESCRIPTION function.
SELECT GENERATE_COLUMN_DESCRIPTION(ARRAY_AGG(OBJECT_CONSTRUCT(*)), 'table') AS COLUMNS
FROM TABLE (
INFER_SCHEMA(
LOCATION=>'@mystage',
FILE_FORMAT=>'my_parquet_format'
)
);
+--------------------+
| COLUMN_DESCRIPTION |
|--------------------|
| "country" VARIANT, |
| "continent" TEXT |
+--------------------+
-- The function output can be used to define the columns in a table.
CREATE TABLE mytable ("country" VARIANT, "continent" TEXT);
与前面的示例相同,但生成一组经过格式化的列,用于创建外部表:
-- Query the GENERATE_COLUMN_DESCRIPTION function.
SELECT GENERATE_COLUMN_DESCRIPTION(ARRAY_AGG(OBJECT_CONSTRUCT(*)), 'external_table') AS COLUMNS
FROM TABLE (
INFER_SCHEMA(
LOCATION=>'@mystage',
FILE_FORMAT=>'my_parquet_format'
)
);
+---------------------------------------------+
| COLUMN_DESCRIPTION |
|---------------------------------------------|
| "country" VARIANT AS ($1:country::VARIANT), |
| "continent" TEXT AS ($1:continent::TEXT) |
+---------------------------------------------+
与前面的示例相同,但生成一组经过格式化的列,用于创建视图:
-- Query the GENERATE_COLUMN_DESCRIPTION function.
SELECT GENERATE_COLUMN_DESCRIPTION(ARRAY_AGG(OBJECT_CONSTRUCT(*)), 'view') AS COLUMNS
FROM TABLE (
INFER_SCHEMA(
LOCATION=>'@mystage',
FILE_FORMAT=>'my_parquet_format'
)
);
+--------------------+
| COLUMN_DESCRIPTION |
|--------------------|
| "country" , |
| "continent" |
+--------------------+
备注
如果返回的结果大于 16MB,使用 ARRAY_AGG(OBJECT_CONSTRUCT())
的 *
可能会导致错误。建议避免使用 *
导致较大的结果集,而仅将所需的列 COLUMN NAME
、TYPE
和 NULLABLE
用于查询。使用 WITHIN GROUP (ORDER BY order_id)
时可以包含可选列 ORDER_ID
。