Supporto DBMS_CLOUD Avro, ORC e Parquet

Questa sezione descrive il supporto di DBMS_CLOUD Avro, ORC e Parquet fornito con Autonomous AI Database.

Opzioni formato pacchetto DBMS_CLOUD per Avro, ORC o Parquet

L'argomento del formato in DBMS_CLOUD specifica il formato dei file di origine.

Di seguito sono riportati i due modi per specificare l'argomento del formato.

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

and

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

Esempi:

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

Per specificare più opzioni di formato, separare i valori con ",".

Ad esempio:

format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
Opzione di formato Descrizione Sintassi
regexuri

Quando il valore di regexuri è impostato su TRUE, è possibile utilizzare i caratteri jolly e le espressioni regolari nei nomi dei file negli URI dei file di origine cloud.

I caratteri "*" e "?" sono considerati caratteri jolly quando il parametro regexuri è impostato su FALSE. Se il parametro regexuri è impostato su TRUE, i caratteri "*" e "?" fanno parte del pattern di espressione regolare specificato.

I pattern di espressione regolari sono supportati solo per il nome file o il percorso della sottocartella negli URI e la corrispondenza dei pattern è identica a quella eseguita dalla funzione REGEXP_LIKE. I pattern di espressione regolare non sono supportati per i nomi delle directory.

Per le tabelle esterne, questa opzione è supportata solo con le tabelle create in un file nello storage degli oggetti.

Ad esempio:

format => JSON_OBJECT('regexuri' value TRUE)

Per ulteriori informazioni sulla condizione REGEXP_LIKE, vedere REGEXP_LIKE Condition in Oracle Database 19c SQL Language Reference o Oracle Database 26ai SQL Language Reference.

regexuri: True

Valore predefinito:False

type Specifica il tipo di file.

type: avro | orc | parquet

schema

Quando lo schema è impostato su first o all, le colonne e i tipi di dati della tabella esterna vengono derivati automaticamente dai metadati del file Avro, ORC o Parquet.

I nomi delle colonne corrispondono a quelli trovati in Avro, ORC o Parquet. I tipi di dati vengono convertiti dai tipi di dati Avro, ORC o Parquet ai tipi di dati Oracle. Tutte le colonne vengono aggiunte alla tabella.

Il valore first specifica di utilizzare i metadati del primo file Avro, ORC o Parquet nel file file_uri_list per generare automaticamente le colonne e i relativi tipi di dati. Utilizzare first se tutti i file hanno lo stesso schema.

Il valore all specifica di utilizzare i metadati di tutti i file Avro, ORC o Parquet nel file file_uri_list per generare automaticamente le colonne e i relativi tipi di dati. Utilizzare all (più lento) se i file possono avere schemi diversi.

Impostazione predefinita: se si specifica column_list, il valore schema, se specificato, viene ignorato. Se column_list non viene specificato, il valore predefinito di schema è first.

Nota: per i file in formato Avro, ORC o Parquet, l'opzione di formato schema non è disponibile e il parametro column_list deve essere specificato per le tabelle esterne partizionate utilizzando la procedura DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE.

schema : first | all

Mapping tra media e tipo di dati Oracle del package DBMS_CLOUD

Descrive il mapping dei tipi di dati Avro ai tipi di dati Oracle.

Nota: tipi complessi, ad esempio mappe, array e strutture, sono supportati a partire da Oracle Database 19c. Per informazioni sull'uso dei tipi complessi Avro, ORC e Parquet, vedere DBMS_CLOUD Package Avro, ORC e Parquet.

Tipo medio Tipo specifico Oracle
INT NUMBER(10)
LONG NUMERO(19)
BOOL NUMERO(1)
BYTE_ARRAY UTF8 RAW(2000)
FLT BINARY_FLOAT
DBL BINARY_DOUBLE
DECIMALE(p) NUMERO(p)
DECIMAL(p,s) NUMERO(p,s)
DATE DATE
STRING VARCHAR2
MULINO A TEMPO VARCHAR2(20 BYTE)
TIME_MICROS VARCHAR2(20 BYTE)
TIMESTAMP_MILIS TIMESTAMP(3)
TIMESTAMP_MICROS TIMESTAMP(6)
ENUM VARCHAR2(n) Dove: "n" è la lunghezza massima effettiva dei valori possibili di AVRO ENUM
DURATION RAW(2000)
FISSO RAW(2000)
NULL VARCHAR2(1) BYTE

Per informazioni sull'uso dei tipi complessi Avro, ORC e Parquet, vedere DBMS_CLOUD Package Avro, ORC e Parquet.

Mapping tra package ORC e tipo dati Oracle DBMS_CLOUD

Descrive il mapping dei tipi di dati ORC ai tipi di dati Oracle.

Per informazioni sull'uso dei tipi complessi ORC, vedere DBMS_CLOUD Package Avro, ORC e Parquet.

Tipo ORC Tipo specifico Oracle Ulteriori informazioni
array Formato JSON VARCHAR2(n) DBMS_CLOUD Package - Tipi complessi Avro, ORC e Parquet
bigint (64 bit) NUMERO(19)  
binario BLOB  
booleano (1 bit) NUMERO(1)  
char CHAR(n)  
data DATE  
double BINARY_DOUBLE  
float BINARY_FLOAT  
int (32 bit) NUMBER(10)  
list Formato JSON VARCHAR2(n) DBMS_CLOUD Package - Tipi complessi Avro, ORC e Parquet
mappa Formato JSON VARCHAR2(n) DBMS_CLOUD Package - Tipi complessi Avro, ORC e Parquet
smallint (16 bit) NUMERO(5)  
stringa VARCHAR2(4000)  
struct Formato JSON VARCHAR2(n) DBMS_CLOUD Package - Tipi complessi Avro, ORC e Parquet
indicatore orario TIMESTAMP  
tinyint (8 bit) NUMERO(3)  
union Formato JSON VARCHAR2(n) DBMS_CLOUD Package - Tipi complessi Avro, ORC e Parquet
varchar VARCHAR2(n)  

Mapping tra Parquet package DBMS_CLOUD e tipo di dati Oracle

Descrive il mapping dei tipi di dati Parquet ai tipi di dati Oracle.

Nota: tipi complessi, ad esempio mappe, array e strutture, sono supportati a partire da Oracle Database 19c. Per informazioni sull'uso dei tipi complessi Parquet, vedere DBMS_CLOUD Package Avro, ORC e Parquet.

Tipo di parquet Tipo specifico Oracle
SUGGERIMENTO_64 NUMERO (20)
INT_64 NUMERO(19)
SUGGERIMENTO_32 NUMBER(10)
INT_32 NUMBER(10)
UINT_16 NUMERO(5)
INT_16 NUMERO(5)
UINT_8 NUMERO(3)
INT_8 NUMERO(3)
BOOL NUMERO(1)
BYTE_ARRAY UTF8 VARCHAR2(4000 BYTE)
FLT BINARY_FLOAT
DBL BINARY_DOUBLE
DECIMALE(p) NUMERO(p)
DECIMAL(p,s) NUMERO(p,s)
DATE DATE
STRING VARCHAR2(4000)
MULINO A TEMPO VARCHAR2(20 BYTE)
TEMPO_MILLIS_UTC VARCHAR2(20 BYTE)
TIME_MICROS VARCHAR2(20 BYTE)
TIME_MICROS_UTC VARCHAR2(20 BYTE)
TIMESTAMP_MILIS TIMESTAMP(3)
TIMESTAMP_MILLIS_UTC TIMESTAMP(3)
TIMESTAMP_MICROS TIMESTAMP(6)
TIMESTAMP_MICROS_UTC TIMESTAMP(6)
INDICATORE ORARIO - NANO TIMESTAMP(9)

Per informazioni sull'uso dei tipi complessi Parquet, vedere DBMS_CLOUD Package Avro, ORC e Parquet.

Mapping tra tipo di dati Oracle e parquet del package DBMS_CLOUD

Descrive il mapping dei tipi di dati Oracle ai tipi di dati Parquet.

Tipo specifico Oracle Tipo di parquet
BINARY_DOUBLE DBL
BINARY_FLOAT FLT
DATE DATE
NUMERO(p,s) DECIMAL(p,s)
NUMERO(p) DECIMALE(p)
TIMESTAMP(3) TIMESTAMP_MILIS
TIMESTAMP(3) TIMESTAMP_MILLIS_UTC
TIMESTAMP(6) TIMESTAMP_MICROS
TIMESTAMP(6) TIMESTAMP_MICROS_UTC
TIMESTAMP(9) INDICATORE ORARIO - NANO
VARCHAR2(4000) STRING

Parametri sessione NLS

I parametri di sessione NLS NLS_DATE_FORMAT, NLS_TIMESTAMP_FORMAT, NLS_TIMESTAMP_TZ_FORMAT e NLS_NUMERIC_CHARACTERS definiscono il modo in cui la data, l'indicatore orario, l'indicatore orario con il formato del fuso orario e il separatore radix per l'indicatore orario con indicatore decimale devono essere visualizzati quando viene eseguita una query su una tabella con tali tipi di colonna.

Inoltre, quando si esportano i dati utilizzando DBMS_CLOUD.EXPORT_DATA e si specifica l'output Parquet, Autonomous AI Database legge i valori di questi parametri dalla tabella NLS_SESSION_PARAMETERS. Autonomous AI Database utilizza questi valori per convertire i tipi di dati Oracle DATE o TIMESTAMP in tipi Parquet.

I parametri NLS_SESSION_PARAMETERS supportano una maschera di formato RR (specifica di due caratteri anno).

La maschera di formato RR per l'anno non è supportata per questi parametri quando si esportano i dati in Parquet con DBMS_CLOUD.EXPORT_DATA. Viene generato un errore dell'applicazione se si tenta di eseguire l'esportazione in parquet e NLS_SESSION_PARAMETERS viene impostato per utilizzare la maschera di formato RR (il valore predefinito per il formato RR dipende dal valore del parametro NLS_TERRITORY).

Quando uno dei parametri NLS_DATE_FORMAT, NLS_TIMESTAMP_FORMAT o NLS_TIMESTAMP_TZ_FORMAT utilizza la maschera di formato RR, è necessario modificare il valore del formato in un valore supportato per esportare i dati in Parquet con DBMS_CLOUD.EXPORT_DATA. Ad esempio:

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';

Dopo aver modificato il valore, è possibile verificare la modifica eseguendo una query sulla vista 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 è impostato, viene applicato alle colonne con tipo di dati DATE. Se NLS_TIMESTAMP_FORMAT è impostato, viene applicato alle colonne con tipo di dati TIMESTAMP. Se NLS_TIMESTAMP_TZ_FORMAT è impostato, viene applicato alle colonne con tipo di dati TIMESTAMP WITH TIME ZONE.

Per ulteriori informazioni, vedere Date and Time Parameters in Oracle Database 19c Database Globalization Support Guide o Oracle Database 26ai Database Globalization Support Guide e NLS Data Dictionary Views in Oracle Database 19c Database Globalization Support Guide o Oracle Database 26ai Database Globalization Support Guide.

DBMS_CLOUD Package - Tipi complessi Avro, ORC e Parquet

Descrive il mapping dei tipi di dati complessi Avro, ORC e Parquet ai tipi di dati Oracle.

Autonomous AI Database supporta tipi di dati complessi, inclusi i tipi complessi riportati di seguito.

Quando si specifica un tipo di file di origine Avro, ORC o Parquet e il file di origine include colonne complesse, le query di Autonomous AI Database restituiscono JSON per le colonne complesse. Ciò semplifica l'elaborazione dei risultati delle query; puoi utilizzare le potenti funzioni di analisi JSON di Oracle in modo coerente tra i tipi di file e i tipi di dati. La tabella seguente mostra il formato per i tipi complessi in Autonomous AI Database:

Nota: i campi complessi sono mappati alle colonne VARCHAR2 e ai limiti di dimensione VARCHAR2.

Type Parquet ORC Avro Oracle
Elenco: sequenza di valori List List Array VARCHAR2 (formato JSON)
Mappa: elenco di oggetti con chiave singola Mappa Mappa Mappa VARCHAR2 (formato JSON)
Unione: valori di tipo diverso Non disponibile UNION UNION VARCHAR2 (formato JSON)
Oggetto: zero o più coppie chiave-valore Strutt. Strutt. Record VARCHAR2 (formato JSON)

Se i file di origine ORC, Parquet o Avro contengono tipi complessi, è possibile eseguire una query sull'output JSON per questi tipi complessi comuni. Ad esempio, di seguito viene mostrato un file ORC, movie-info.orc, con un tipo complesso (la stessa gestione del tipo complesso è valida per i file di origine Parquet e Avro).

Si consideri il file movie-info.orc con lo schema seguente:

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>

Si noti che ogni filmato è classificato da più genres utilizzando un array di genres. L'array genres è un array di structs e ogni elemento ha un id (int) e un name (string). L'array genres è considerato un tipo complesso. È possibile creare una tabella su questo file ORC utilizzando DBMS_CLOUD.CREATE_EXTERNAL_TABLE come indicato di seguito.

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 si crea la tabella esterna, il database genera automaticamente le colonne in base allo schema nel file ORC (se si utilizza Avro o Parquet, lo stesso vale). In questo esempio, DBMS_CLOUD.CREATE_EXTERNAL_TABLE crea una tabella nel database come indicato di seguito.

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

Ora è possibile eseguire una query sui dati del filmato:

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

Viene prodotto l'output raffigurato di seguito:

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"}]

Si noti che il tipo complesso genres viene restituito come array JSON.

Per rendere i dati JSON più utili, puoi trasformare la colonna utilizzando le funzioni JSON di Oracle. Ad esempio, è possibile utilizzare la notazione JSON "." e le funzioni di trasformazione più potenti come JSON_TABLE.

Per informazioni sulla notazione ", vedere Simple Dot-Notation Access to JSON Data in Oracle Database 19c JSON Developer's Guide o Oracle Database 26ai JSON Developer's Guide.

Per informazioni su JSON_TABLE, vedere SQL/JSON Function JSON_TABLE in Oracle Database 19c JSON Developer's Guide o Oracle Database 26ai JSON Developer's Guide.

L'esempio seguente mostra una query sulla tabella che prende ciascun valore dell'array e trasforma il valore in una riga del set di risultati:

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;

JSON_TABLE crea una riga per ogni valore dell'array, pensa outer join e la struttura viene analizzata per estrarre il nome del genere. Viene prodotto l'output raffigurato di seguito:

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"}]

Mapping tra package DBMS_CLOUD Avro, ORC e Parquet e nome colonna Oracle

Descrive le regole per la conversione dei nomi delle colonne Avro, ORC e Parquet in nomi di colonna Oracle.

Le opzioni riportate di seguito sono supportate per i nomi delle colonne Avro, ORC e Parquet, ma possono richiedere l'uso di virgolette doppie per i riferimenti Oracle SQL nelle tabelle esterne. Pertanto, per facilitare l'uso e per evitare di dover utilizzare virgolette doppie quando si fa riferimento ai nomi di colonna, se possibile, non utilizzare quanto segue nei nomi di colonna Avro, ORC e Parquet:

La tabella riportata di seguito mostra i vari tipi di nomi di colonna Avro, ORC e Parquet e le regole per l'utilizzo dei nomi di colonna nei nomi di colonna Oracle nelle tabelle esterne.

Nome Avro, ORC o Parquet CREATE TABLE Name CATALOGO Oracle SQL valido Note
parte, parte o parte parte, parte, parte PARTE

select part

select Part

select paRt

select PART

Oracle applica in modo implicito le maiuscole ai nomi delle colonne senza virgolette.
N. ordine "N. ordine" N. ordine select "Ord No" Le virgolette doppie sono necessarie quando sono presenti spazi vuoti incorporati, che conserva anche la maiuscola del carattere.
__chiave_indice__ "__index_key__" __chiave_indice__ select "__index_key__" Le virgolette doppie sono necessarie quando è presente un carattere di sottolineatura iniziale, che conserva anche il carattere maiuscolo.
6Vie "6 canali" 6Modalità select "6Way" Le virgolette doppie sono obbligatorie quando è presente una cifra numerica iniziale, che conserva anche la maiuscola.
creare, creare o CREARE e così via (qualsiasi variazione di caso) partizione, partizione, PARTIZIONE e così via (per una parola riservata Oracle) "CREA" "PARTIZIONE" CREA UNA PARTIZIONE

select "CREATE"

select "PARTITION"

Le virgolette doppie sono obbligatorie per le parole riservate di Oracle SQL. Questi sono forzati in maiuscolo, ma devono sempre essere racchiusi tra virgolette doppie quando vengono utilizzati in qualsiasi posizione in SQL.
ROWID, ROWID, ROWID e così via (per ROWID vedere le note) idriga  

select "rowid"

select "Rowid"

select "ROWid"

select "rowid"

Per ROWID, qualsiasi variazione mista o minuscola di ROWID conserva la custodia e deve sempre essere racchiusa tra virgolette doppie e utilizzare le variazioni originali della custodia. A causa del conflitto intrinseco con Oracle ROWID per la tabella, se si specifica ROWID maiuscolo, viene memorizzato automaticamente come "ROWID" minuscolo e deve essere sempre racchiuso tra virgolette quando viene fatto riferimento.

Note