繁体   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