[英]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.