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.
Der ETL-Auftrag zum Extrahieren, Transformieren oder Laden kann neue Tabellenpartitionen im Zieldatenspeicher erstellen. Ihr Datensatz-Schema kann sich weiterentwickeln und von dem abweichen AWS Glue Datenkatalogschema im Laufe der Zeit. AWS Glue ETL-Aufträge stellen mehrere Features bereit, die Sie im ETL-Skript verwenden können, um das Schema und die Partitionen im Data Catalog zu aktualisieren. Mit diesen Features können Sie die Ergebnisse der ETL-Arbeit im Data Catalog anzeigen, ohne den Crawler erneut ausführen zu müssen.
Neue Partitionen
Wenn Sie die neuen Partitionen in anzeigen möchten AWS Glue Data Catalog, können Sie einen der folgenden Schritte ausführen:
-
Führen Sie nach Abschluss des Auftrags den Crawler erneut aus und zeigen Sie die neuen Partitionen auf der Konsole an, wenn der Crawler beendet ist.
-
Wenn der Auftrag abgeschlossen ist, können Sie sofort die neuen Partitionen auf der Konsole anzeigen, ohne den Crawler erneut ausführen zu müssen. Sie können dieses Feature aktivieren, indem Sie Ihrem ETL-Skript einige Codezeilen hinzufügen, wie in den folgenden Beispielen gezeigt. Der Code verwendet das
enableUpdateCatalog
-Argument, um anzuzeigen, dass der Data Catalog während der Auftragsausführung aktualisiert werden soll, wenn die neuen Partitionen erstellt werden.
- Methode 1
-
Übergeben Sie
enableUpdateCatalog
undpartitionKeys
an ein Optionsargument.additionalOptions = {"enableUpdateCatalog": True} additionalOptions["partitionKeys"] = ["region", "year", "month", "day"] sink = glueContext.write_dynamic_frame_from_catalog(frame=last_transform, database=
<target_db_name>
, table_name=<target_table_name>
, transformation_ctx="write_sink", additional_options=additionalOptions) - Methode 2
-
Übergeben Sie
enableUpdateCatalog
undpartitionKeys
ingetSink()
und rufen SiesetCatalogInfo()
auf demDataSink
-Objekt auf.sink = glueContext.getSink( connection_type="s3", path="
<S3_output_path>
", enableUpdateCatalog=True, partitionKeys=["region", "year", "month", "day"]) sink.setFormat("json") sink.setCatalogInfo(catalogDatabase=<target_db_name>
, catalogTableName=<target_table_name>
) sink.writeFrame(last_transform)
Jetzt können Sie neue Katalogtabellen erstellen, vorhandene Tabellen mit einem geänderten Schema aktualisieren und neue Tabellenpartitionen im Datenkatalog hinzufügen, indem Sie AWS Glue Der ETL-Job selbst, ohne dass Crawler erneut ausgeführt werden müssen.
Aktualisieren des Tabellenschemas
Wenn Sie das Schema der Data-Catalog-Tabelle überschreiben möchten, ist dies folgendermaßen möglich:
Führen Sie nach Abschluss des Auftrags den Crawler erneut aus und stellen Sie sicher, dass der Crawler so konfiguriert ist, dass auch die Tabellendefinition aktualisiert wird. Zeigen Sie die neuen Partitionen in der Konsole zusammen mit allen Schemaaktualisierungen an, nachdem der Crawler beendet wurde. Weitere Informationen finden Sie unter Konfigurieren eines Crawlers mithilfe der API.
Wenn der Auftrag endet, können Sie das geänderte Schema sofort in der Konsole anzeigen, ohne den Crawler erneut ausführen zu müssen. Sie können dieses Feature aktivieren, indem Sie Ihrem ETL-Skript einige Codezeilen hinzufügen, wie in den folgenden Beispielen gezeigt. Der Code verwendet
enableUpdateCatalog
mit dem Wert „true“ undupdateBehavior
mit dem WertUPDATE_IN_DATABASE
, damit während der Auftragsausführung das Schema überschrieben wird und neue Partitionen in den Data Catalog eingefügt werden.
additionalOptions = { "enableUpdateCatalog": True, "updateBehavior": "UPDATE_IN_DATABASE"} additionalOptions["partitionKeys"] = ["partition_key0", "partition_key1"] sink = glueContext.write_dynamic_frame_from_catalog(frame=last_transform, database=
<dst_db_name>
, table_name=<dst_tbl_name>
, transformation_ctx="write_sink", additional_options=additionalOptions) job.commit()
Sie können den updateBehavior
-Wert auch auf LOG
festlegen, wenn das Tabellenschema nicht überschrieben werden soll, die neuen Partitionen aber hinzugefügt werden sollen. Der Standardwert von updateBehavior
ist UPDATE_IN_DATABASE
. Wenn Sie also nicht explizit einen anderen Wert angeben, wird das Tabellenschema überschrieben.
Wenn enableUpdateCatalog
nicht auf „true“ festgelegt ist, aktualisiert der ETL-Auftrag die Tabelle im Data Catalog nicht, unabhängig von der Option, die für updateBehavior
ausgewählt ist.
Erstellen neuer Tabellen
Sie können dieselben Optionen auch verwenden, um eine neue Tabelle im Data Catalog zu erstellen. Sie können die Datenbank und den neuen Tabellennamen mit setCatalogInfo
angeben.
sink = glueContext.getSink(connection_type="s3", path="s3://path/to/data", enableUpdateCatalog=True, updateBehavior="UPDATE_IN_DATABASE", partitionKeys=["partition_key0", "partition_key1"]) sink.setFormat("<format>") sink.setCatalogInfo(catalogDatabase=
<dst_db_name>
, catalogTableName=<dst_tbl_name>
) sink.writeFrame(last_transform)
Einschränkungen
Beachten Sie die folgenden Einschränkungen:
-
Es werden nur Amazon Simple Storage Service (Amazon S3)-Ziele unterstützt.
-
Das
enableUpdateCatalog
-Feature wird für reglementierte Tabellen nicht unterstützt. -
Es werden nur die folgenden Formate unterstützt:
json
,csv
,avro
undparquet
. -
Um Tabellen mit der
parquet
Klassifizierung zu erstellen oder zu aktualisieren, müssen Sie die AWS Glue optimierter Parkettschreiber für DynamicFrames. Dies kann mit einem der folgenden Schritte erreicht werden:-
Wenn Sie eine vorhandene Tabelle im Katalog mit
parquet
-Klassifizierung aktualisieren, muss die"useGlueParquetWriter"
-Tabelleneigenschaft der Tabelle auftrue
festgelegt sein, bevor Sie sie aktualisieren. Sie können diese Eigenschaft über das AWS Glue APIs /SDK, über die Konsole oder über eine Athena-DDL-Anweisung festlegen.Sobald die Katalogtabelleneigenschaft festgelegt ist, können Sie den folgenden Codeausschnitt verwenden, um die Katalogtabelle mit den neuen Daten zu aktualisieren:
glueContext.write_dynamic_frame.from_catalog( frame=
frameToWrite
, database="dbName
", table_name="tableName
", additional_options={ "enableUpdateCatalog": True, "updateBehavior": "UPDATE_IN_DATABASE" } ) -
Wenn die Tabelle noch nicht im Katalog vorhanden ist, können Sie die
getSink()
-Methode in Ihrem Skript mitconnection_type="s3"
verwenden, um die Tabelle und ihre Partitionen dem Katalog hinzuzufügen und die Daten in Amazon S3 zu schreiben. Geben Sie das entsprechendepartitionKeys
undcompression
für Ihren Workflow an.s3sink = glueContext.getSink( path="s3://
bucket/folder/
", connection_type="s3", updateBehavior="UPDATE_IN_DATABASE", partitionKeys=[], compression="snappy", enableUpdateCatalog=True ) s3sink.setCatalogInfo( catalogDatabase="dbName
", catalogTableName="tableName
" ) s3sink.setFormat("parquet", useGlueParquetWriter=True) s3sink.writeFrame(frameToWrite
) -
Der
glueparquet
Formatwert ist eine ältere Methode zur Aktivierung des AWS Glue Parquet Writers.
-
-
Wenn
updateBehavior
aufLOG
festgelegt ist, werden neue Partitionen nur hinzugefügt, wenn dasDynamicFrame
-Schema äquivalent zu den in der Data-Catalog-Tabelle definierten Spalten ist oder eine Teilmenge dieser Spalten enthält. -
Schemaaktualisierungen werden für nicht partitionierte Tabellen nicht unterstützt (ohne Verwendung der Option „partitionKeys“).
-
Die partitionKeys müssen für den im ETL-Skript übergebenen Parameter und die partitionKeys im Tabellenschema des Data Catalogs äquivalent sein und in der gleichen Reihenfolge vorliegen.
-
Dieses Feature unterstützt derzeit noch nicht das Aktualisieren/Erstellen von Tabellen, in denen die Aktualisierungsschemas verschachtelt sind (z. B. Arrays innerhalb von Strukturen).
Weitere Informationen finden Sie unter Programmieren von Spark-Skripte.