Creazione di tabelle esterne per Redshift Spectrum - Amazon Redshift

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Creazione di tabelle esterne per Redshift Spectrum

Crei una tabella esterna in uno schema esterno. Per creare tabelle esterne, devi essere il proprietario dello schema esterno o un utente con privilegi avanzati. Per trasferire la proprietà di uno schema esterno, utilizza ALTER SCHEMA per cambiare il proprietario. L'esempio seguente cambia il proprietario dello schema spectrum_schema in newowner.

alter schema spectrum_schema owner to newowner;

Per eseguire una query di Redshift Spectrum, sono necessarie le seguenti autorizzazioni:

  • Autorizzazione di utilizzare lo schema

  • Autorizzazione di creare tabelle temporanee nel database corrente

L'esempio seguente concede l'autorizzazione all'utilizzo dello schema spectrum_schema al gruppo di utenti spectrumusers.

grant usage on schema spectrum_schema to group spectrumusers;

L'esempio seguente concede l'autorizzazione temporanea per il database spectrumdb al gruppo di utenti spectrumusers.

grant temp on database spectrumdb to group spectrumusers;

Puoi creare una tabella esterna in Amazon Redshift AWS Glue, Amazon Athena o un metastore Apache Hive. Per ulteriori informazioni, consultare Nozioni di base sull'uso di AWS Glue nella Guida per gli sviluppatori di AWS Glue , Nozioni di base nella Guida per l'utente di Amazon Athena oppure Apache Hive nella Guida per gli sviluppatori di Amazon EMR.

Se la tua tabella esterna è definita in AWS Glue, Athena o in un metastore Hive, devi prima creare uno schema esterno che faccia riferimento al database esterno. È quindi possibile fare riferimento alla tabella esterna nell'istruzione SELECT aggiungendo un prefisso al nome della tabella con il nome dello schema senza che sia necessario creare la tabella in Amazon Redshift. Per ulteriori informazioni, consulta Creazione di schemi esterni per Amazon Redshift Spectrum.

Per consentire ad Amazon Redshift di visualizzare le tabelle in AWS Glue Data Catalog, aggiungi il ruolo glue:GetTable IAM di Amazon Redshift. In caso contrario, si potrebbe verificare un errore simile al seguente:

RedshiftIamRoleSession is not authorized to perform: glue:GetTable on resource: *;

Ad esempio, si supponga di avere una tabella esterna denominata lineitem_athena definita nel catalogo esterno di Athena. In tal caso, puoi definire uno schema esterno denominato athena_schema e quindi eseguire una query sulla tabella utilizzando l'istruzione SELECT seguente.

select count(*) from athena_schema.lineitem_athena;

Per definire una tabella esterna in Amazon Redshift, utilizzare il comando CREATE EXTERNAL TABLE. L'istruzione della tabella esterna definisce le colonne della tabella, il formato dei file di dati e la posizione dei dati in Amazon S3. Redshift Spectrum esegue la scansione dei file nella cartella specificata e in tutte le sottocartelle. Redshift Spectrum ignora i file nascosti e i file che iniziano con un punto, un carattere di sottolineatura o un marcatore hash ( . , _ o #) oppure che terminano con una tilde (~).

Nell'esempio seguente viene creata una tabella denominata SALES nello schema esterno Amazon Redshift denominato spectrum. I dati sono in file di testo delimitati da tabulazioni.

create external table spectrum.sales( salesid integer, listid integer, sellerid integer, buyerid integer, eventid integer, dateid smallint, qtysold smallint, pricepaid decimal(8,2), commission decimal(8,2), saletime timestamp) row format delimited fields terminated by '\t' stored as textfile location 's3://redshift-downloads/tickit/spectrum/sales/' table properties ('numRows'='172000');

Per visualizzare le tabelle esterne, eseguire una query sulla vista di sistema SVV_EXTERNAL_TABLES.

Pseudocolonne

Di default, Amazon Redshift crea tabelle esterne con le pseudocolonne $path, $size e $spectrum_oid. Selezionare la colonna $path per visualizzare il percorso ai file di dati su Simple Storage Service (Amazon S3) e selezionare la colonna $size per visualizzare le dimensioni dei file di dati per ogni riga restituita da una query. La colonna $spectrum_oid consente di eseguire query correlate con Redshift Spectrum. Per vedere un esempio, consulta Esempio: esecuzione di sottoquery correlate in Redshift Spectrum. I nomi di colonna $path, $size e $spectrum_oid devono essere delimitati da virgolette doppie. Una clausola SELECT * non restituisce le pseudocolonne. È necessario includere in modo esplicito i nomi delle colonne $path, $size e $spectrum_oid nella query, come indicato nel seguente esempio.

select "$path", "$size", "$spectrum_oid" from spectrum.sales_part where saledate = '2008-12-01';

Puoi disabilitare la creazione di pseudocolonne per una sessione impostando il parametro di configurazione spectrum_enable_pseudo_columns su false. Per ulteriori informazioni, consulta spectrum_enable_pseudo_columns. È anche possibile disabilitare solo la pseudocolonna $spectrum_oid impostando il parametro di configurazione enable_spectrum_oid su false. Per ulteriori informazioni, consulta enable_spectrum_oid. Tuttavia, disabilitando la pseudocolonna $spectrum_oid viene disabilitato anche il supporto per le query correlate con Redshift Spectrum.

Importante

La selezione di $size, $path o $spectrum_oid comporta dei costi perché Redshift Spectrum analizza i file di dati su Simple Storage Service (Amazon S3) per determinare la dimensione del set di risultati. Per ulteriori informazioni sui prezzi, consultare Prezzi di Amazon Redshift.

Esempio di pseudocolonne

L'esempio seguente restituisce la dimensione totale dei file di dati correlati per una tabella esterna.

select distinct "$path", "$size" from spectrum.sales_part; $path | $size --------------------------------------------------------------------------+------- s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/ | 1616 s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02/ | 1444 s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03/ | 1644

Partizionamento delle tabelle esterne di Redshift Spectrum

Quando esegui la partizione dei dati, puoi limitare la quantità di dati sottoposti a scansione da Redshift Spectrum filtrandoli in base a qualsiasi chiave di partizione.

In genere, si partizionano i dati in base a criteri temporali. Ad esempio, puoi scegliere di eseguire il partizionamento per anno, mese, data e ora. Se hai dati da più origini, puoi eseguire il partizionamento in base a una data e a un identificatore di origine dati.

La procedura seguente descrive come partizionare i dati.

Per partizionare i dati
  1. Archiviare i dati in cartelle di Amazon S3 in funzione della chiave di partizione.

    Creare una cartella per ogni valore di partizione e assegnare un nome alla cartella con la chiave e il valore di partizione. Ad esempio, se si esegue la partizione per data, le cartelle possono essere denominate saledate=2017-04-01, saledate=2017-04-02 e così via. Redshift Spectrum esegue la scansione dei file nella cartella di partizione e in tutte le sottocartelle. Redshift Spectrum ignora i file nascosti e i file che iniziano con un punto, un carattere di sottolineatura o un marcatore hash ( . , _ o #) oppure che terminano con una tilde (~).

  2. Creare una tabella esterna e specificare la chiave di partizione nella clausola PARTITIONED BY.

    La chiave di partizione non può essere Il nome di una colonna della tabella. Il tipo di dati può essere SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE o TIMESTAMP.

  3. Aggiungere le partizioni.

    Utilizzando ALTER TABLE … ADD PARTITION, aggiungere ogni partizione, specificando la colonna della partizione e il valore della chiave nonché la posizione della cartella di partizione in Amazon S3. È possibile aggiungere più partizioni in una singola istruzione ALTER TABLE … ADD. L'esempio seguente aggiunge partizioni per '2008-01' e '2008-03'.

    alter table spectrum.sales_part add partition(saledate='2008-01-01') location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/' partition(saledate='2008-03-01') location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03/';
    Nota

    Se utilizzi il AWS Glue catalogo, puoi aggiungere fino a 100 partizioni utilizzando una singola istruzione ALTER TABLE.

Partizionamento di esempi di dati

In questo esempio, crei una tabella esterna partizionata con una singola chiave di partizione e una tabella esterna partizionata con due chiavi di partizione.

I dati di esempio per questo esempio si trovano in un bucket Amazon S3 che consente l'accesso in lettura a tutti gli utenti autenticati. AWS Il cluster e i file di dati esterni devono trovarsi nella stessa Regione AWS. Il bucket di dati di esempio si trova nella regione Stati Uniti orientali (Virginia settentrionale) (us-east-1). Per accedere ai dati mediante Redshift Spectrum, anche il cluster deve essere nella regione us-east-1. Per elencare le cartelle in Amazon S3, emettere il comando seguente.

aws s3 ls s3://redshift-downloads/tickit/spectrum/sales_partition/
PRE saledate=2008-01/
PRE saledate=2008-03/
PRE saledate=2008-04/
PRE saledate=2008-05/
PRE saledate=2008-06/
PRE saledate=2008-12/

Se non hai ancora uno schema esterno, esegui il comando seguente. Sostituisci il AWS Identity and Access Management tuo ruolo (IAM) con Amazon Resource Name (ARN).

create external schema spectrum from data catalog database 'spectrumdb' iam_role 'arn:aws:iam::123456789012:role/myspectrumrole' create external database if not exists;

Esempio 1: partizionamento con una singola chiave di partizione

Nell'esempio seguente, crei una tabella esterna partizionata per mese.

Per creare una tabella esterna partizionata per mese, esegui il comando seguente.

create external table spectrum.sales_part( salesid integer, listid integer, sellerid integer, buyerid integer, eventid integer, dateid smallint, qtysold smallint, pricepaid decimal(8,2), commission decimal(8,2), saletime timestamp) partitioned by (saledate char(10)) row format delimited fields terminated by '|' stored as textfile location 's3://redshift-downloads/tickit/spectrum/sales_partition/' table properties ('numRows'='172000');

Per aggiungere le partizioni, esegui il comando ALTER TABLE seguente.

alter table spectrum.sales_part add partition(saledate='2008-01') location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/' partition(saledate='2008-03') location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03/' partition(saledate='2008-04') location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-04/';

Per selezionare i dati dalla tabella partizionata, esegui la seguente query.

select top 5 spectrum.sales_part.eventid, sum(spectrum.sales_part.pricepaid) from spectrum.sales_part, event where spectrum.sales_part.eventid = event.eventid and spectrum.sales_part.pricepaid > 30 and saledate = '2008-01' group by spectrum.sales_part.eventid order by 2 desc;
eventid | sum     
--------+---------
   4124 | 21179.00
   1924 | 20569.00
   2294 | 18830.00
   2260 | 17669.00
   6032 | 17265.00

Per visualizzare le partizioni delle tabelle, eseguire una query sulla vista di sistema SVV_EXTERNAL_PARTITIONS.

select schemaname, tablename, values, location from svv_external_partitions where tablename = 'sales_part';
schemaname | tablename  | values      | location                                                                
-----------+------------+-------------+-------------------------------------------------------------------------
spectrum   | sales_part | ["2008-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01
spectrum   | sales_part | ["2008-03"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03
spectrum   | sales_part | ["2008-04"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-04

Esempio 2: partizionamento con più chiavi di partizione

Per creare una tabella esterna partizionata per date e eventid, esegui il comando seguente.

create external table spectrum.sales_event( salesid integer, listid integer, sellerid integer, buyerid integer, eventid integer, dateid smallint, qtysold smallint, pricepaid decimal(8,2), commission decimal(8,2), saletime timestamp) partitioned by (salesmonth char(10), event integer) row format delimited fields terminated by '|' stored as textfile location 's3://redshift-downloads/tickit/spectrum/salesevent/' table properties ('numRows'='172000');

Per aggiungere le partizioni, esegui il comando ALTER TABLE seguente.

alter table spectrum.sales_event add partition(salesmonth='2008-01', event='101') location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-01/event=101/' partition(salesmonth='2008-01', event='102') location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-01/event=102/' partition(salesmonth='2008-01', event='103') location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-01/event=103/' partition(salesmonth='2008-02', event='101') location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-02/event=101/' partition(salesmonth='2008-02', event='102') location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-02/event=102/' partition(salesmonth='2008-02', event='103') location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-02/event=103/' partition(salesmonth='2008-03', event='101') location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-03/event=101/' partition(salesmonth='2008-03', event='102') location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-03/event=102/' partition(salesmonth='2008-03', event='103') location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-03/event=103/';

Esegui la query seguente per selezionare i dati dalla tabella partizionata.

select spectrum.sales_event.salesmonth, event.eventname, sum(spectrum.sales_event.pricepaid) from spectrum.sales_event, event where spectrum.sales_event.eventid = event.eventid and salesmonth = '2008-02' and (event = '101' or event = '102' or event = '103') group by event.eventname, spectrum.sales_event.salesmonth order by 3 desc;
salesmonth | eventname       | sum    
-----------+-----------------+--------
2008-02    | The Magic Flute | 5062.00
2008-02    | La Sonnambula   | 3498.00
2008-02    | Die Walkure     |  534.00

Mappatura delle colonne di una tabella esterna alle colonne ORC

Utilizzare le tabelle esterne di Amazon Redshift Spectrum per eseguire query sui dati dai file nel formato ORC. Il formato Optimized Row Columnar (ORC) è un formato di file di storage a colonne che supporta le strutture di dati annidate. Per ulteriori informazioni sull'esecuzione di query su dati nidificati, consultare Esecuzione di query su dati nidificati con Amazon Redshift Spectrum.

Quando crei una tabella esterna che fa riferimento ai dati in un file ORC, devi mappare ogni colonna della tabella verso una colonna nei dati ORC. A tale scopo, utilizza uno dei seguenti metodi:

La mappatura in base al nome delle colonne è l'opzione predefinita.

Mappatura in base alla posizione

Con la mappatura in base alla posizione, la prima colonna definita nella tabella esterna mappa alla prima colonna nel file di dati ORC, la seconda alla seconda e così via. Per la mappatura in base alla posizione, è necessario che l'ordine delle colonne nella tabella esterna e nel file ORC corrisponda. Diversamente, puoi mappare le colonne in base al nome.

Importante

Nelle release precedenti, Redshift Spectrum utilizzava la mappatura in base alla posizione come opzione predefinita. Se devi continuare a utilizzare la mappatura in base alla posizione per le tabelle esistenti, imposta la proprietà di tabella orc.schema.resolution su position, come mostrato nell'esempio seguente.

alter table spectrum.orc_example set table properties('orc.schema.resolution'='position');

Ad esempio, la tabella SPECTRUM.ORC_EXAMPLE è definita come segue.

create external table spectrum.orc_example( int_col int, float_col float, nested_col struct< "int_col" : int, "map_col" : map<int, array<float >> > ) stored as orc location 's3://example/orc/files/';

La struttura della tabella può essere astratta come segue.

• 'int_col' : int
• 'float_col' : float
• 'nested_col' : struct
   o 'int_col' : int
   o 'map_col' : map
      - key : int
      - value : array
         - value : float

Il file ORC sottostante presenta la seguente struttura di file.

• ORC file root(id = 0)
   o 'int_col' : int (id = 1)
   o 'float_col' : float (id = 2)
   o 'nested_col' : struct (id = 3)
      - 'int_col' : int (id = 4)
      - 'map_col' : map (id = 5)
         - key : int (id = 6)
         - value : array (id = 7)
            - value : float (id = 8)

In questo esempio, puoi mappare ciascuna colonna nella tabella esterna verso una colonna nel file di dati ORC rigorosamente in base alla posizione. Di seguito è riportata la mappatura.

Nome della colonna della tabella esterna ID della colonna ORC Nome della colonna ORC
int_col 1 int_col
float_col 2 float_col
nested_col 3 nested_col
nested_col.int_col 4 int_col
nested_col.map_col 5 map_col
nested_col.map_col.key 6 ND
nested_col.map_col.value 7 ND
nested_col.map_col.value.item 8 N/A

Mappatura in base al nome delle colonne

Tramite la mappatura dei nomi, puoi mappare le colonne in una tabella esterna verso colonne con nome nei file ORC allo stesso livello e con il medesimo nome.

Supponi ad esempio di voler mappare la tabella del precedente esempio, SPECTRUM.ORC_EXAMPLE, con un file ORC che utilizza la seguente struttura di file.

• ORC file root(id = 0)
   o 'nested_col' : struct (id = 1)
      - 'map_col' : map (id = 2)
         - key : int (id = 3)
         - value : array (id = 4)
            - value : float (id = 5)
      - 'int_col' : int (id = 6)
   o 'int_col' : int (id = 7)
   o 'float_col' : float (id = 8)

Utilizzando la mappatura basata sulla posizione, Redshift Spectrum tenta di eseguire la mappatura seguente.

Nome della colonna della tabella esterna ID della colonna ORC Nome della colonna ORC
int_col 1 struct
float_col 7 int_col
nested_col 8 float_col

Quando si esegue una query su una tabella con la precedente mappatura basata sulla posizione, il comando SELECT ha esito negativo sulla convalida del tipo in quanto le strutture sono diverse.

Puoi mappare la stessa tabella esterna verso entrambe le strutture di file mostrate negli esempi precedenti utilizzando la mappatura basata sui nomi. Le colonne di tabella int_col, float_col e nested_col vengono mappate in base al nome verso le colonne con i medesimi nomi nel file ORC. La colonna denominata nested_col nella tabella esterna è una colonna struct con sottocolonne denominate map_col e int_col. Le sottocolonne vengono inoltre mappate correttamente alle colonne corrispondenti nel file ORC in base al nome.

Creazione di tabelle esterne per i dati gestiti in Apache Hudi

Per eseguire query sui dati in formato Apache Hudi Copy On Write (CoW), è possibile utilizzare le tabelle esterne di Amazon Redshift Spectrum. Una tabella Hudi Copy On Write è una raccolta di file Apache Parquet archiviati in Amazon S3. È possibile leggere le tabelle Copy On Write (CoW) nelle versioni 0.5.2, 0.6.0, 0.7.0, 0.8.0, 0.9.0, 0.10.0, 0.10.1, 0.11.0 e 0.11.1 di Apache Hudi create e modificate mediante operazioni di scrittura insert, delete e upsert. Le tabelle bootstrap, ad esempio, non sono supportate. Per ulteriori informazioni, consultare Copia sulla tabella di scrittura nella documentazione open source di Apache Hudi.

Quando si crea una tabella esterna che fa riferimento ai dati in formato Hudi CoW, è necessario mappare ogni colonna della tabella esterna a una colonna nei dati Hudi. La mappatura viene eseguita per colonna.

Le istruzioni DDL (Data Definition Language) per tabelle Hudi partizionate e non partizionate sono simili a quelle degli altri formati di file Apache Parquet. Per le tabelle Hudi, INPUTFORMAT può essere definito come org.apache.hudi.hadoop.HoodieParquetInputFormat. Il parametro LOCATION deve puntare alla cartella di base della tabella Hudi che contiene la cartella .hoodie, necessaria per stabilire la tempistica di commit Hudi. In alcuni casi, un'operazione SELECT su una tabella Hudi potrebbe non riuscire con il messaggio Nessuna tempistica di commit Hudi valida trovata. In questo caso, verificare se la cartella .hoodie si trova nella posizione corretta e se contiene una tempistica di commit Hudi valida.

Nota

Il formato Apache Hudi è supportato solo quando si utilizza un AWS Glue Data Catalog. Non è supportato se si utilizza un metastore Apache Hive come catalogo esterno.

Il formato DDL per definire una tabella non partizionata è il seguente.

CREATE EXTERNAL TABLE tbl_name (columns) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://s3-bucket/prefix'

Il formato DDL per definire una tabella partizionata è il seguente.

CREATE EXTERNAL TABLE tbl_name (columns) PARTITIONED BY(pcolumn1 pcolumn1-type[,...]) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://s3-bucket/prefix'

Per aggiungere partizioni a una tabella Hudi partizionata, eseguire un comando ALTER TABLE ADD PARTITION in cui il parametro LOCATION punta alla sottocartella Amazon S3 con i file che appartengono alla partizione.

Il formato DDL per aggiungere le partizioni è il seguente.

ALTER TABLE tbl_name ADD IF NOT EXISTS PARTITION(pcolumn1=pvalue1[,...]) LOCATION 's3://s3-bucket/prefix/partition-path'

Creazione di tabelle esterne per i dati gestiti in Delta Lake

Per eseguire una query sui dati nelle tabelle Delta Lake, è possibile utilizzare le tabelle esterne di Amazon Redshift Spectrum.

Per accedere a una tabella Delta Lake da Redshift Spectrum, generare un manifest prima della query. Un manifest Delta Lake contiene un elenco di file che costituiscono uno snapshot coerente della tabella Delta Lake. In una tabella partizionata, esiste un solo manifest per partizione. Una tabella Delta Lake è una raccolta di file Apache Parquet archiviati in Amazon S3. Per ulteriori informazioni, consultare Delta Lake nella documentazione open source di Delta Lake.

Quando si crea una tabella esterna che fa riferimento ai dati nelle tabelle Delta Lake, viene mappata ogni colonna della tabella a una colonna nella tabella Delta Lake. La mappatura viene eseguita per nome della colonna.

La DDL per le tabelle Delta Lake partizionate e non partizionate è simile a quella degli altri formati di file Apache Parquet. Per le tabelle Delta Lake, è possibile definire INPUTFORMAT come org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat e OUTPUTFORMAT come org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat. Il parametro LOCATION deve puntare alla cartella del manifest nella cartella di base della tabella. Se un'operazione SELECT su una tabella Delta Lake non riesce per vari possibili motivi, consultare Limitazioni e risoluzione dei problemi per le tabelle Delta Lake.

Il formato DDL per definire una tabella non partizionata è il seguente.

CREATE EXTERNAL TABLE tbl_name (columns) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://s3-bucket/prefix/_symlink_format_manifest'

Il formato DDL per definire una tabella partizionata è il seguente.

CREATE EXTERNAL TABLE tbl_name (columns) PARTITIONED BY(pcolumn1 pcolumn1-type[,...]) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://s3-bucket>/prefix/_symlink_format_manifest'

Per aggiungere partizioni a una tabella Delta Lake partizionata, eseguire un comando ALTER TABLE ADD PARTITION in cui il parametro LOCATION punta alla sottocartella Amazon S3 che contiene il manifest per la partizione.

Il formato DDL per aggiungere le partizioni è il seguente.

ALTER TABLE tbl_name ADD IF NOT EXISTS PARTITION(pcolumn1=pvalue1[,...]) LOCATION 's3://s3-bucket/prefix/_symlink_format_manifest/partition-path'

Oppure eseguire la DDL che punta direttamente al file manifest di Delta Lake.

ALTER TABLE tbl_name ADD IF NOT EXISTS PARTITION(pcolumn1=pvalue1[,...]) LOCATION 's3://s3-bucket/prefix/_symlink_format_manifest/partition-path/manifest'

Limitazioni e risoluzione dei problemi per le tabelle Delta Lake

Quando si eseguono query sulle tabelle Delta Lake da Redshift Spectrum, tenere presente quanto segue:

  • Se un manifest punta a uno snapshot o una partizione che non esiste più, le query hanno esito negativo fino a quando non viene generato un nuovo manifest valido. Ad esempio, questo potrebbe derivare da un'operazione VACUUM sulla tabella sottostante,

  • I manifest di Delta Lake forniscono coerenza solo a livello di partizione.

Nella tabella seguente vengono illustrati alcuni potenziali motivi per alcuni errori quando si esegue una query su una tabella Delta Lake.

Messaggio di errore Motivo possibile

Il manifest di Delta Lake nel bucket s3-bucket-1 non può contenere voci nel bucket s3-bucket-2.

Le voci del manifest puntano a file in un bucket Amazon S3 diverso da quello specificato.

I file Delta Lake dovrebbero trovarsi nella stessa cartella.

Le voci del manifest puntano a file che hanno un prefisso Amazon S3 diverso da quello specificato.

Il file nomefile elencato nel manifest Delta Lake percorso manifest non è stato trovato.

Un file elencato nel manifest non è stato trovato in Amazon S3.

Errore durante il recupero del manifesto Delta Lake.

Il manifest non è stato trovato in Amazon S3.

Percorso S3 non valido.

Una voce nel file manifest non è un percorso Amazon S3 valido o il file manifest è stato danneggiato.