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

Tabelle esterne per Redshift Spectrum

Questo argomento descrive come creare e utilizzare tabelle esterne con Redshift Spectrum. Le tabelle esterne sono tabelle che usi come riferimenti per accedere ai dati all'esterno del tuo cluster Amazon Redshift. Queste tabelle contengono metadati sui dati esterni letti da 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, consulta Getting Started Using AWS Glue nella AWS Glue Developer Guide, Getting Started nella Amazon Athena User Guide o Apache Hive nella Amazon Developer Guide. 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 puoi fare riferimento alla tabella esterna nella tua SELECT dichiarazione anteponendo al nome della tabella il nome dello schema, senza dover creare la tabella in Amazon Redshift. Per ulteriori informazioni, consulta Schemi esterni in Amazon Redshift Spectrum.

Per consentire ad Amazon Redshift di visualizzare le tabelle in AWS Glue Data Catalog, aggiungi glue:GetTable al ruolo Amazon IAM 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 questo caso, puoi definire uno schema esterno denominatoathena_schema, quindi interrogare la tabella utilizzando la seguente SELECT istruzione.

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 (~).

L'esempio seguente crea una tabella denominata SALES nello schema esterno di 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. Crea una tabella esterna e specifica la chiave di partizione nella clausola BY. PARTITIONED

    La chiave di partizione non può essere Il nome di una colonna della tabella. Il tipo di dati può essereSMALLINT,INTEGER,BIGINT,,DECIMAL,REAL, DOUBLEPRECISION,BOOLEAN, CHAR VARCHARDATE, o tipo di TIMESTAMP dati.

  3. Aggiungere le partizioni.

    UtilizzandoALTER TABLE... ADDPARTITION, aggiungi ogni partizione, specificando la colonna della partizione e il valore della chiave e la posizione della cartella delle partizioni in Amazon S3. Puoi aggiungere più partizioni in un'unica 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 si utilizza il AWS Glue catalogo, è possibile aggiungere fino a 100 partizioni utilizzando una singola ALTER TABLE istruzione.

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 tuo ruolo (ARN) con Amazon Resource Name AWS Identity and Access Management (IAM).

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 seguente ALTER TABLE comando.

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 seguente ALTERTABLE.

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 esterne della tabella alle colonne ORC

Utilizzi le tabelle esterne di Amazon Redshift Spectrum per interrogare i dati da file ORC in formato. Il formato ottimizzato row columnar (ORC) è un formato di file di storage a colonne che supporta 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 si crea una tabella esterna che fa riferimento ai dati di un ORC file, si mappa ogni colonna della tabella esterna a una colonna dei 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 della posizione, la prima colonna definita nella tabella esterna viene mappata alla prima colonna del file di ORC dati, la seconda alla seconda e così via. La mappatura per posizione richiede che l'ordine delle colonne nella tabella esterna e nel ORC file 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 ORC file sottostante ha 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, è possibile mappare ogni colonna della tabella esterna a una colonna ORC del file rigorosamente in base alla posizione. Di seguito è riportata la mappatura.

Nome della colonna della tabella esterna ORCID della colonna ORCnome della colonna
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

Utilizzando la mappatura dei nomi, è possibile mappare le colonne di una tabella esterna a colonne denominate in ORC file sullo stesso livello e con lo stesso nome.

Si supponga, ad esempio, di voler mappare la tabella dell'esempio precedente con un ORC file che utilizza la seguente struttura di file. SPECTRUM.ORC_EXAMPLE

• 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 ORCID della colonna ORCnome della colonna
int_col 1 struct
float_col 7 int_col
nested_col 8 float_col

Quando si esegue una query su una tabella con la mappatura di posizione precedente, il SELECT comando non riesce a convalidare il tipo perché 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 della tabella int_colfloat_col, e vengono nested_col mappate in base al nome della colonna alle colonne con lo stesso nome nel file. ORC La colonna denominata nested_col nella tabella esterna è una colonna struct con sottocolonne denominate map_col e int_col. Inoltre, le sottocolonne vengono mappate correttamente alle colonne corrispondenti del ORC file in base al nome della colonna.

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 data definition language (DDL) per le tabelle Hudi partizionate e non partizionate sono simili a quelle per 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'SELECToperazione su una tabella Hudi potrebbe non riuscire con il messaggio No valid Hudi commit timeline found. 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.

La tabella DDL per definire una tabella non partizionata ha il seguente formato.

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, esegui un ALTER TABLE ADD PARTITION comando in cui il LOCATION parametro punta alla sottocartella Amazon S3 con i file che appartengono alla partizione.

Le partizioni da aggiungere hanno il DDL seguente formato.

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.

Il formato DDL per le tabelle Delta Lake partizionate e non partizionate è simile a quello per 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'SELECToperazione su una tabella Delta Lake fallisce, per possibili ragioni vedi. Limitazioni e risoluzione dei problemi per le tabelle Delta Lake

La tabella DDL per definire una tabella non partizionata ha il seguente formato.

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, esegui un ALTER TABLE ADD PARTITION comando in cui il LOCATION parametro punta alla sottocartella Amazon S3 che contiene il manifesto per la partizione.

Le partizioni DDL da aggiungere hanno il seguente formato.

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

Oppure esegui 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, ciò potrebbe derivare da un'VACUUMoperazione 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.