Aufrufen von AWS Glue-APIs in Python - 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.

Aufrufen von AWS Glue-APIs in Python

Beachten Sie, dass Boto 3-Ressourcen-APIs für AWS Glue noch nicht verfügbar sind. Derzeit können nur die Boto 3-Client-APIs verwendet werden.

AWS Glue-API-Namen in Python

Für AWS-Glue-API-Namen in Java und anderen Programmiersprachen wird in der Regel die CamelCase-Schreibweise verwendet. Wenn diese allgemeinen Namen jedoch von Python aus aufgerufen werden, werden sie in Kleinbuchstaben geändert und die einzelnen Teile des Namens werden durch Unterstriche getrennt, damit sie besser "an Python angepasst" sind. In der AWS Glue API-Referenzdokumentation sind diese Python-Namen in Klammern im Anschluss an die allgemeinen Namen in CamelCase-Schreibweise aufgeführt.

Obwohl aber die AWS Glue-API-Namen selbst in Kleinbuchstaben umgewandelt werden, bleiben ihre Parameternamen in Großbuchstaben. Dies sollte nicht vergessen werden, da Parameter per Namen übergeben werden sollten, wenn AWS Glue-APIs aufgerufen werden, wie im folgenden Abschnitt beschrieben.

Übergeben von und Zugreifen auf Python-Parameter in AWS Glue

In Python-Aufrufen von AWS Glue-APIs sollten Parameter explizit nach Namen übergeben werden. Zum Beispiel:

job = glue.create_job(Name='sample', Role='Glue_DefaultRole', Command={'Name': 'glueetl', 'ScriptLocation': 's3://my_script_bucket/scripts/my_etl_script.py'})

Es ist hilfreich, wenn Sie verstehen, dass Python ein Wörterbuch mit den Name-Wert-Tupeln erstellt, die Sie als Argumente für ein ETL-Skript in einem Auftrags-Struktur oder JobRun Struktur angeben. Boto 3 übergibt sie dann im JSON-Format mithilfe eines REST API-Aufrufs an AWS Glue. Das bedeutet, dass Sie sich nicht auf die Reihenfolge der Argumente verlassen können, wenn Sie in Ihrem Skript auf sie zugreifen.

Angenommen, Sie starten eine JobRun in einer Python-Lambda-Handler-Funktion und Sie möchten mehrere Parameter angeben. Ihr Code würde in etwa wie folgt aussehen:

from datetime import datetime, timedelta client = boto3.client('glue') def lambda_handler(event, context): last_hour_date_time = datetime.now() - timedelta(hours = 1) day_partition_value = last_hour_date_time.strftime("%Y-%m-%d") hour_partition_value = last_hour_date_time.strftime("%-H") response = client.start_job_run( JobName = 'my_test_Job', Arguments = { '--day_partition_key': 'partition_0', '--hour_partition_key': 'partition_1', '--day_partition_value': day_partition_value, '--hour_partition_value': hour_partition_value } )

Um zuverlässig auf diese Parameter in Ihrem ETL-Skript zuzugreifen, geben Sie sie nach Namen mithilfe der getResolvedOptions-Funktion von AWS Glue ein, und greifen Sie dann von dem ausgegebenen Wörterbuch aus darauf zu:

import sys from awsglue.utils import getResolvedOptions args = getResolvedOptions(sys.argv, ['JOB_NAME', 'day_partition_key', 'hour_partition_key', 'day_partition_value', 'hour_partition_value']) print "The day partition key is: ", args['day_partition_key'] print "and the day partition value is: ", args['day_partition_value']

Wenn Sie ein Argument übergeben möchten, das eine verschachtelte JSON-Zeichenfolge ist, um den Parameterwert beizubehalten, während er an Ihren AWS Glue-ETL-Auftrag übergeben wird, müssen Sie die Parameterzeichenfolge kodieren, bevor Sie die Auftragsausführung starten, und dann die Parameterzeichenfolge dekodieren, bevor Sie auf Ihr Auftragsskript verweisen. Betrachten wir z. B. die folgende Argumentzeichenfolge:

glue_client.start_job_run(JobName = "gluejobname", Arguments={ "--my_curly_braces_string": '{"a": {"b": {"c": [{"d": {"e": 42}}]}}}' })

Um diesen Parameter korrekt zu übergeben, sollten Sie das Argument als Base64-codierte Zeichenfolge codieren.

import base64 ... sample_string='{"a": {"b": {"c": [{"d": {"e": 42}}]}}}' sample_string_bytes = sample_string.encode("ascii") base64_bytes = base64.b64encode(sample_string_bytes) base64_string = base64_bytes.decode("ascii") ... glue_client.start_job_run(JobName = "gluejobname", Arguments={ "--my_curly_braces_string": base64_bytes}) ... sample_string_bytes = base64.b64decode(base64_bytes) sample_string = sample_string_bytes.decode("ascii") print(f"Decoded string: {sample_string}") ...

Beispiel: Erstellen und Ausführen eines Auftrags

Im folgenden Beispiel wird gezeigt, wie die AWS Glue-APIs mithilfe von Python aufgerufen werden, um einen ETL-Auftrag zu erstellen und auszuführen.

So erstellen Sie einen Auftrag und führen ihn aus
  1. Erstellen Sie eine Instance des AWS Glue-Clients:

    import boto3 glue = boto3.client(service_name='glue', region_name='us-east-1', endpoint_url='https://glue.us-east-1.amazonaws.com')
  2. Erstellen Sie einen Auftrag. Sie müssen glueetl als Namen für den ETL-Befehl verwenden, wie im folgenden Code gezeigt:

    myJob = glue.create_job(Name='sample', Role='Glue_DefaultRole', Command={'Name': 'glueetl', 'ScriptLocation': 's3://my_script_bucket/scripts/my_etl_script.py'})
  3. Starten Sie eine neue Ausführung des Auftrags, den Sie im vorherigen Schritt erstellt haben:

    myNewJobRun = glue.start_job_run(JobName=myJob['Name'])
  4. Rufen Sie den Auftragsstatus ab:

    status = glue.get_job_run(JobName=myJob['Name'], RunId=myNewJobRun['JobRunId'])
  5. Drucken Sie den aktuellen Status der Auftragsausführung:

    print(status['JobRun']['JobRunState'])