Sobre tabelas externas com particionamento de arquivo de origem

No Autonomous Database, você pode criar tabelas externas particionadas com base em dados particionados no estilo Hive ou de pasta simples armazenados no Armazenamento de Objetos na Nuvem.

Usando o particionamento de arquivos de origem, em vez de fornecer uma especificação de partição completa, o procedimento deriva informações de particionamento do caminho do arquivo para determinados padrões de arquivo. Por exemplo, considere estas especificações de arquivo:

  • Estilo Hive: por exemplo: sales/country=USA/year=2020/month=01/file1.csv

  • Estilo de partição de pasta simples: por exemplo: sales/USA/2020/01/file1.parquet

O uso de um desses formatos de partição comuns simplifica muito a criação e o gerenciamento de tabelas externas particionadas. Além disso, mesmo que as colunas de partição possam não aparecer no arquivo de dados, elas ainda podem ser consultadas usando SQL. O partição de dados também melhora o desempenho da consulta, reduzindo consideravelmente o volume de dados verificados. Nesse exemplo, quando você consulta os dados 'USA', a consulta pode ignorar a verificação dos arquivos de outros países.

Dados particionados no formato Hive no armazenamento de objetos na nuvem

O Hive oferece um formato de metadados padrão para mecanismos de processamento de Big Data. Os dados particionados no Armazenamento de Objetos na Nuvem gerados no formato Hive são representados em um formato folder/subfolder. Por exemplo, no Cloud Object Store, um formato Hive é armazenado da seguinte forma:

table/partition1=partition1_value/partition2=partition2_value/data_file.csv

Os arquivos salvos no formato particionado do Hive fornecem informações de partição no nome do caminho do arquivo de dados. O nome do caminho do arquivo de dados inclui informações sobre o conteúdo do objeto, incluindo nomes e valores de colunas de partição (o arquivo de dados não inclui as colunas de partição e seus valores associados).

Por exemplo, considere uma tabela SALES particionada externa criada com base nos dados em formato Hive no Armazenamento de Objetos na Nuvem:

.../sales/country=USA/year=2020/month=01/file1.csv
.../sales/country=USA/year=2020/month=01/file2.csv
.../sales/country=USA/year=2020/month=02/file3.csv
.../sales/country=USA/year=2020/month=03/file1.csv
.../sales/country=FRA/year=2020/month=03/file1.csv

As informações da partição no formato Hive mostram que os arquivos de dados no Cloud Object Store são particionados por country, year e month e os valores dessas colunas de partição também são especificados no nome do caminho no formato Hive para cada arquivo de dados (o nome do caminho inclui valores para as colunas particionadas: country, year e month).

A API usará os nomes de coluna no caminho para simplificar a definição da tabela.

Dados particionados no formato de pasta simples no armazenamento de objetos na nuvem

Os dados particionados no Armazenamento de Objetos na Nuvem gerados no formato de pasta são representados em um formato folder/subfolder, semelhante aos dados particionados no formato Hive, mas as informações no caminho mostram os valores das colunas e não incluem os nomes das colunas. Além disso, com dados particionados no formato de pasta, a ordem da partição especificada no nome do objeto é significativa e deve corresponder à ordem nas colunas da tabela.

Por exemplo, no Cloud Object Store, um arquivo de dados no formato de pasta é armazenado da seguinte forma:

table/partition1_value/partition2_value/*.parquet

O caminho inclui os valores das colunas de partição, na ordem das colunas, e os arquivos de dados. O Autonomous Database permite criar uma tabela particionada externa com base nos dados em formato de pasta e você pode executar uma consulta usando as partições especificadas.

Os arquivos salvos em formato particionado de pasta fornecem os valores das colunas de partição de dados no nome do arquivo. Ao contrário do que acontece com o Hive, os caminhos não incluem o nome da coluna. Portanto, forneça os nomes. A ordem das colunas de partição é importante e a ordem no nome do arquivo para nomes de partição de coluna deve corresponder à ordem no parâmetro partition_columns.

Sobre a Consulta de Dados particionados no Armazenamento de Objetos na Nuvem

Quando você consulta dados externos particionados no formato Hive, o mecanismo de consulta entende e utiliza as informações de partição do nome do caminho do arquivo. Por exemplo, considere uma tabela SALES particionada externa na qual o arquivo de origem, sales/country=USA/year=2020/month=02/file3.csv no Object Store, inclua os seguintes dados de vendas:

tents, 291
canoes, 22
backpacks, 378

Os valores country no nome do caminho e os valores do período para month e year não são especificados como colunas no arquivo de dados. Os valores de colunas de partição são especificados apenas no nome do caminho com os valores mostrados: USA, 2020 e 02. Depois de criar uma tabela particionada externa com esse arquivo de dados, você pode usar as colunas de partição e seus valores ao executar uma consulta na tabela particionada externa.

Por exemplo:

SELECT year, month, product, units 
     FROM SALES WHERE year='2020' AND month='02' AND country='USA'

A vantagem de criar uma tabela particionada externa com dados gerados como dados particionados no formato Hive é que o mecanismo de consulta é otimizado para a remoção da partição dos dados para selecionar a partição correta e a consulta só seleciona dados de uma partição e só precisa pesquisar um único arquivo de dados. Assim, a consulta só precisaria de uma verificação do arquivo file3.csv (/sales/country=USA/year=2020/month=02/file3.csv). Para grandes volumes de dados, esse processamento de partição pode fornecer melhorias significativas de desempenho.

Usando tabelas externas padrão do Oracle Database, a coluna de partição deve estar disponível como uma coluna no arquivo de dados para uso em consultas ou definições de partição. Sem o tratamento especial disponível com tabelas particionadas externas no Autonomous Database, isso seria um problema se você quisesse usar dados armazenados no formato Hive no Cloud Object Store, já que precisaria gerar novamente os arquivos de dados para incluir a partição como coluna no arquivo de dados.

Sobre a Criação de Tabelas Externas Particionadas

Quando você usa dados não estruturados armazenados no formato Hive no Armazenamento de Objetos na Nuvem e cria uma tabela particionada externa, as colunas e seus tipos não podem ser derivados do arquivo de origem. Portanto, as colunas e seus tipos de dados devem ser especificados com o parâmetro column_list. Para criar as tabelas externas partição, use o procedimento DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE para especificar as colunas de partição e seus tipos da seguinte forma:

  • A raiz da lista de arquivos é especificada no nome do caminho com o parâmetro file_uri_list. Por exemplo, http://.../sales/*

  • Os nomes das colunas e os tipos de dados são especificados com o parâmetro column_list.

  • A opção partition_columns no parâmetro format especifica as colunas da partição.

  • A DLL gerada inclui as colunas especificadas no nome do caminho.

Nesse exemplo, quando a tabela externa é criada, as colunas country, year e month são adicionadas no parâmetro column_list. A tabela externa é criada com as colunas country, year e month, que não estão nos arquivos de dados, e as partições de lista são criadas ativando a remoção de partição.

Quando você usa dados estruturados, como arquivos Parquet, Avro ou ORC armazenados em formato de pasta no Armazenamento de Objetos na Nuvem, as colunas e seus tipos de dados são conhecidos e você não precisa especificar a lista de colunas como é exigido com dados não estruturados. Para criar as tabelas externas partição, use o procedimento DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE para especificar as colunas de partição e seus tipos da seguinte forma:

  • A raiz da lista de arquivos é especificada no nome do caminho com o parâmetro file_uri_list. Por exemplo, http://.../sales/*
  • O parâmetro column_list não é necessário para arquivos estruturados. Se você não especificar a lista de colunas, defina as colunas de partição e seus tipos de dados ao criar a tabela particionada externa. Use a opção partition_columns no parâmetro format para especificar as colunas de partição e seus tipos de dados.
  • A DLL gerada inclui as colunas especificadas no nome do caminho.

Consulte Pesquisar Dados Particionados Externos com Organização de Arquivo de Origem no Formato Hive e Pesquisar Dados Particionados Externos com Organização de Arquivo de Origem no Formato de Pasta para obter exemplos completos.

particionamento externo: arquivos de origem CSV com pastas no estilo Hive

Mostra como criar tabelas particionadas externas com arquivos de origem CSV armazenados no Armazenamento de Objetos na Nuvem em pastas no estilo Hive.

Lista de arquivos de origem:

.../sales/country=USA/year=2020/month=01/file1.csv
.../sales/country=USA/year=2020/month=01/file2.csv
.../sales/country=USA/year=2020/month=02/file3.csv
.../sales/country=USA/year=2020/month=03/file1.csv
.../sales/country=FRA/year=2020/month=03/file1.csv

API:

DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE (
   table_name        => 'mysales',
   credential_name   => 'mycredential', 
   file_uri_list     => 'https://objectstorage.us-phoenix-1.oraclecloud.com/.../sales/*.csv', 
   column_list       => 'product varchar2(100), units number, country varchar2(100), year number, month varchar2(2)', 
   field_list        => 'product, units', --[Because country, year and month are not in the file, they are not listed in the field list]
   format            => '{"type":"csv","partition_columns":["country", "year", "month"]}');
Observação

O partition_columns no parâmetro format deve corresponder aos nomes das colunas encontrados no caminho (por exemplo, a coluna country corresponde a "country=…")

particionamento externo: arquivos de origem CSV com pastas simples

Mostra como criar tabelas particionadas externas com arquivos de origem CSV armazenados no Armazenamento de Objetos na Nuvem no formato de pasta simples.

Lista de arquivos de origem:

.../sales/USA/2020/01/file1.csv
.../sales/USA/2020/01/file2.csv
.../sales/USA/2020/02/file3.csv
.../sales/USA/2020/03/file1.csv
.../sales/FRA/2020/03/file1.csv

API:

DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE(
   table_name        => 'mysales',
   credential_name   => 'mycredential', 
   file_uri_list     =>  'https://objectstorage.us-phoenix-1.oraclecloud.com/.../sales/*.csv', 
   column_list       => 'product varchar2(100), units number, country varchar2(100), year number, month varchar2(2)', 
   field_list        => 'product, units', --[Because country, year and month are not in the file, they are not listed in the field list]
   format            => '{"type":"csv","partition_columns":["country", "year", "month"]}');
Observação

A chamada de API é a mesma do exemplo anterior, mas a ordem do partition_columns no parâmetro format é significativa porque o nome da coluna não está no caminho do arquivo.

particionamento externo: arquivos de origem parquet com pastas no estilo Hive

Mostra como criar tabelas particionadas externas com arquivos de origem Parquet armazenados no Armazenamento de Objetos na Nuvem em pastas no estilo Hive.

Lista de arquivos de origem:

.../sales/USA/2020/01/file1.parquet
.../sales/USA/2020/01/file2.parquet
.../sales/USA/2020/02/file3.parquet
.../sales/USA/2020/03/file1.parquet
.../sales/FRA/2020/03/file1.parquet

API:

DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE (
   table_name            => 'mysales',
     credential_name     => 'mycredential', 
     file_uri_list       => 'https://objectstorage.us-phoenix-1.oraclecloud.com/.../sales/*.parquet',
     format              => 
         json_object(    'type' value 'parquet', 
               'schema' value 'first',
               'partition_columns' value 
                  json_array(
                      json_object('name' value 'country', 'type' value 'varchar2(100)'),
                      json_object('name' value 'year', 'type' value 'number'),
                      json_object('name' value 'month', 'type' value 'varchar2(2)')
            )
        )

);
Observação

O parâmetro column_list não é especificado. Conforme mostrado, para cada coluna de partição, especifique o nome e o tipo de dados no parâmetro format partition_columns.

particionamento externo: parquet com pastas simples

Mostra como criar tabelas particionadas externas com arquivos de origem Parquet armazenados no Armazenamento de Objetos na Nuvem no formato de pasta simples.

Lista de arquivos de origem:

.../sales/USA/2020/01/file1.parquet
.../sales/USA/2020/01/file2.parquet
.../sales/USA/2020/02/file3.parquet
.../sales/USA/2020/03/file1.parquet
.../sales/FRA/2020/03/file1.parquet

API:

DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE (
   table_name        => 'mysales',
   credential_name   => 'mycredential', 
   file_uri_list     => 'https://objectstorage.us-phoenix-1.oraclecloud.com/.../sales/*.parquet', 
   format            => 
     json_object(    'type' value 'parquet', 
                'schema' value 'first',
         'partition_columns' value 
           json_array(
              json_object('name' value 'country', 'type' value 'varchar2(100)'),
              json_object('name' value 'year', 'type' value 'number'),
              json_object('name' value 'month', 'type' value 'varchar2(2)')
            )
        )

);
Observação

O parâmetro column_list não é especificado. Inclua o nome e o tipo de dados para as colunas de partição. Além disso, a ordem do partition_columns na cláusula de formato é importante porque o nome da coluna não está no caminho do arquivo.