Erstellen externer Tabellen für Redshift Spectrum - Amazon Redshift

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

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 der Verwendung AWS Glue im AWS Glue Entwicklerhandbuch, Erste Schritte im Amazon Athena Athena-Benutzerhandbuch oder Apache Hive im EMRAmazon-Entwicklerhandbuch.

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

Damit Amazon Redshift Tabellen in anzeigen kann AWS Glue Data Catalog, fügen Sie glue:GetTable der Amazon Redshift IAM Redshift-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 dem Namen definieren athena_schema und dann die Tabelle 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 mit dem Namen SALES des externen Amazon Redshift Redshift-Schemas namens spectrum erstellt. 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://redshift-downloads/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://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

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 Partitionsschlüssel in der BY-Klausel PARTITIONED an.

    Der Partitionierungsschlüssel darf nicht der Name einer Spalte sein. Der Datentyp kannSMALLINT,INTEGER,BIGINT,DECIMAL,REAL, DOUBLEPRECISION,BOOLEAN, CHAR VARCHARDATE, oder TIMESTAMP Datentyp sein.

  3. Fügen Sie die Partitionen hinzu.

    Fügen Sie mitALTER TABLE... ADD PARTITION jede Partition hinzu und geben Sie dabei die Partitionsspalte und den Schlüsselwert sowie den Speicherort des Partitionsordners in Amazon S3 an. Sie können mehrere Partitionen in einer einzigen ALTERTABLE... ADD -Anweisung hinzufügen. Im folgenden Beispiel werden Partitionen für '2008-01' und '2008-03' hinzugefügt.

    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/';
    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 für dieses Beispiel befinden sich in einem Amazon S3 S3-Bucket, der allen authentifizierten AWS Benutzern Lesezugriff gewährt. Ihr Cluster und Ihre externen Datendateien müssen sich in derselben AWS-Region befinden. Der Beispieldaten-Bucket befindet sich in der Region USA Ost (Nord-Virginia) (us-east-1). Zum Zugriff auf die Daten mit Redshift Spectrum muss sich Ihr Cluster ebenfalls in us-east-1 befinden. Führen Sie zur Auflistung der Ordner in Amazon S3 den folgenden Befehl aus.

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/

Wenn Sie noch kein externes Schema haben, führen Sie den folgenden Befehl aus. Ersetzen Sie Ihre Rolle (ARN) durch den Amazon-Ressourcennamen 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;

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

Führen Sie den folgenden ALTER TABLE Befehl aus, um die Partitionen hinzuzufügen.

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

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

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

Führen Sie den folgenden ALTER TABLE Befehl aus, um die Partitionen hinzuzufügen.

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

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

Zuordnen von externen Tabellenspalten zu ORC Spalten

Sie verwenden externe Amazon Redshift Spectrum-Tabellen, um Daten aus Dateien im ORC Format abzufragen. Das optimierte Zeilenspaltenformat (ORC) ist ein spaltenförmiges Speicherdateiformat, das verschachtelte 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, ordnen Sie jede Spalte in der externen Tabelle einer Spalte in den Daten zu. ORC Verwenden Sie dazu eines der folgenden verfahren.

Das Mapping nach Spaltenname ist das Standardverfahren.

Mapping nach Position

Bei der Positionszuordnung wird die erste Spalte, die in der externen Tabelle definiert ist, der ersten Spalte in der ORC Datendatei zugeordnet, die zweite der zweiten usw. Für die Zuordnung nach Position muss die Reihenfolge der Spalten in der externen Tabelle und in der ORC Datei übereinstimmen. 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 in der externen Tabelle einer Spalte in der ORC Datei ausschließlich anhand ihrer Position zuordnen. Nachfolgend sehen Sie das Mapping.

Spaltenname der externen Tabelle ORCSpalten-ID ORCName der 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

Mithilfe der Namenszuweisung ordnen Sie Spalten in einer externen Tabelle benannten Spalten in ORC Dateien auf derselben Ebene mit demselben Namen zu.

Angenommen, Sie möchten die Tabelle aus dem vorherigen Beispiel einer ORC Datei SPECTRUM.ORC_EXAMPLE zuordnen, die die folgende Dateistruktur verwendet.

• 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 ORCSpalten-ID ORCName der Spalte
int_col 1 struct
float_col 7 int_col
nested_col 8 float_col

Wenn Sie eine Tabelle mit der vorherigen Positionszuordnung abfragen, schlägt der SELECT Befehl bei der Typüberprüfung 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_colfloat_col, und werden nested_col nach dem Spaltennamen den Spalten mit den gleichen Namen in der ORC Datei zugeordnet. 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 auch anhand des Spaltennamens korrekt den entsprechenden Spalten in der ORC Datei zugeordnet.

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, 0.10.0, 0.10.1, 0.11.0 und 0.11.1 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 Anweisungen der Datendefinitionssprache (DDL) für partitionierte und unpartitionierte Hudi-Tabellen ähneln denen 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 einigen Fällen kann ein SELECT Vorgang an einer Hudi-Tabelle mit der Meldung No valid Hudi commit timeline found fehlschlagen. 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 Tabelle DDL zum Definieren einer unpartitionierten 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 Tabelle DDL zum Definieren 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 einer partitionierten Hudi-Tabelle Partitionen hinzuzufügen, führen Sie einen ALTER TABLE ADD PARTITION Befehl aus, bei dem der LOCATION Parameter auf den Amazon S3 S3-Unterordner mit den Dateien verweist, die zu der Partition gehören.

Die Option 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.

Das DDL für partitionierte und unpartitionierte Delta Lake-Tabellen ähnelt dem 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. Wenn ein SELECT Vorgang an einer Delta Lake-Tabelle fehlschlägt, finden Sie aus möglichen Gründen weitere Informationen unter. Einschränkungen und Fehlerbehebung bei Delta-Lake-Tabellen

Die Tabelle DDL zum Definieren einer unpartitionierten 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 Tabelle DDL zum Definieren 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 einer partitionierten Delta Lake-Tabelle Partitionen hinzuzufügen, führen Sie einen ALTER TABLE ADD PARTITION Befehl aus, bei dem der LOCATION Parameter auf den Amazon S3 S3-Unterordner verweist, der das Manifest für die Partition enthält.

Der Befehl 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'

Oder führen Sie DDL das aus, das direkt auf die Delta 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. Dies könnte beispielsweise aus einer VACUUM Operation in der zugrunde liegenden Tabelle resultieren,

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