使用日期作为变量参数化 ETL 的 AWS Glue 作业
Parameterize AWS Glue Job for ETL with Date as variables
我对 AWS 还很陌生,目前正在探索它。我希望获得有关如何使用 AWS Glue 的见解或建议。
假设我想要 运行 一个使用 SELECT
作为输入并将其输出到 Redshift
的脚本。但是,我想为 WHERE
子句使用一个参数,特别是 dates。在 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
之类的东西进行暂存,在 Fact Table 中使用 LEFT JOIN
。但我似乎无法弄清楚 Glue 是如何做到这一点的。
我读过一些 articles/posts 建议对变量使用平面文件,但我不太确定如何执行此操作。
有什么想法吗?
我想通了。
首先,通过 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)
我对 AWS 还很陌生,目前正在探索它。我希望获得有关如何使用 AWS Glue 的见解或建议。
假设我想要 运行 一个使用 SELECT
作为输入并将其输出到 Redshift
的脚本。但是,我想为 WHERE
子句使用一个参数,特别是 dates。在 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
之类的东西进行暂存,在 Fact Table 中使用 LEFT JOIN
。但我似乎无法弄清楚 Glue 是如何做到这一点的。
我读过一些 articles/posts 建议对变量使用平面文件,但我不太确定如何执行此操作。
有什么想法吗?
我想通了。
首先,通过 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)