Memanggil AWS Glue API dengan Python - AWS Glue

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Memanggil AWS Glue API dengan Python

Perhatikan bahwa API sumber daya Boto 3 belum tersedia untukAWS Glue. Saat ini, hanya API klien Boto 3 yang dapat digunakan.

AWS GlueNama API dalam Python

AWSNama Glue API di Java dan bahasa pemrograman lainnya umumnya CamelCased. Namun, ketika dipanggil dari Python, nama-nama generik ini diubah menjadi huruf kecil, di mana bagian-bagian dari nama tersebut dipisahkan oleh karakter garis bawah untuk membuatnya menjadi lebih "Pythonic". Dalam dokumentasi AWS Glue API referensi, nama-nama Pythonic ini tercantum dalam tanda kurung setelah nama generik. CamelCased

Namun, meskipun nama AWS Glue API itu sendiri diubah menjadi huruf kecil, nama parameternya tetap dikapitalisasi. Penting untuk diingat ini, karena parameter harus diteruskan dengan nama saat memanggil AWS Glue API, seperti yang dijelaskan di bagian berikut.

Melewati dan mengakses parameter Python di AWS Glue

Dalam panggilan Python ke AWS Glue API, yang terbaik adalah meneruskan parameter secara eksplisit berdasarkan nama. Misalnya:

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

Hal ini akan membantu untuk memahami bahwa Python menciptakan kamus tupel nama/nilai yang Anda tentukan sebagai argumen untuk skrip ETL dalam Struktur Job atau JobRun struktur. Boto 3 kemudian meneruskannya ke AWS Glue dalam format JSON melalui panggilan REST API. Ini berarti bahwa Anda tidak dapat mengandalkan urutan argumen ketika Anda mengaksesnya dalam skrip Anda.

Misalnya, anggaplah Anda memulai JobRun dalam fungsi penangan Python Lambda, dan Anda ingin menentukan beberapa parameter. Kode Anda mungkin terlihat seperti yang berikut ini:

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

Untuk mengakses parameter ini dengan andal dalam skrip ETL Anda, tentukan dengan nama menggunakan AWS Glue getResolvedOptions fungsi dan kemudian akses dari kamus yang dihasilkan:

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

Jika Anda ingin meneruskan argumen yang merupakan string JSON bersarang, untuk mempertahankan nilai parameter saat diteruskan ke pekerjaan AWS Glue ETL Anda, Anda harus menyandikan string parameter sebelum memulai pekerjaan, dan kemudian memecahkan kode string parameter sebelum mereferensikannya skrip pekerjaan Anda. Sebagai contoh, pertimbangkan string argumen berikut:

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

Untuk memberikan parameter ini dengan benar, Anda harus mengkodekan argumen sebagai string dengan encoding 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}") ...

Contoh: Membuat dan menjalankan pekerjaan

Contoh berikut menunjukkan bagaimana memanggil AWS Glue API menggunakan Python, untuk membuat dan menjalankan pekerjaan ETL.

Membuat dan menjalankan sebuah tugas
  1. Buat instance AWS Glue klien:

    import boto3 glue = boto3.client(service_name='glue', region_name='us-east-1', endpoint_url='https://glue.us-east-1.amazonaws.com')
  2. Membuat sebuah tugas. Anda harus menggunakan glueetl sebagai nama untuk perintah ETL, seperti yang ditunjukkan dalam kode berikut:

    myJob = glue.create_job(Name='sample', Role='Glue_DefaultRole', Command={'Name': 'glueetl', 'ScriptLocation': 's3://my_script_bucket/scripts/my_etl_script.py'})
  3. Mulai eksekusi baru pada tugas Anda yang Anda buat di langkah sebelumnya:

    myNewJobRun = glue.start_job_run(JobName=myJob['Name'])
  4. Ambil status tugas:

    status = glue.get_job_run(JobName=myJob['Name'], RunId=myNewJobRun['JobRunId'])
  5. Mencetak status eksekusi tugas saat ini:

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