Chiamata di API AWS Glue in Python - AWS Glue

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Chiamata di API AWS Glue in Python

Le API delle risorse Boto 3 non sono ancora disponibili per AWS Glue. Al momento, solo le API del client di Boto 3 possono essere utilizzate.

Nomi delle API AWS Glue in Python

I nomi delle API AWS Glue in Java e altri linguaggi di programmazione sono in genere costituiti da combinazioni di lettere maiuscole e minuscole. Tuttavia, quando vengono chiamati da Python, questi nomi generici vengono modificati in minuscolo, con le parti del nome separate da caratteri di sottolineatura per renderli più adatti a Python. Nella documentazione di riferimento AWS Glue API, questi nomi adatti a Python sono elencati in parentesi dopo i nomi generici CamelCased.

Tuttavia, anche se i nomi delle API AWS Glue vengono trasformati in lettere minuscole, i nomi dei relativi parametri rimangono in maiuscolo. È importante ricordarlo, perché i parametri devono essere passati usando il nome quando si chiamano le API AWS Glue, come descritto nella sezione seguente.

Passaggio di parametri Python in AWS Glue e accesso ai parametri

Quando in Python si chiamano le API AWS Glue, è preferibile passare i parametri in modo esplicito usando il nome. Ad esempio:

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

È utile comprendere che Python crea un dizionario delle tuple nome/valore specificate come argomenti di uno script ETL in una Struttura del processo o JobRun struttura. Boto 3 esegue quindi il passaggio ad AWS Glue in formato JSON mediante una chiamata API REST. Questo significa che non puoi fare affidamento sull'ordine degli argomenti al momento dell'accesso nello script.

Ad esempio, supponiamo che stai avviando un JobRun in una funzione del gestore Lambda di Python e che desideri specificare più parametri. Il tuo codice potrebbe essere simile a quanto segue:

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

Per accedere a questi parametri in modo affidabile nello script ETL, specificali per nome usando la funzione AWS Glue di getResolvedOptions e quindi esegui l'accesso dal dizionario risultante:

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']

Se desideri passare un argomento che è una stringa JSON annidata, per preservare il valore del parametro man mano che viene passato al processo ETL AWS Glue, devi codificare la stringa del parametro prima di avviare l'esecuzione del processo, quindi decodificare la stringa del parametro prima di riferirla allo script di processo. Ad esempio, considera la seguente stringa di argomento:

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

Per passare correttamente questo parametro, devi codificare l'argomento come una stringa codificata Base64.

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}") ...

Esempio: creazione ed esecuzione di un processo

L'esempio seguente mostra come chiamare le API AWS Glue usando Python, per creare ed eseguire un processo ETL.

Per creare ed eseguire un processo
  1. Crea un'istanza del client AWS Glue:

    import boto3 glue = boto3.client(service_name='glue', region_name='us-east-1', endpoint_url='https://glue.us-east-1.amazonaws.com')
  2. Crea un processo. Devi utilizzare glueetl come nome per il comando ETL, come mostrato nel codice seguente:

    myJob = glue.create_job(Name='sample', Role='Glue_DefaultRole', Command={'Name': 'glueetl', 'ScriptLocation': 's3://my_script_bucket/scripts/my_etl_script.py'})
  3. Avvia una nuova esecuzione del processo creato nella fase precedente:

    myNewJobRun = glue.start_job_run(JobName=myJob['Name'])
  4. Ottieni lo stato del processo:

    status = glue.get_job_run(JobName=myJob['Name'], RunId=myNewJobRun['JobRunId'])
  5. Stampa lo stato attuale del processo eseguito:

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