Esegui query su tabelle iceberg Apache

Autonomous Database supporta l'esecuzione di query sulle tabelle Apache Iceberg.

Informazioni sull'esecuzione di query sulle tabelle Iceberg Apache

Autonomous Database supporta l'esecuzione di query sulle tabelle Apache Iceberg.

Configurazioni supportate

Sono supportate queste configurazioni specifiche:

Limitazioni

  • Tavole dell'iceberg partizionate

    Oracle non supporta le tabelle partizionate Iceberg.

  • Aggiornamenti a livello di riga delle tabelle Iceberg

    Oracle non supporta l'unione su lettura per gli aggiornamenti della tabella Iceberg. Le query che rilevano file eliminati nei metadati Iceberg non riusciranno. Per ulteriori informazioni sull'unione in lettura, vedere Enum RowLevelOperationMode.

  • Evoluzione degli schemi

    Lo schema per le tabelle esterne Oracle è fisso e riflette la versione dello schema Iceberg al momento della creazione della tabella esterna. Le query non riescono se i metadati Iceberg puntano a una versione dello schema diversa da quella utilizzata per creare la tabella Iceberg. Se lo schema Iceberg cambia dopo la creazione della tabella esterna, si consiglia di ricreare la tabella esterna.

Concetti relativi all'esecuzione di query sulle tabelle dell'iceberg Apache

Una comprensione dei seguenti concetti è utile per interrogare le tabelle di Apache Iceberg.

Catalogo Iceberg

Il catalogo Iceberg è un servizio che gestisce i metadati delle tabelle, ad esempio gli snapshot delle tabelle, lo schema delle tabelle e le informazioni di partizionamento. Per eseguire una query sullo snapshot più recente di una tabella Iceberg, i motori di query devono prima accedere al catalogo e ottenere la posizione del file di metadati più recente. Esistono già diverse implementazioni di cataloghi disponibili, tra cui AWS Glue, Hive, Nessie e Hadoop. Autonomous Database supporta il catalogo AWS Glue e l'implementazione HadoopCatalog utilizzata da Spark.

Per ulteriori informazioni, vedere Concorrenza ottimistica.

File di metadati

Il file di metadati è un documento JSON che tiene traccia degli snapshot della tabella, dello schema di partizionamento e delle informazioni sullo schema. Il file di metadati è il punto di ingresso di una gerarchia di elenchi di manifesti e file manifesto. I file manifesto tengono traccia dei file di dati della tabella insieme a informazioni quali il partizionamento e le statistiche delle colonne. Per ulteriori informazioni, vedere Specifica della tabella Iceberg.

Transazioni

Iceberg supporta gli aggiornamenti a livello di riga alle tabelle utilizzando copia su scrittura o unione su lettura. Copy-on-write genera nuovi file di dati che riflettono le righe aggiornate, mentre merge-on-read genera nuovi "delete files" che devono essere uniti ai file di dati durante la lettura. Oracle supporta la funzione di copia su scrittura. Le query sulle tabelle iceberg non riescono se incontrano un file di eliminazione. Per ulteriori informazioni, vedere RowLevelOperationMode.

Evoluzione degli schemi

Iceberg supporta l'evoluzione dello schema. Le modifiche allo schema si riflettono nei metadati Iceberg utilizzando un ID schema. Si noti che le tabelle esterne Oracle dispongono di uno schema fisso, determinato dalla versione dello schema più recente al momento della creazione della tabella. Le query Iceberg non riescono quando i metadati interrogati puntano a una versione dello schema diversa rispetto a quella utilizzata al momento della creazione della tabella. Per ulteriori informazioni, vedere Evoluzione schema.

Partizionamento

Iceberg supporta opzioni di partizionamento avanzate come il partizionamento nascosto e l'evoluzione della partizione che si basano sull'elaborazione/alterazione dei metadati della tabella senza costose modifiche al layout dei dati.

Esempi: query sulle tabelle dell'iceberg Apache

Questi esempi mostrano come eseguire query sulle tabelle Apache Iceberg su Amazon Web Services (AWS) e Oracle Cloud Infrastructure (OCI), utilizzando un Data Catalog e utilizzando URL diretti per il file manifesto radice.

Per informazioni dettagliate sulla creazione di tabelle esterne per Apache Iceberg, vedere CREATE_EXTERNAL_TABLE Procedura per Apache Iceberg .

Esegui query su una tabella Iceberg su AWS utilizzando un Data Catalog di colla

In questo esempio viene eseguita una query sulla tabella Iceberg iceberg_parquet_time_dim.Segue la descrizione di example_1_table.png
Descrizione dell'immagine example_1_table.png

La tabella appartiene al database Glue my-iceberg-db ed è memorizzata nella cartella s3://my-iceberg-bucket/iceberg-loc.

I dettagli della tabella per iceberg_parquet_time_dim sono mostrati qui:

Segue la descrizione di example_1_details_v1.png
Descrizione dell'illustrazione example_1_details_v1.png

È possibile creare una tabella esterna per iceberg_parquet_time_dim come indicato di seguito.

BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
    table_name       => 'iceberg_parquet_time_dim',
    credential_name  => 'AWS_CRED',
    file_uri_list    => '',
    format           =>
      '{"access_protocol":
        {
         "protocol_type": "iceberg",
         "protocol_config":
          {
           "iceberg_catalog_type": "aws_glue",
           "iceberg_glue_region": "us-west-1",
           "iceberg_table_path": "my-iceberg-db.iceberg_parquet_time_dim"
          }
        }
      }'
  );
END;
/

Nella sezione protocol_config si specifica che la tabella utilizza AWS Glue come tipo di catalogo e si imposta l'area del catalogo su us-west-1.

La credenziale AWS_CRED viene creata utilizzando dbms_cloud.create_credential con una chiave API AWS. L'istanza di Glue Data Catalog è determinata dall'ID account associato a AWS_CRED per l'area us-west-1, poiché esiste un'unica area di Glue Data Catalog per ciascun account. L'elemento iceberg_table_path nella sezione protocol_config utilizza un percorso $database_name.$table_name per specificare il nome della tabella Glue e il nome del database. Infine, i parametri column_list e field_list vengono lasciati nulli perché lo schema della tabella viene derivato automaticamente dai metadati Iceberg.

Per ulteriori informazioni sulla creazione della credenziale, vedere CREATE_CREDENTIAL Procedure.

Per informazioni sulle risorse AWS Glue, vedere Specifica degli ARN delle risorse AWS Glue.

Eseguire una query su una tabella Iceberg su AWS utilizzando la posizione del file di metadati radice

Se conosciamo la posizione del file di metadati per una tabella Iceberg, possiamo creare una tabella esterna senza specificare un catalogo, come segue:

BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
    table_name       => 'iceberg_parquet_time_dim',
    credential_name  => 'AWS_CRED',
    file_uri_list    => 'https://my-iceberg-bucket.s3.us-west-1.amazonaws.com/iceberg-loc/metadata/00004-1758ee2d-a204-4fd9-8d52-d17e5371a5ce.metadata.json',
    format           =>'{"access_protocol":{"protocol_type":"iceberg"}}');
END;
/

Utilizziamo il parametro file_uri_list per specificare la posizione del file di metadati nel formato URL di tipo host virtuale AWS S3. Per informazioni su questo formato, vedere Metodi di accesso a un bucket S3 AWS.

In questo esempio, il database accede direttamente al file di metadati, pertanto non è necessario fornire una sezione protocol_config nel parametro format. Quando si utilizza la posizione del file di metadati per creare una tabella esterna, il database esegue una query sullo snapshot più recente a cui fa riferimento il file di metadati. Gli aggiornamenti successivi alla tabella Iceberg, che creano nuove istantanee e nuovi file di metadati, non saranno visibili al database.

Eseguire una query su una tabella Iceberg che utilizza il catalogo Hadoop su OCI

In questo esempio viene eseguita una query sulla tabella Iceberg icebergTablePy, creata utilizzando OCI Data Flow, in cui Spark utilizza l'implementazione HadoopCatalog per il catalogo Iceberg. HadoopCatalog utilizza una directory warehouse e inserisce i metadati di Iceberg in una sottocartella $database_name/$table_name in questa directory. Utilizza anche un file version-hint.text che contiene il numero di versione per la versione più recente del file di metadati. Per l'esempio su Github, vedere Supporto Iceberg su OCI Data Flow.

La tabella di esempio db.icebergTablePy è stata creata utilizzando una cartella warehouse, denominata iceberg, nel bucket OCI my-iceberg-bucket. Il layout di storage in OCI per la tabella icebergTablePy è mostrato di seguito:

Segue la descrizione di example_3_table_v1.png
Descrizione dell'illustrazione example_3_table_v1.png

Creare una tabella esterna per la tabella db.icebergTablePy come indicato di seguito.

BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
    table_name       => 'iceberg_parquet_time_dim3',
    credential_name  => 'OCI_CRED',
    file_uri_list    => '',
    format           =>'{"access_protocol":{"protocol_type":"iceberg",
        "protocol_config":{"iceberg_catalog_type": "hadoop",
        "iceberg_warehouse":"https://objectstorage.uk-cardiff-1.oraclecloud.com/n/my-tenancy/b/my-iceberg-bucket/o/iceberg",
        "iceberg_table_path": "db.icebergTablePy"}}}');
END;
/

Eseguire una query su una tabella Iceberg in OCI utilizzando la posizione del file di metadati radice

Possiamo interrogare la tabella Iceberg descritta nella sezione precedente utilizzando direttamente l'URL per il file di metadati, come segue:

BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
    table_name       => 'iceberg_parquet_time_dim4',
    credential_name  => 'OCI_CRED',
    file_uri_list    => 'https://objectstorage.uk-cardiff-1.oraclecloud.com/n/my-tenancy/b/my-iceberg-bucket/o/iceberg/db/icebergTablePy/metadata/v2.metadata.json',
    format           =>'{"access_protocol":{"protocol_type":"iceberg"}}'
    );
  END;
/

In questo esempio, viene utilizzato il parametro file_uri_list per specificare l'URI per il file di metadati utilizzando il formato URI OCI nativo. Quando si utilizza l'URI del file di metadati, la tabella esterna esegue sempre una query sullo snapshot più recente memorizzato nel file specifico. Gli aggiornamenti successivi che generano nuovi snapshot e nuovi file di metadati non sono accessibili alla query.

Per ulteriori informazioni sul formato URI OCI nativo, vedere Formati URI dello storage degli oggetti cloud.