簡體   English   中英

使用日期作為變量為 ETL 參數化 AWS Glue 作業

[英]Parameterize AWS Glue Job for ETL with Date as variables

我對 AWS 還很陌生,目前正在探索它。 我希望獲得有關如何使用 AWS Glue 的見解或建議。 假設我想運行一個腳本,該腳本使用SELECT進行輸入並將其輸出到Redshift 但是,我想為WHERE子句使用一個參數,特別是date 在 Python 中,它是這樣的:

df = "SELECT * FROM table WHERE date between {0}-{1}-{3} AND {4}-{5}-{6}".format(day,month,year,day2,month2,year2)

獲得這些值后,我會在 Redshift 中使用類似TEMP table的內容進行暫存,並在事實表中使用LEFT JOIN 但我似乎無法弄清楚 Glue 如何做到這一點。

我讀過一些建議對變量使用平面文件的文章/帖子,但我不太確定如何執行此操作。

有什么想法嗎?

我已經想通了。

首先,通過 AWS Glue 創建一個 Python Shell 作業,然后使用以下代碼:

import sys
from awsglue.utils import getResolvedOptions

args = getResolvedOptions(sys.argv, ['fromDate', 'toDate'])


print ("VAL1 is : ", args['fromDate'])
print ("VAL2: ", args['fromDate'])

query = "SELECT * FROM table WHERE date BETWEEN '{}' AND '{}'".format(args['fromDate'], args['toDate')


print(query)

上面的代碼是為了獲取Job中傳入的參數。

另請注意,您必須在創建作業時在控制台中添加作業參數

然后您將需要一個用於將參數傳遞給作業的代碼。 我為此使用了boto3

import boto3
import time

job_name = 'example_job'
client = boto3.client(service_name='glue', region_name='ap-southeast-1',
          endpoint_url='https://glue.ap-southeast-1.amazonaws.com') 

response = client.start_job_run(JobName=job_name, Arguments={"--fromDate":"1-1-2019",
                                                             "--toDate":"31-12-2019"
                                                            })
status = client.get_job_run(JobName=job_name, RunId=response['JobRunId'])

if status:
    state = status['JobRun']['JobRunState']
    while state not in ['SUCCEEDED']:
        time.sleep(30)
        status = client.get_job_run(JobName=job_name, RunId=response['JobRunId'])
        state = status['JobRun']['JobRunState']
        if state in ['STOPPED', 'FAILED', 'TIMEOUT']:
            raise Exception('Failed to execute glue job: ' + status['JobRun']['ErrorMessage'] + '. State is : ' + state)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM