Esegui query su tabelle Apache Iceberg

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

Informazioni sull'esecuzione di query sulle tabelle di Apache Iceberg

Autonomous Database supporta l'esecuzione di query sulle tabelle Apache Iceberg memorizzate in Amazon Web Services (AWS) o nello storage degli oggetti Oracle Cloud Infrastructure (OCI).

Configurazioni supportate

Sono supportate le configurazioni specifiche riportate di seguito.

Limitazioni

  • Tavole di Iceberg partizionate

    Oracle non supporta le tabelle partizionate con Iceberg.

  • Aggiornamenti a livello di riga delle tabelle Iceberg

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

  • Evoluzione dello schema

    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 rispetto a 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 di Apache Iceberg

La comprensione dei seguenti concetti è utile per eseguire query sulle tabelle 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 per una tabella Iceberg, i motori di query devono prima accedere al catalogo e ottenere la posizione del file di metadati più recente. Sono già disponibili numerose implementazioni di cataloghi, 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 di tabella, dello schema di partizionamento e delle informazioni sullo schema. Il file di metadati è il punto di accesso a una gerarchia di elenchi manifest e file manifest. 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 delle tabelle utilizzando la funzione di copia su scrittura o di unione sulla 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 copia su scrittura. Le query sulle tabelle iceberg non riescono se vengono rilevati 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. Tenere presente che le tabelle esterne Oracle hanno uno schema fisso, determinato dalla versione dello schema più corrente al momento della creazione della tabella. Le query Iceberg non riescono quando i metadati sottoposti a query puntano a una versione dello schema diversa rispetto a quella utilizzata al momento della creazione della tabella. Per ulteriori informazioni, vedere Evoluzione dello schema.

Partitioning

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

Esempi: esecuzione di query sulle tabelle di Apache Iceberg

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 gli 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.

Eseguire una query su una tabella Iceberg in AWS utilizzando Glue Data Catalog

In questo esempio viene eseguita una query sulla tabella Iceberg iceberg_parquet_time_dim.Segue una 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 riportati di seguito.

Segue una descrizione di example_1_details_v1.png
Descrizione dell'immagine 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 viene specificato che la tabella utilizza AWS Glue come tipo di catalogo e l'area del catalogo viene impostata 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 ogni account. L'elemento iceberg_table_path nella sezione protocol_config utilizza un percorso $database_name.$table_name per specificare il nome della tabella Colla e il nome del database. Infine, i parametri column_list e field_list rimangono nulli perché lo schema della tabella viene derivato automaticamente dai metadati Iceberg.

Per ulteriori informazioni sulla creazione della credenziale, vedere CREATE_CREDENTIAL Procedura. Per informazioni sulle risorse AWS Glue, vedere Specifica degli ARN delle risorse AWS Glue.

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

Se si conosce la posizione del file di metadati per una tabella Iceberg, è possibile creare una tabella esterna senza specificare un catalogo, come indicato di seguito.

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

Il parametro file_uri_list viene utilizzato per specificare la posizione del file di metadati in formato URL di tipo Virtual-Hosted 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 nuovi snapshot 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 Iceberg in una sottocartella $database_name/$table_name in questa directory. Viene inoltre utilizzato un file version-hint.text contenente 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. Di seguito è riportato il layout di storage su OCI per la tabella icebergTablePy.

Segue una descrizione di example_3_table_v1.png
Descrizione dell'immagine 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 eseguire una query sulla 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 di storage degli oggetti cloud.