DBMS_CLOUD - Suporte a Avro, ORC e Parquet

Esta seção aborda o suporte Avro, ORC e Parquet DBMS_CLOUD fornecido com o Autonomous AI Database.

Opções de Formato de Pacote DBMS_CLOUD para Avro, ORC ou Parquet

O argumento de formato em DBMS_CLOUD especifica o formato dos arquivos de origem.

As duas maneiras de especificar o argumento de formatação são:

format => '{"format_option" : "format_value" }'

e

format => json_object('format_option' value 'format_value')

Exemplos de:

format => json_object('type' VALUE 'CSV')

Para especificar várias opções de formato, separe os valores com um ",".

Por exemplo:

format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
Opção de Formato Descrição Sintaxe
regexuri

Quando o valor de regexuri é definido como TRUE, você pode usar curingas, bem como expressões regulares nos nomes de arquivos nos URIs do arquivo de origem da Nuvem.

Os caracteres "*" e "?" são considerados caracteres curinga quando o parâmetro regexuri é definido como FALSE. Quando o parâmetro regexuri é definido como TRUE, os caracteres "*" e "?" fazem parte do padrão de expressão regular especificado.

Só há suporte para padrões de expressão regular no nome do arquivo ou no caminho da subpasta em seus URIs, e a correspondência de padrões é idêntica à executada pela função REGEXP_LIKE. Padrões de expressão regular não são suportados para nomes de diretório.

Para tabelas externas, essa opção só é suportada com as tabelas criadas em um arquivo no Object Storage.

Por exemplo:

format => JSON_OBJECT('regexuri' value TRUE)

Consulte Condição REGEXP_LIKE em Referência de Linguagem SQL do Oracle Database 19c ou Referência de Linguagem SQL do Oracle Database 26ai para obter mais informações sobre a condição REGEXP_LIKE.

regexuri: True

Valor padrão:False

type Especifica o tipo de arquivo.

type: avro | orc | parquet

schema

Quando o esquema é definido como first ou all, as colunas e os tipos de dados da tabela externa são derivados automaticamente dos metadados do arquivo Avro, ORC ou Parquet.

Os nomes das colunas corresponderão aos encontrados em Avro, ORC ou Parquet. Os tipos de dados são convertidos de tipos de dados Avro, ORC ou Parquet em tipos de dados Oracle. Todas as colunas são adicionadas à tabela.

O valor first especifica o uso dos metadados do primeiro arquivo Avro, ORC ou Parquet no file_uri_list para gerar automaticamente as colunas e seus tipos de dados. Use first se todos os arquivos tiverem o mesmo esquema.

O valor all especifica o uso dos metadados de todos os arquivos Avro, ORC ou Parquet no file_uri_list para gerar automaticamente as colunas e seus tipos de dados. Use all (mais lento) se os arquivos tiverem esquemas diferentes.

Padrão: Se column_list for especificado, o valor schema, se especificado, será ignorado. Se column_list não for especificado, o valor padrão schema será first.

Observação: para arquivos de formato Avro, ORC ou Parquet, a opção de formato schema não está disponível e o parâmetro column_list deve ser especificado para tabelas externas particionadas usando o procedimento DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE.

schema : first | all

DBMS_CLOUD - Mapeamento do Tipo de Dados Pacote Avro para Oracle

Descreve o mapeamento de tipos de dados Avro para tipos de dados Oracle.

Observação: Tipos complexos, como mapas, matrizes e estruturas, são suportados a partir do Oracle Database 19c. Consulte DBMS_CLOUD Pacote Avro, ORC e Tipos Complexos Parquet para obter informações sobre como usar tipos complexos Avro.

Tipo Avro Tipo Oracle
INT NUMBER(10)
LONG NÚMERO(19)
LOJA NÚMERO(1)
UTF8 BYTE_ARRAY RAW(2000)
FLT BINARY_FLOAT
DBL BINARY_DOUBLE
DECIMAL(p) NÚMERO(p)
DECIMAL(p,s) NUMBER(p,s)
DATE DATE
STRING VARCHAR2
TIME_MILLIS VARCHAR2(20 BYTES)
TIME_MICROS VARCHAR2(20 BYTES)
TIMESTAMP_MILLIS TIMESTAMP(3)
TIMESTAMP_MICROS TIMESTAMP(6)
ENUM VARCHAR2(n) Onde: "n" é o comprimento máximo real dos valores possíveis do AVRO ENUM
DURATION RAW(2000)
FIXED RAW(2000)
NULL VARCHAR2(1) BYTE

Consulte DBMS_CLOUD Pacote Avro, ORC e Tipos Complexos Parquet para obter informações sobre como usar tipos complexos Avro.

DBMS_CLOUD - Mapeamento do Tipo de Dados Pacote ORC para Oracle

Descreve o mapeamento de tipos de dados ORC para tipos de dados Oracle.

Consulte DBMS_CLOUD Package Avro, ORC, and Parquet Complex Types para obter informações sobre o uso de tipos complexos ORC.

Tipo de ORC Tipo Oracle Mais informações
array Formato JSON do VARCHAR2(n) DBMS_CLOUD - Tipos Complexos de Pacote Avro, ORC e Parquet
bigint (64 bits) NÚMERO(19)  
binário BLOB  
boolean (1 bit) NÚMERO(1)  
caractere CAR(n)  
data DATE  
duplo BINARY_DOUBLE  
flutuante BINARY_FLOAT  
int (32 bits) NUMBER(10)  
list Formato JSON do VARCHAR2(n) DBMS_CLOUD - Tipos Complexos de Pacote Avro, ORC e Parquet
map Formato JSON do VARCHAR2(n) DBMS_CLOUD - Tipos Complexos de Pacote Avro, ORC e Parquet
smallint (16 bits) NÚMERO(5)  
string VARCHAR2(4000)  
struct Formato JSON do VARCHAR2(n) DBMS_CLOUD - Tipos Complexos de Pacote Avro, ORC e Parquet
timestamp TIMESTAMP  
smallint (8 bits) NÚMERO(3)  
união Formato JSON do VARCHAR2(n) DBMS_CLOUD - Tipos Complexos de Pacote Avro, ORC e Parquet
varchar VARCHAR2(n)  

DBMS_CLOUD - Mapeamento do Tipo de Dados Pacote Parquet para Oracle

Descreve o mapeamento de tipos de dados Parquet para tipos de dados Oracle.

Observação: Tipos complexos, como mapas, matrizes e estruturas, são suportados a partir do Oracle Database 19c. Consulte DBMS_CLOUD Pacote Avro, ORC e Tipos Complexos Parquet para obter informações sobre como usar tipos complexos Parquet.

Tipo de Parquet Tipo Oracle
UINT_64 NÚMERO(20)
INT_64 NÚMERO(19)
UINT_32 NUMBER(10)
INT_32 NUMBER(10)
UINT_16 NÚMERO(5)
INT_16 NÚMERO(5)
UINT_8 NÚMERO(3)
INT_8 NÚMERO(3)
LOJA NÚMERO(1)
UTF8 BYTE_ARRAY VARCHAR2(4000 BYTE)
FLT BINARY_FLOAT
DBL BINARY_DOUBLE
DECIMAL(p) NÚMERO(p)
DECIMAL(p,s) NUMBER(p,s)
DATE DATE
STRING VARCHAR2(4000)
TIME_MILLIS VARCHAR2(20 BYTES)
TIME_MILLIS_UTC VARCHAR2(20 BYTES)
TIME_MICROS VARCHAR2(20 BYTES)
TIME_MICROS_UTC VARCHAR2(20 BYTES)
TIMESTAMP_MILLIS TIMESTAMP(3)
TIMESTAMP_MILLIS_UTC TIMESTAMP(3)
TIMESTAMP_MICROS TIMESTAMP(6)
TIMESTAMP_MICROS_UTC TIMESTAMP(6)
TIMESTAMP_NANOS TIMESTAMP(9)

Consulte DBMS_CLOUD Pacote Avro, ORC e Tipos Complexos de Parquet para obter informações sobre como usar tipos complexos de Parquet.

DBMS_CLOUD - Mapeamento de Tipo de Dados Oracle para Parquet do Pacote

Descreve o mapeamento de tipos de dados Oracle para tipos de dados Parquet.

Tipo Oracle Tipo de Parquet
BINARY_DOUBLE DBL
BINARY_FLOAT FLT
DATE DATE
NUMBER(p,s) DECIMAL(p,s)
NÚMERO(p) DECIMAL(p)
TIMESTAMP(3) TIMESTAMP_MILLIS
TIMESTAMP(3) TIMESTAMP_MILLIS_UTC
TIMESTAMP(6) TIMESTAMP_MICROS
TIMESTAMP(6) TIMESTAMP_MICROS_UTC
TIMESTAMP(9) TIMESTAMP_NANOS
VARCHAR2(4000) STRING

Parâmetros da Sessão NLS

Os parâmetros de sessão NLS NLS_DATE_FORMAT, NLS_TIMESTAMP_FORMAT, NLS_TIMESTAMP_TZ_FORMAT e NLS_NUMERIC_CHARACTERS definem como a data, o timestamp, o timestamp com formato de fuso horário e o separador de radix para timestamp com marcador decimal devem ser mostrados quando uma tabela com esses tipos de coluna é consultada.

Além disso, quando você exporta dados usando DBMS_CLOUD.EXPORT_DATA e especifica a saída de Parquet, o Autonomous AI Database lê os valores desses parâmetros na tabela NLS_SESSION_PARAMETERS. O Autonomous AI Database usa esses valores para converter os tipos de dados DATE ou TIMESTAMP da Oracle em tipos de Parquet.

Os parâmetros NLS_SESSION_PARAMETERS suportam uma máscara de formato RR (especificação de ano com dois caracteres).

A máscara de formato RR para o ano não é suportada para esses parâmetros quando você exporta dados para Parquet com DBMS_CLOUD.EXPORT_DATA. Um erro de aplicativo será gerado se você tentar exportar para parquet e o NLS_SESSION_PARAMETERS estiver definido para usar a máscara de formato RR (o valor padrão para o formato RR depende do valor do parâmetro NLS_TERRITORY).

Quando um dos parâmetros NLS_DATE_FORMAT, NLS_TIMESTAMP_FORMAT ou NLS_TIMESTAMP_TZ_FORMAT usa a máscara de formato RR, você deve alterar o valor do formato para o valor suportado para exportar dados para Parquet com DBMS_CLOUD.EXPORT_DATA. Por exemplo:

ALTER SESSION SET NLS_DATE_FORMAT = "MM/DD/YYYY";
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH:MI:SS.FF';
ALTER SESSION SET  NLS_TIMESTAMP_TZ_FORMAT='YYYY-MM-DD HH:MI:SS.FF TZH:TZM';

Depois de alterar o valor, você poderá verificar a alteração consultando a view NLS_SESSION_PARAMETERS:

SELECT value FROM NLS_SESSION_PARAMETERS
       WHERE parameter IN ('NLS_DATE_FORMAT','NLS_TIMESTAMP_FORMAT','NLS_TIMESTAMP_TZ_FORMAT');

Se NLS_DATE_FORMAT for definido, ele se aplicará às colunas com o tipo de dados DATE. Se NLS_TIMESTAMP_FORMAT for definido, ele se aplicará às colunas com o tipo de dados TIMESTAMP. Se NLS_TIMESTAMP_TZ_FORMAT for definido, ele se aplicará às colunas com o tipo de dados TIMESTAMP WITH TIME ZONE.

Consulte Date and Time Parameters em Oracle Database 19c Database Globalization Support Guide ou Oracle Database 26ai Database Globalization Support Guide e NLS Data Dictionary Views no Oracle Database 19c Database Globalization Support Guide ou Oracle Database 26ai Database Globalization Support Guide para obter mais informações.

DBMS_CLOUD - Tipos Complexos de Pacote Avro, ORC e Parquet

Descreve o mapeamento de tipos de dados complexos Avro, ORC e Parquet para tipos de dados Oracle.

O Autonomous AI Database suporta tipos de dados complexos, incluindo os seguintes tipos complexos:

Quando você especifica um tipo de arquivo de origem Avro, ORC ou Parquet e o arquivo de origem inclui colunas complexas, as consultas do Autonomous AI Database retornam JSON para as colunas complexas. Isso simplifica o processamento dos resultados da consulta; você pode usar os poderosos recursos de análise JSON da Oracle de forma consistente entre os tipos de arquivo e os tipos de dados. A tabela a seguir mostra o formato dos tipos complexos no Autonomous AI Database:

Observação: Os campos complexos são mapeados para colunas VARCHAR2 e os limites de tamanho VARCHAR2 se aplicam.

Tipo Parquet ORC Avro Oracle
Lista: sequência de valores List List Array VARCHAR2 (formato JSON)
Mapa: lista de objetos com chave única Mapear Mapear Mapear VARCHAR2 (formato JSON)
União: valores de diferentes tipos Não Disponível União União VARCHAR2 (formato JSON)
Objeto: zero ou mais pares de chave/valor Struct Struct Registro VARCHAR2 (formato JSON)

Se seus arquivos de origem ORC, Parquet ou Avro contiverem tipos complexos, você poderá consultar a saída JSON para esses tipos complexos comuns. Por exemplo, o seguinte mostra um arquivo ORC, movie-info.orc, com um tipo complexo (o mesmo tratamento de tipo complexo se aplica aos arquivos de origem Parquet e Avro).

Considere o arquivo movie-info.orc com o seguinte esquema:

id    int
original_title string
overview       string
poster_path    string
release_date   string
vote_count     int
runtime        int
popularity     double
genres         array<struct<id:int,name:string>

Observe que cada filme é categorizado por vários genres usando um array de genres. A matriz genres é uma array de structs e cada item tem uma id (int) e uma name (string). O array genres é considerado um tipo complexo. Você pode criar uma tabela sobre esse arquivo ORC usando DBMS_CLOUD.CREATE_EXTERNAL_TABLE da seguinte forma:

BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
        table_name =>'movie_info',
        credential_name =>'OBJ_STORE_CRED',
        file_uri_list =>'https://objectstorage.us-phoenix-1.oraclecloud.com/n/mytenancy/b/movies/o/movie-info.orc',
        format => '{"type":"orc", "schema": "first"}');
END;
/

Quando você cria a tabela externa, o banco de dados gera automaticamente as colunas com base no esquema no arquivo ORC (se você estiver usando Avro ou Parquet, o mesmo se aplica). Para este exemplo, o DBMS_CLOUD.CREATE_EXTERNAL_TABLE cria uma tabela no seu banco de dados da seguinte forma:

CREATE TABLE "ADMIN"."MOVIE_INFO"
    ( "ID"
      NUMBER(10,0),
      "ORIGINAL_TITLE"  VARCHAR2(4000 BYTE) COLLATE "USING_NLS_COMP",
      "OVERVIEW"        VARCHAR2(4000 BYTE) COLLATE "USING_NLS_COMP",
      "POSTER_PATH"     VARCHAR2(4000 BYTE) COLLATE "USING_NLS_COMP",
      "RELEASE_DATE"    VARCHAR2(4000 BYTE) COLLATE "USING_NLS_COMP",
      "VOTE_COUNT"      NUMBER(10,0),
      "RUNTIME"         NUMBER(10,0),
      "POPULARITY"      BINARY_DOUBLE,
      "GENRES"          VARCHAR2(4000 BYTE) COLLATE "USING_NLS_COMP"
    )  DEFAULT COLLATION "USING_NLS_COMP"
    ORGANIZATION EXTERNAL
     ( TYPE      ORACLE_BIGDATA
       DEFAULT DIRECTORY "DATA_PUMP_DIR"
       ACCESS PARAMETERS
       ( com.oracle.bigdata.credential.name=OBJ_STORE_CRED
         com.oracle.bigdata.fileformat=ORC
   )
       LOCATION
        (
      'https://objectstorage.us-phoenix-1.oraclecloud.com/n/mytenancy/b/movies/o/movie-info.orc'
           )
     )
   REJECT LIMIT UNLIMITED
   PARALLEL;
 )

Agora você pode consultar os dados do filme:

SELECT original_title, release_date, genres
     FROM movie_info
     WHERE release_date > '2000'
     ORDER BY original_title;

Isso produz a seguinte saída:

original_title              release_date   genres
(500) Days of Summer        2009           [{"id":3,"name":"Drama"},{"id":6,"name":"Comedy"},{"id":17,"name":"Horror"},{"id":19,"name":"Western"},{"id":18,"name":"War"},{"id":15,"name":"Romance"}]
10,000 BC                   2008           [{"id":6,"name":"Comedy"}]
11:14                       2003           [{"id":9,"name":"Thriller"},{"id":14,"name":"Family"}]
127 Hours                   2010           [{"id":6,"name":"Comedy"},{"id":3,"name":"Drama"}]
13 Going on 30              2004           [{"id":6,"name":"Comedy"},{"id":3,"name":"Drama"},{"id":18,"name":"War"},{"id":15,"name":"Romance"}]
1408                        2007           [{"id":45,"name":"Sci-Fi"},{"id":6,"name":"Comedy"},{"id":17,"name":"Horror"},{"id":6,"name":"Comedy"},{"id":18,"name":"War"}]

Observe que o tipo complexo genres é retornado como um array JSON.

Para tornar os dados JSON mais úteis, você pode transformar a coluna usando as funções JSON da Oracle. Por exemplo, você pode usar a notação "." JSON, bem como as funções de transformação mais avançadas, como JSON_TABLE.

Consulte Simple Dot-Notation Access to JSON Data no Oracle Database 19c JSON Developer's Guide ou Oracle Database 26ai JSON Developer's Guide para obter informações sobre a notação ".".

Consulte SQL/JSON Function JSON_TABLE no Oracle Database 19c JSON Developer's Guide ou Oracle Database 26ai JSON Developer's Guide para obter informações sobre JSON_TABLE.

O exemplo a seguir mostra uma consulta na tabela que pega cada valor da matriz e transforma o valor em uma linha no conjunto de resultados:

SELECT original_title, release_date, m.genre_name, genres
    FROM movie_info mi,
       JSON_TABLE(mi.genres, '$.name[*]'
        COLUMNS (genre_name VARCHAR2(25) PATH
      '$')
                 ) AS m
 WHERE rownum < 10;

O JSON_TABLE cria uma linha para cada valor da matriz, pensa na junção externa e a estrutura é analisada para extrair o nome do gênero. Isso produz a seguinte saída:

original_title                   release_date         genre_name        genres
(500) Days of Summer             2009                 Drama             [{"id":3,"name":"Drama"},{"id":6,"name":"Comedy"},
                                                                        {"id":17,"name":"Horror"},{"id":19,"name":"Western"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]
(500) Days of Summer             2009                 Comedy            [{"id":3,"name":"Drama"},{"id":6,"name":"Comedy"},
                                                                        {"id":17,"name":"Horror"},{"id":19,"name":"Western"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]
(500) Days of Summer             2009                 Horror            [{"id":3,"name":"Drama"},{"id":6,"name":"Comedy"},
                                                                        {"id":17,"name":"Horror"},{"id":19,"name":"Western"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]
(500) Days of Summer             2009                 Western           [{"id":3,"name":"Drama"},{"id":6,"name":"Comedy"},
                                                                        {"id":17,"name":"Horror"},{"id":19,"name":"Western"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]
(500) Days of Summer             2009                 War               [{"id":3,"name":"Drama"},{"id":6,"name":"Comedy"},
                                                                        {"id":17,"name":"Horror"},{"id":19,"name":"Western"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]
(500) Days of Summer             2009                 Romance           [{"id":3,"name":"Drama"},{"id":6,"name":"Comedy"},
                                                                        {"id":17,"name":"Horror"},{"id":19,"name":"Western"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]
10,000 BC                        2008                 Comedy            [{"id":6,"name":"Comedy"}]
11:14                            2003                 Family            [{"id":9,"name":"Thriller"},{"id":14,"name":"Family"}]
11:14                            2003                 Thriller          [{"id":9,"name":"Thriller"},{"id":14,"name":"Family"}]
127 Hours                        2010                 Comedy            [{"id":6,"name":"Comedy"},{"id":3,"name":"Drama"}]
127 Hours                        2010                 Drama             [{"id":6,"name":"Comedy"},{"id":3,"name":"Drama"}]
13 Going on 30                   2004                 Romance           [{"id":6,"name":"Comedy"},{"id":3,"name":"Drama"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]
13 Going on 30                   2004                 Comedy            [{"id":6,"name":"Comedy"},{"id":3,"name":"Drama"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]
13 Going on 30                   2004                 War               [{"id":6,"name":"Comedy"},{"id":3,"name":"Drama"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]
13 Going on 30                   2004                 Drama             [{"id":6,"name":"Comedy"},{"id":3,"name":"Drama"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]

DBMS_CLOUD - Mapeamento de Nome de Coluna Pacote Avro, ORC e Parquet para Oracle

Descreve as regras de como os nomes de coluna Avro, ORC e Parquet são convertidos em nomes de coluna Oracle.

Os seguintes são suportados para nomes de coluna Avro, ORC e Parquet, mas podem exigir o uso de aspas duplas para referências do Oracle SQL em tabelas externas. Assim, para facilitar o uso e evitar a necessidade de usar aspas duplas ao fazer referência a nomes de colunas, se possível, não use os seguintes nomes de colunas Avro, ORC e Parquet:

A tabela a seguir mostra vários tipos de nomes de colunas Avro, ORC e Parquet e regras para usar os nomes de colunas nos nomes de colunas Oracle em tabelas externas.

Nome de Avro, ORC ou Parquet CREATE TABLE Nome CATÁLOGO Oracle SQL Válido Notas
parte, Peça ou Peça parte, parte, parte PARTE

select part

select Part

select paRt

select PART

O Oracle implicitamente coloca os nomes de colunas sem aspas em letras maiúsculas.
Nº da Ordem "Nº da Ordem" Nº da Ordem select "Ord No" Aspas duplas são necessárias quando há espaços em branco incorporados, o que também preserva as letras maiúsculas e minúsculas do caractere.
__index_key__ "__index_key__" __index_key__ select "__index_key__" Aspas duplas são necessárias quando há um sublinhado à esquerda, que também preserva as letras maiúsculas e minúsculas do caractere.
6 vias "6 Caminho" 6 vias select "6Way" As aspas duplas são necessárias quando há um dígito numérico à esquerda, o que também preserva as letras maiúsculas e minúsculas.
criar, Criar ou CRIAR, e assim por diante. (qualquer variação de caso) partição, Partição, PARTIÇÃO etc. (para uma palavra Reservada pela Oracle) "CRIAR" "PARTIÇÃO" CRIAR PARTIÇÃO

select "CREATE"

select "PARTITION"

Aspas duplas são necessárias em torno de palavras reservadas do Oracle SQL. Eles são forçados a usar letras maiúsculas, mas sempre devem ter aspas duplas quando usados em qualquer lugar no SQL.
ROWID, ROWID, ROWID, etc. (para ROWID, consulte as observações) ide da linha  

select "rowid"

select "Rowid"

select "ROWid"

select "rowid"

Para ROWID, qualquer variação entre maiúsculas e minúsculas de ROWID preserva a caixa e deve sempre ter aspas duplas e usar as variações de caixa originais. Devido ao conflito inerente com o Oracle ROWID da tabela, se você especificar ROWID maiúsculo, ele será armazenado automaticamente como "ROWID" minúsculo e sempre deverá ter aspas duplas quando referenciado.

Observações