Verwalten von Partitionen für die ETL-Ausgabe in AWS Glue - AWS Glue

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.

Verwalten von Partitionen für die ETL-Ausgabe in AWS Glue

Die Partitionierung ist eine wichtige Methode zum Organisieren von Datasets, sodass diese effizient abgefragt werden können. Sie ordnet Daten basierend auf den individuellen Werten einer oder mehrerer Spalten in eine hierarchische Verzeichnisstruktur.

Beispiel: Sie können Ihre Anwendungsprotokolle in Amazon Simple Storage Service (Amazon S3) nach Datum, aufgeschlüsselt nach Jahr, Monat und Tag, partitionieren. Dateien, die der Datenmenge eines einzelnen Tages entsprechen, werden dann unter einem Präfix wie s3://my_bucket/logs/year=2018/month=01/day=23/ geordnet. Systeme wie Amazon Athena, Amazon Redshift Spectrum und nun auch AWS Glue können diese Partitionen zum Filtern von Daten nach Partitionswert verwenden, ohne die zugrunde liegenden Daten aus Amazon S3 lesen zu müssen.

Crawler leiten nicht nur Dateitypen und Schemas ab, sie identifizieren auch automatisch die Partitionsstruktur Ihres Datensatzes, wenn sie den AWS Glue Data Catalog füllen. Die resultierenden Partitionsspalten stehen für das Abfragen von ETL-Aufträgen in AWS Glue oder das Abfragen von Engines wie Amazon Athena zur Verfügung.

Nachdem Sie eine Tabelle durchsucht haben, können Sie die Partitionen anzeigen, die vom Crawler erstellt wurden. Wählen Sie im linken Navigationsbereich der AWS Glue-Konsole Tables (Tabellen) aus. Wählen Sie die vom Crawler erstellte Tabelle und dann View Partitions (Partionen anzeigen) aus.

Für Apache Hive-ähnliche partitionierte Pfade im key=val-Stil füllen Crawler den Spaltennamen automatisch mit dem Schlüsselnamen. Andernfalls werden Standardnamen wie z. B. partition_0, partition_1 usw. verwendet. Sie können die Standardnamen in der Konsole ändern. Navigieren Sie dazu zur Tabelle. Überprüfen Sie, ob Indizes auf der Registerkarte Indizes vorhanden sind. Wenn das der Fall ist, müssen Sie sie löschen, um fortzufahren (Sie können sie anschließend mit den neuen Spaltennamen neu erstellen). Wählen Sie dann Schema bearbeiten und ändern Sie dort die Namen der Partitionsspalten.

In Ihren ETL-Skripts können Sie dann die Partitionsspalten filtern. Da die Partitionsinformationen im Data Catalog gespeichert sind, verwenden Sie die from_catalog-API-Aufrufe, um die Partitionsspalten in DynamicFrame zu erfassen. Verwenden Sie z. B. create_dynamic_frame.from_catalog statt create_dynamic_frame.from_options.

Partitionierung ist eine Optimierungsmethode, die zu einer geringeren Menge an gescannten Daten führt. Weitere Informationen darüber, wie Sie feststellen können, wann diese Methode geeignet ist, finden Sie unter Die Menge an gescannten Daten verringern im Leitfaden Bewährte Methoden für die Leistungsoptimierung von AWS Glue für Apache-Spark-Aufträge in der AWS Prescriptive Guidance.

Vorabfilterung mit Pushdown-Prädikaten

In vielen Fällen können Sie ein Pushdown-Prädikat zum Filtern von Partitionen verwenden, ohne alle Dateien Ihres Datasets auflisten und lesen zu müssen. Anstatt den gesamten Datensatz zu lesen und anschließend in einem DynamicFrame zu filtern, können Sie den Filter direkt auf die Partitionsmetadaten im Data Catalog anwenden. Anschließend lesen Sie nur das in einen DynamicFrame ein bzw. listen nur das auf, was Sie tatsächlich benötigen.

In Python können Sie beispielsweise Folgendes schreiben:

glue_context.create_dynamic_frame.from_catalog( database = "my_S3_data_set", table_name = "catalog_data_table", push_down_predicate = my_partition_predicate)

Dadurch wird ein DynamicFrame erstellt, der nur die Partitionen in den Data Catalog lädt, die dem Prädikatausdruck entsprechen. Je nachdem, wie klein eine Teilmenge der Daten ist, die Sie laden, kann dies sehr viel Verarbeitungszeit sparen.

Der Prädikatausdruck kann ein beliebiger boolescher Ausdruck sein, der von Spark SQL unterstützt wird. Alles, was Sie in eine WHERE-Klausel einer Spark SQL-Abfrage aufnehmen können, wird unterstützt. Beispiel: Mit dem Prädikatausdruck pushDownPredicate = "(year=='2017' and month=='04')" werden nur die Partitionen in den Data Catalog geladen, die sowohl year gleich 2017 und month gleich 04 ist. Weitere Informationen finden Sie in der Apache Spark SQL-Dokumentation und insbesondere in der Scala SQL-Funktionsreferenz.

Serverseitige Filterung mit Katalogpartitionsprädikaten

Die Option push_down_predicate wird angewendet, nachdem alle Partitionen aus dem Katalog aufgelistet wurden und bevor Dateien von Amazon S3 für diese Partitionen angeboten werden. Wenn Sie viele Partitionen für eine Tabelle haben, kann die Liste der Katalogpartitionen immer noch zusätzlichen Zeitaufwand verursachen. Um diesen Overhead zu beheben, können Sie serverseitige Partitionsbeschneidung mit der Option catalogPartitionPredicate verwenden, die Partitions-Indizes im AWS Glue Data Catalog verwendet. Dies macht die Partitionsfilterung viel schneller, wenn Millionen von Partitionen in einer Tabelle vorhanden sind. Sie können sowohl push_down_predicate und catalogPartitionPredicate in additional_options zusammen verwenden, wenn Ihr catalogPartitionPredicate eine Prädikatsyntax erfordert, die noch nicht von den Katalogpartition-Indizes unterstützt wird.

Python:

dynamic_frame = glueContext.create_dynamic_frame.from_catalog( database=dbname, table_name=tablename, transformation_ctx="datasource0", push_down_predicate="day>=10 and customer_id like '10%'", additional_options={"catalogPartitionPredicate":"year='2021' and month='06'"} )

Scala:

val dynamicFrame = glueContext.getCatalogSource( database = dbname, tableName = tablename, transformationContext = "datasource0", pushDownPredicate="day>=10 and customer_id like '10%'", additionalOptions = JsonOptions("""{ "catalogPartitionPredicate": "year='2021' and month='06'"}""") ).getDynamicFrame()
Anmerkung

push_down_predicate und catalogPartitionPredicate verwenden verschiedene Syntaxen. Erstere verwendet die Spark-SQL-Standardsyntax und letztere verwendet den JSQL-Parser.

Schreiben von Partitionen

Standardmäßig wird ein DynamicFrame beim Schreiben nicht partitioniert. Alle Ausgabedateien werden auf der obersten Ebene des angegebenen Ausgabepfads geschrieben. Bis vor Kurzen konnte ein DynamicFrame nur in Partitionen geschrieben werden, wenn er vor dem Schreiben in einen Spark SQL-DataFrame konvertiert wurde.

Nun unterstützen DynamicFrames aber eine native Partitionierung über eine Abfolge von Schlüsseln mittels der partitionKeys-Option, wenn Sie eine Senke erstellen. Der folgende Python-Code schreibt beispielsweise in Amazon S3 einen Datensatz im Parquet-Format in Verzeichnisse, die nach dem Type-Feld partitioniert sind. Von dort aus können Sie diese Partitionen mit anderen Systemen wie Amazon Athena verarbeiten.

glue_context.write_dynamic_frame.from_options( frame = projectedEvents, connection_type = "s3", connection_options = {"path": "$outpath", "partitionKeys": ["type"]}, format = "parquet")