Erstellen externer Tabellen für Redshift Spectrum - Amazon Redshift

Erstellen externer Tabellen für Redshift Spectrum

Sie erstellen eine externe Tabelle in einem externen Schema. Zum Erstellen externer Tabellen müssen Sie der Eigentümer des externen Schemas oder ein Superuser sein. Mit dem Befehl ALTER SCHEMA können Sie den Besitzer eines externen Schemas ändern. Das folgende Beispiel ändert den Eigentümer des Schemas spectrum_schema in newowner.

alter schema spectrum_schema owner to newowner;

Um eine Redshift Spectrum-Abfrage auszuführen, benötigen Sie die folgenden Berechtigungen:

  • Nutzungsberechtigung für das Schema

  • Berechtigung, temporäre Tabellen in der aktuellen Datenbank zu erstellen

Das folgende Beispiel erteilt der Benutzergruppe spectrum_schema Nutzungsberechtigungen für das Schema spectrumusers.

grant usage on schema spectrum_schema to group spectrumusers;

Das folgende Beispiel erteilt der Benutzergruppe spectrumdb temporäre Berechtigungen für die Datenbank spectrumusers.

grant temp on database spectrumdb to group spectrumusers;

Sie können eine externe Tabelle in Amazon Redshift, AWS Glue, Amazon Athena oder einem Apache-Hive-Metastore erstellen. Weitere Informationen finden Sie unter Erste Schritte mit AWS Glue im AWS Glue-Entwicklerhandbuch, Erste Schritte im Amazon-Athena-Benutzerhandbuch oder Apache Hive im Amazon-EMR-Entwicklerhandbuch.

Wenn Ihre externe Tabelle in AWS Glue, Athena oder einem Hive-Metastore definiert ist, erstellen Sie zuerst ein externes Schema, das auf die externe Datenbank verweist. Anschließend können Sie in Ihrer SELECT-Anweisung auf die externe Tabelle verweisen, indem Sie dem Tabellennamen den Schemanamen voranstellen, ohne dass Sie die Tabelle in Amazon Redshift erstellen müssen. Weitere Informationen finden Sie unter Erstellen externer Schemata für Amazon Redshift Spectrum.

Um Amazon Redshift das Anzeigen von Tabellen im AWS Glue Data Catalog zu erlauben, fügen Sie glue:GetTable zur Amazon-Redshift-IAM-Rolle hinzu. Andernfalls wird möglicherweise eine Fehlermeldung wie die folgende angezeigt:

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

Nehmen Sie beispielsweise an, Sie haben eine externe Tabelle mit der Bezeichnung lineitem_athena in einem externen Athena-Katalog definiert. In diesem Fall können Sie ein externes Schema mit der Bezeichnung athena_schema definieren und die Tabelle dann mit der folgenden SELECT-Anweisung abfragen.

select count(*) from athena_schema.lineitem_athena;

Verwenden Sie zur Definition einer externen Tabelle in Amazon Redshift den Befehl CREATE EXTERNAL TABLE. Die Anweisung für die externe Tabelle definiert die Tabellenspalten, das Format Ihrer Datendateien sowie den Speicherort Ihrer Daten in Amazon S3. Redshift Spectrum scannt die Dateien in dem angegebenen Ordner und in allen Unterordnern. Redshift Spectrum ignoriert verborgene Dateien und Dateien, die mit einem Punkt, einem Unterstrich oder einem Hash-Zeichen ( . , _ oder #) oder mit einer Tilde (~) enden.

Im folgenden Beispiel wird eine Tabelle namens SALES im externen Amazon-Redshift-Schema namens erstellt spectrum. Die Daten befinden sich in Textdateien, die Tabulatoren als Trennzeichen verwenden.

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://awssampledbuswest2/tickit/spectrum/sales/' table properties ('numRows'='172000');

Um externe Tabellen anzuzeigen, führen Sie eine Abfrage für die Systemansicht SVV_EXTERNAL_TABLES aus.

Pseudospalten

Standardmäßig erstellt Amazon Redshift externe Tabellen mit den Pseudospalten $path, $size und $spectrum_oid. Wählen Sie die Spalte $path aus, um den Pfad zu den Datendateien auf Amazon S3 anzuzeigen, und die Spalte $size, um die Größe der Datendateien für jede Zeile anzuzeigen, die von einer Abfrage zurückgegeben wird. Die Spalte $spectrum_oid bietet die Möglichkeit, korrelierte Abfragen mit Redshift Spectrum durchzuführen. Ein Beispiel finden Sie unter Beispiel: Durchführen korrelierter Unterabfragen in Redshift Spectrum. Die Spaltennamen $path, $size und $spectrum_oid müssen in doppelte Anführungszeichen eingeschlossen werden. Eine SELECT *-Klausel gibt die Pseudospalten nicht zurück. Sie müssen die Spaltennamen $path, $size und $spectrum_oid explizit in Ihre Abfrage einfügen, wie im folgenden Beispiel gezeigt.

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

Sie können die Erstellung von Pseudospalten für eine Sitzung deaktivieren, indem Sie den Konfigurationsparameter spectrum_enable_pseudo_columns auf false festlegen. Weitere Informationen finden Sie unter spectrum_enable_pseudo_columns. Sie können auch nur die Pseudospalte $spectrum_oid deaktivieren, indem Sie enable_spectrum_oid auf false festlegen. Weitere Informationen finden Sie unter enable_spectrum_oid. Wenn Sie die Pseudospalte $spectrum_oid deaktivieren, wird allerdings auch die Unterstützung für korrelierte Abfragen mit Redshift Spectrum deaktiviert.

Wichtig

Bei Auswahl von $size, $path oder $spectrum_oid fallen Gebühren an, da Redshift Spectrum die Datendateien auf Amazon S3 scannt, um die Größe des Ergebnissatzes zu bestimmen. Weitere Informationen finden Sie unter Amazon-Redshift-Preise.

Beispiel für Pseudospalten

Das folgende Beispiel gibt die Gesamtgröße der entsprechenden Datendateien für eine externe Tabelle zurück.

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

Partitionierung externer Redshift-Spectrum-Tabellen

Wenn Sie Ihre Daten partitionieren, können Sie die Menge der von Redshift Spectrum gescannten Daten durch Filterung auf dem Partitionierungsschlüssel begrenzen. Sie können Ihre Daten nach jedem beliebigen Schlüssel partitionieren.

Häufig werden die Daten nach der Zeit partitioniert. So können Sie etwa die Partitionierung nach Jahr, Monat, Datum oder Stunde durchführen. Wenn Sie aus zahlreichen Quellen kommende Daten haben, können Sie auch nach Datenquellen-ID und Datum partitionieren.

Die folgende Vorgehensweise beschreibt die Partitionierung Ihrer Daten.

So partitionieren Sie Ihre Daten:

  1. Speichern Sie Ihre Daten gemäß Ihrem Partitionierungsschlüssel in Ordnern in Amazon S3.

    Erstellen Sie einen Ordner für jeden Partitionierungswert, und benennen Sie den Ordner mit Partitionsschlüssel und -wert. Zum Beispiel: Wenn Sie nach Datum partitionieren, haben Sie möglicherweise Ordner mit den Bezeichnungen saledate=2017-04-01, saledate=2017-04-02 und so weiter. Redshift Spectrum scannt die Dateien im Partitionierungsordner und in allen Unterordnern. Redshift Spectrum ignoriert verborgene Dateien und Dateien, die mit einem Punkt, einem Unterstrich oder einem Hash-Zeichen ( . , _ oder #) oder mit einer Tilde (~) enden.

  2. Erstellen Sie eine externe Tabelle, und geben Sie den Partitionierungsschlüssel in der PARTITIONED BY-Klausel an.

    Der Partitionierungsschlüssel darf nicht der Name einer Spalte sein. Als Datentyp kommt SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE oder TIMESTAMP infrage.

  3. Fügen Sie die Partitionen hinzu.

    Fügen Sie mit ALTER TABLE … ADD PARTITION jede Partition hinzu, und geben Sie dabei die Partitionierungsspalte und den Schlüsselwert sowie den Speicherort des Partitionierungsordners in Amazon S3 an. Sie können mehrere Partitionen mit einer einzelnen ALTER TABLE … ADD-Anweisung hinzufügen. Im folgenden Beispiel werden Partitionen für '2008-01' und '2008-02' hinzugefügt.

    alter table spectrum.sales_part add partition(saledate='2008-01-01') location 's3://awssampledbuswest2/tickit/spectrum/sales_partition/saledate=2008-01/' partition(saledate='2008-02-01') location 's3://awssampledbuswest2/tickit/spectrum/sales_partition/saledate=2008-02/';
    Anmerkung

    Wenn Sie den AWS Glue-Katalog verwenden, können Sie mit einer einzigen ALTER TABLE-Anweisung bis zu 100 Partitionen hinzufügen.

Beispiele für die Datenpartitionierung

In diesem Beispiel erstellen Sie eine externe Tabelle, die von einem einzelnen Partitionsschlüssel partitioniert wird, und eine externe Tabelle, die von zwei Partitionsschlüsseln partitioniert wird.

Die Beispieldaten dafür befinden sich in einem Amazon-S3-Bucket, der den Lesezugriff für alle authentifizierten AWS-Benutzer gewährt. Ihr Cluster und Ihre externen Datendateien müssen sich in derselben AWS-Region befinden. Der Beispiel-Datenbucket befindet sich in der Region USA West (Oregon) (us-west-2). Zum Zugriff auf die Daten mit Redshift Spectrum muss sich Ihr Cluster ebenfalls in us-west-2 befinden. Führen Sie zur Auflistung der Ordner in Amazon S3 den folgenden Befehl aus.

aws s3 ls s3://awssampledbuswest2/tickit/spectrum/sales_partition/
PRE saledate=2008-01/
PRE saledate=2008-02/
PRE saledate=2008-03/

Wenn Sie noch kein externes Schema haben, führen Sie den folgenden Befehl aus. Ersetzen Sie den Amazon-Ressourcennamen (ARN) durch Ihre AWS Identity and Access Management(IAM)-Rolle.

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

Beispiel 1: Partitionierung mit einem einzelnen Partitionsschlüssel

Im folgenden Beispiel erstellen Sie eine externe Tabelle, die nach Monaten partitioniert ist.

Führen Sie zur Erstellung einer nach Monat partitionierten Tabelle den folgenden Befehl aus.

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://awssampledbuswest2/tickit/spectrum/sales_partition/' table properties ('numRows'='172000');

Führen Sie zum Hinzufügen der Partitionen den folgenden ALTER TABLE-Befehl aus.

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

Führen Sie die folgende Abfrage aus, um Daten aus der partitionierten Tabelle auszuwählen.

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

Um externe Tabellenpartitionen anzuzeigen, führen Sie eine Abfrage für die Systemansicht SVV_EXTERNAL_PARTITIONS aus.

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

Beispiel 2: Partitionierung mit mehreren Partitionsschlüsseln

Führen Sie zur Erstellung einer nach date und eventid partitionierten externen Tabelle den folgenden Befehl aus.

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://awssampledbuswest2/tickit/spectrum/salesevent/' table properties ('numRows'='172000');

Führen Sie zum Hinzufügen der Partitionen den folgenden ALTER TABLE-Befehl aus.

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

Führen Sie die folgende Abfrage aus, um Daten aus der partitionierten Tabelle auszuwählen.

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

Mapping externer Tabellenspalten zu ORC-Spalten

Sie verwenden externe Amazon-Redshift-Spectrum-Tabellen zur Abfrage von Dateien im ORC-Format. Das ORC (Optimized Row Columnar) Format ist ein in Spalten organisiertes Speicherdateiformat, dass genestete Datenstrukturen unterstützt. Weitere Informationen zur Abfrage verschachtelter Daten finden Sie unter Abfragen verschachtelter Daten mit Amazon Redshift Spectrum.

Wenn Sie eine externe Tabelle erstellen, die auf Daten in einer ORC-Datei verweist, weisen Sie jede Spalte in der externen Tabelle einer Spalte in den ORC-Daten zu. Verwenden Sie dazu eines der folgenden verfahren.

Das Mapping nach Spaltenname ist das Standardverfahren.

Mapping nach Position

Beim Positions-Mapping wird die erste in der externen Tabelle definierte Spalte der ersten Spalte in der ORC-Datendatei zugewiesen, die zweite der zweiten usw. Das Mapping nach Position erfordert, dass die Reihenfolge der Spalten in der externen Tabelle und in der ORC-Datei einander entsprechen. Wenn die Reihenfolge der Spalten nicht übereinstimmt, können Sie die Spalten nach Name zuweisen.

Wichtig

In früheren Versionen verwendete Redshift Spectrum standardmäßig das Positions-Mapping. Wenn Sie für vorhandene Tabellen mit dem Positions-Mapping fortfahren müssen, stellen Sie die Tabelleneigenschaft orc.schema.resolution auf position, wie das folgende Beispiel zeigt.

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

Beispielsweise ist die Tabelle SPECTRUM.ORC_EXAMPLE wie folgt definiert.

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

Die Tabellenstruktur kann wie folgt abstrahiert werden.

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

Die zugrunde liegende ORC-Datei hat die folgende Dateistruktur.

• 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 diesem Beispiel können Sie jede Spalte der externen Tabelle einer Spalte in der ORC-Datei streng nach Position zuweisen. Nachfolgend sehen Sie das Mapping.

Spaltenname der externen Tabelle ORC-Spalten-ID Name der ORC-Spalte
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 N/A
nested_col.map_col.value 7 N/A
nested_col.map_col.value.item 8 N/A

Mapping nach Spaltenname

Beim Namens-Mapping weisen Sie Spalten in einer externen Tabelle benannten Spalten in ORC-Dateien auf derselben Ebene und demselben Namen zu.

Zum Beispiel: Angenommen, Sie möchten die Tabelle aus dem vorherigen Beispiel, SPECTRUM.ORC_EXAMPLE, einer ORC-Datei mit der folgenden Dateistruktur zuweisen.

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

Mit Positionierungszuweisung versucht Redshift Spectrum das folgende Mapping.

Spaltenname der externen Tabelle ORC-Spalten-ID Name der ORC-Spalte
int_col 1 struct
float_col 7 int_col
nested_col 8 float_col

Wenn Sie eine Tabelle mit dem vorherigen Positions-Mapping abfragen, schlägt der Befehl SELECT bei der Typenvalidierung fehl, da die Strukturen unterschiedlich sind.

Sie weisen dieselbe externe Tabelle beiden in den vorherigen Beispielen gezeigten Dateistrukturen mithilfe des Spaltennamen-Mappings zu. Die Tabellenspalten int_col, float_col und nested_col werden nach Spaltenname zu Spalten mit denselben Namen in der ORC-Datei zugewiesen. Die Spalte mit der Bezeichnung nested_col in der externen Tabelle ist eine struct-Spalte mit Unterspalten mit den Bezeichnungen map_col und int_col. Die Unterspalten werden ebenfalls korrekt den entsprechenden Spalten in der ORC-Datei nach Spaltenname zugewiesen.

Erstellen externer Tabellen für in Apache Hudi verwaltete Daten

Um Daten im Apache-Hudi-Format CoW (Copy on Write) abzufragen, können Sie externe Amazon-Redshift-Spectrum-Tabellen verwenden. Eine Hudi-Copy-On-Write-Tabelle ist eine Sammlung von Apache-Parquet-Dateien, die in Amazon S3 gespeichert sind. Sie können Copy-on-Write-Tabellen (CoW) in den Apache-Hudi-Versionen 0.5.2, 0.6.0, 0.7.0, 0.8.0, 0.9.0 und 0.10.0 lesen, die mit Einfüge-, Lösch- und Upsert-Schreiboperationen erstellt und geändert werden. Bootstrap-Tabellen werden beispielsweise nicht unterstützt. Weitere Informationen finden Sie unter Copy On Write Table in der Open-Source-Dokumentation von Apache Hudi.

Wenn Sie eine externe Tabelle erstellen, die auf Daten im Hudi-CoW-Format verweist, weisen Sie jede Spalte in der externen Tabelle einer Spalte in den Hudi-Daten zu. Das Mapping erfolgt nach Spalte.

Die DDL-Anweisungen (Data Definition Language) für die partitionierten und nicht partitionierten Hudi-Tabellen ähneln den Anweisungen für andere Apache-Parquet-Dateiformate. Für Hudi-Tabellen definieren Sie INPUTFORMAT als org.apache.hudi.hadoop.HoodieParquetInputFormat. Der LOCATION-Parameter muss auf den Basisordner der Hudi-Tabelle verweisen, der den .hoodie-Ordner enthält, der erforderlich ist, um die Hudi-Commit-Timeline zu erstellen. In manchen Fällen kann der SELECT-Vorgang auf einer Hudi-Tabelle fehlschlagen. Sie erhalten dann die Nachricht No valid Hudi commit timeline found (Keine gültige Hudi-Commit-Timeline gefunden). Wenn dies der Fall ist, sollten Sie überprüfen, ob sich der .hoodie-Ordner am richtigen Ort befindet und die gültige Hudi-Commit-Timeline enthält.

Anmerkung

Das Apache-Hudi-Format wird nur unterstützt, wenn Sie einen verwenden AWS Glue Data Catalog. Es wird nicht unterstützt, wenn Sie einen Apache-Hive-Metastore als externen Katalog verwenden.

Die DDL für die Definition einer nicht partitionierten Tabelle hat das folgende Format.

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'

Die DDL für die Definition einer partitionierten Tabelle hat das folgende Format.

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'

Um Partitionen zu einer partitionierten Hudi-Tabelle hinzuzufügen, führen Sie den Befehl ALTER TABLE ADD PARTITION aus, wobei der LOCATION-Parameter auf den Amazon-S3-Unterordner mit den Dateien verweist, die zur Partition gehören.

Die DDL zum Hinzufügen von Partitionen hat das folgende Format.

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

Erstellen externer Tabellen für in Delta Lake verwaltete Daten

Um Daten in Delta-Lake-Tabellen abzufragen, können Sie externe Tabellen von Amazon Redshift Spectrum verwenden.

Um aus Redshift Spectrum auf eine Delta-Lake-Tabelle zuzugreifen, generieren Sie vor der Abfrage ein Manifest. Ein Delta-Lake-Manifest enthält eine Liste von Dateien, aus denen ein konsistenter Snapshot in der Delta-Lake-Tabelle besteht. In einer partitionierten Tabelle gibt es ein Manifest pro Partition. Eine Delta-Lake-Tabelle ist eine Sammlung von Apache-Parquet-Dateien, die in Amazon S3 gespeichert sind. Weitere Informationen finden Sie unter Delta Lake in der Open-Source-Dokumentation von Delta Lake.

Wenn Sie eine externe Tabelle erstellen, die auf Daten in Delta-Lake-Tabellen verweist, weisen Sie jede Spalte in der externen Tabelle einer Spalte in der Delta-Lake-Tabelle zu. Das Mapping erfolgt nach Spaltenname.

Die DDL für partitionierte und nicht partitionierte Delta-Lake-Tabellen ähnelt der für andere Apache-Parquet-Dateiformate. Für Delta-Lake-Tabellen definieren Sie INPUTFORMAT als org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat und OUTPUTFORMAT als org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat. Der LOCATION-Parameter muss auf den Manifestordner im Basisordner der Tabelle verweisen. Gründe für ein mögliches Fehlschlagen des SELECT-Vorgangs bei Delta-Lake-Tabellen finden Sie unter Einschränkungen und Fehlerbehebung bei Delta-Lake-Tabellen.

Die DDL für die Definition einer nicht partitionierten Tabelle hat das folgende Format.

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'

Die DDL für die Definition einer partitionierten Tabelle hat das folgende Format.

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'

Um Partitionen zu einer partitionierten Delta-Lake-Tabelle hinzuzufügen, führen Sie den Befehl ALTER TABLE ADD PARTITION aus, wobei der LOCATION-Parameter auf den Amazon-S3-Unterordner verweist, der das Manifest für die Partition enthält.

Die DDL zum Hinzufügen von Partitionen hat das folgende Format.

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

Sie können auch eine DDL ausführen, die direkt auf die Data-Lake-Manifestdatei verweist.

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

Einschränkungen und Fehlerbehebung bei Delta-Lake-Tabellen

Beachten Sie Folgendes, wenn Sie Delta-Lake-Tabellen aus Redshift Spectrum abfragen:

  • Wenn ein Manifest auf einen Snapshot oder eine Partition verweist, der/die nicht mehr vorhanden ist, schlagen Abfragen fehl, bis ein neues gültiges Manifest generiert wurde. Der Grund hierfür kann beispielsweise ein VACUUM-Vorgang in einer zugrundeliegenden Tabelle sein.

  • Delta-Lake-Manifeste bieten nur Konsistenz auf Partitionsebene.

Die folgende Tabelle zeigt einige Gründe für Fehler bei der Abfrage einer Data-Lake-Tabelle.

Fehlermeldung Möglicher Grund

Delta Lake manifest in bucket s3-bucket-1 cannot contain entries in bucket s3-bucket-2.

Die Manifesteinträge verweisen auf Dateien in einem anderen Amazon-S3-Bucket als dem angegebenen.

Delta Lake files are expected to be in the same folder.

Die Manifesteinträge verweisen auf Dateien mit einem anderen Amazon-S3-Präfix als dem angegebenen.

File filename listed in Delta Lake manifest manifest-path was not found.

Eine im Manifest aufgelistete Datei wurde nicht in Amazon S3 gefunden.

Error fetching Delta Lake manifest.

Das Manifest wurde nicht in Amazon S3 gefunden.

Invalid S3 Path.

Ein Eintrag in der Manifestdatei ist kein gültiger Amazon-S3-Pfad oder die Manifestdatei ist beschädigt.