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