Categorias:

Funções de metadados

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>' )
Copy

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 ou view.

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);
Copy

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)    |
+---------------------------------------------+
Copy

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                      |
+---------------------------------------------+
Copy

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"        |
+--------------------+
Copy

Nota

Usar * para ARRAY_AGG(OBJECT_CONSTRUCT()) pode resultar em um erro se o resultado retornado for maior que 16MB. Recomendamos que você evite usar * para conjuntos de resultados maiores e use apenas as colunas necessárias, COLUMN NAME, TYPE e NULLABLE, para a consulta. A coluna opcional ORDER_ID pode ser incluída ao usar WITHIN GROUP (ORDER BY order_id).