- Categorias:
GENERATE_COLUMN_DESCRIPTION¶
Gera uma lista de colunas a partir de um conjunto de arquivos preparados que contêm dados semiestruturados usando a saída de função INFER_SCHEMA.
A saída dessa função pode ser usada como entrada na criação manual de uma tabela, tabela externa, tabela Apache Iceberg™ ou exibição (usando o comando CREATE <objeto> apropriado) com base nas definições de coluna dos arquivos preparados.
Como alternativa, o comando CREATE TABLE ou CREATE ICEBERG TABLE com a cláusula USING TEMPLATE pode ser usado para criar uma nova tabela com as definições de coluna derivadas da mesma saída da função INFER_SCHEMA.
Sintaxe¶
GENERATE_COLUMN_DESCRIPTION( <expr> , '<string>' )
Argumentos¶
expr
Saída da função INFER_SCHEMA formatada como uma matriz.
'string'
Tipo de objeto que poderia ser criado a partir da lista de colunas. A formatação apropriada para este tipo é aplicada à saída.
Os valores possíveis são
table
,external_table
ouview
.
Retornos¶
A função retorna a lista de colunas em um conjunto de arquivos preparados, que podem ser usados como entrada ao criar um objeto do tipo identificado no segundo argumento.
Exemplos¶
Detectar, formatar e emitir o conjunto de definições de colunas em um conjunto de arquivos Parquet preparados no estágio mystage
. As colunas de saída são formatadas para a criação de uma tabela.
Este exemplo se baseia em um exemplo no tópico 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);
O mesmo que o exemplo anterior, mas gera um conjunto de colunas formatadas para a criação de uma tabela externa:
-- 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) | +---------------------------------------------+
O mesmo que os exemplos anteriores, mas gera um conjunto de colunas formatadas para criar uma tabela Iceberg:
-- Create a file format that sets the file type as Parquet. CREATE OR REPLACE FILE FORMAT my_parquet_format TYPE = PARQUET USE_VECTORIZED_SCANNER = TRUE; -- Query the GENERATE_COLUMN_DESCRIPTION function. SELECT GENERATE_COLUMN_DESCRIPTION(ARRAY_AGG(OBJECT_CONSTRUCT(*)), 'table') AS COLUMNS FROM TABLE ( INFER_SCHEMA( LOCATION=>'@my_int_stage', FILE_FORMAT=>'my_parquet_format', KIND => 'ICEBERG' ) ); +---------------------------------------------+ | COLUMN_DESCRIPTION | |---------------------------------------------| | "id" INT NOT NULL, | | "custnum" INT NOT NULL | +---------------------------------------------+
O mesmo que os exemplos anteriores, mas gera um conjunto de colunas formatadas para criar uma exibição:
-- 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" | +--------------------+
Nota
Usar *
para ARRAY_AGG(OBJECT_CONSTRUCT())
pode resultar em erro se o resultado retornado for maior que 128 MB. Evite o uso de *
para conjuntos de resultados maiores e use apenas as colunas obrigatórias, COLUMN NAME
, TYPE
e NULLABLE
, para a consulta. Você pode incluir a coluna opcional ORDER_ID
ao usar WITHIN GROUP (ORDER BY order_id)
.