AWS Glue中的可选作业参数?

时间:2018-09-04 08:27:05

标签: python amazon-web-services aws-glue

如何为AWS Glue Job实施可选参数?

我创建了一个作业,该作业当前具有字符串参数(ISO 8601日期字符串)作为ETL作业中使用的输入。我想将此参数设为可选参数,以便该作业使用默认值(如果未提供)(例如,在我的情况下使用datetime.nowdatetime.isoformat)。我尝试使用getResolvedOptions

import sys
from awsglue.utils import getResolvedOptions

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

但是,当我不传递--ISO_8601_STRING作业参数时,会看到以下错误:

  

awsglue.utils.GlueArgumentError:参数--ISO_8601_STRING是必需的

6 个答案:

答案 0 :(得分:2)

有一种解决方法,可以使用可选参数。这个想法是在解决参数之前先检查参数(Scala):

val argName = 'ISO_8601_STRING'
var argValue = null
if (sysArgs.contains(s"--$argName"))
   argValue = GlueArgParser.getResolvedOptions(sysArgs, Array(argName))(argName)

答案 1 :(得分:2)

如果只有一个字段是可选的,则

matsevYuriy解决方案很好。

我为python写了一个包装函数,该函数更通用,可以处理不同的极端情况(强制字段和/或带有值的可选字段)。

import sys    
from awsglue.utils import getResolvedOptions

def get_glue_args(mandatory_fields, default_optional_args):
    """
    This is a wrapper of the glue function getResolvedOptions to take care of the following case :
    * Handling optional arguments and/or mandatory arguments
    * Optional arguments with default value
    NOTE: 
        * DO NOT USE '-' while defining args as the getResolvedOptions with replace them with '_'
        * All fields would be return as a string type with getResolvedOptions

    Arguments:
        mandatory_fields {list} -- list of mandatory fields for the job
        default_optional_args {dict} -- dict for optional fields with their default value

    Returns:
        dict -- given args with default value of optional args not filled
    """
    # The glue args are available in sys.argv with an extra '--'
    given_optional_fields_key = list(set([i[2:] for i in sys.argv]).intersection([i for i in default_optional_args]))

    args = getResolvedOptions(sys.argv,
                            mandatory_fields+given_optional_fields_key)

    # Overwrite default value if optional args are provided
    default_optional_args.update(args)

    return default_optional_args

用法:

# Defining mandatory/optional args
mandatory_fields = ['my_mandatory_field_1','my_mandatory_field_2']
default_optional_args = {'optional_field_1':'myvalue1', 'optional_field_2':'myvalue2'}
# Retrieve args
args = get_glue_args(mandatory_fields, default_optional_args)
# Access element as dict with args[‘key’]

答案 2 :(得分:1)

我看不到具有可选参数的方法,但是您可以在作业本身上指定默认参数,然后,如果您在运行作业时未传递该参数,则您的作业将收到默认值(请注意,默认值不能为空。

答案 3 :(得分:1)

如果使用的是接口,则必须提供以“-”开头的参数名称(例如“ --TABLE_NAME”,而不是“ TABLE_NAME”),然后可以像以下(python)代码一样使用它们:< / p>

args = getResolvedOptions(sys.argv, ['JOB_NAME', 'TABLE_NAME'])
table_name = args['TABLE_NAME']

答案 4 :(得分:1)

matsev's answer 包装在一个函数中:

def get_glue_env_var(key, default="none"):
    if f'--{key}' in sys.argv:
        return getResolvedOptions(sys.argv, [key])[key]
    else:
        return default

答案 5 :(得分:0)

Yuriy's answer移植到Python解决了我的问题:

if ('--{}'.format('ISO_8601_STRING') in sys.argv):
    args = getResolvedOptions(sys.argv, ['ISO_8601_STRING'])
else:
    args = {'ISO_8601_STRING': datetime.datetime.now().isoformat()}