awsglue.utils.GlueArgumentError: argument --JOB_NAME is required

awsglue.utils.GlueArgumentError: argument --JOB_NAME is required

当我 运行 使用 Python 的 AWS Glue 中的 Glue 作业样板时,出现错误

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

glueContext = GlueContext(SparkContext.getOrCreate())
spark = glueContext.spark_session

args = getResolvedOptions(sys.argv, ['JOB_NAME'])
job = Job(glue_context)
job.init(args[‘JOB_NAME’], args)

这是错误

in getResolvedOptions
File "/usr/lib64/python2.7/argparse.py", line 1733, in parse_known_args
namespace, args = self._parse_known_args(args, namespace)
File "/usr/lib64/python2.7/argparse.py", line 1957, in _parse_known_args
self.error(_('argument %s is required') % name)
awsglue.utils.GlueArgumentError: argument --JOB_NAME is required

这是我的代码,然后是

job.commit()

但是AWS说不提供JOBNAME。 我究竟做错了什么? 还有 getResolved 是做什么的?我尝试阅读 AWS 文档,但一无所获。

您能否提供示例脚本的参考 link。我相信 AWS 会解释说你应该使用脚本或 lambda 等开始工作。在这种情况下你会指定如下内容:

response = client.start_job_run(
             JobName = 'my_test_Job',
             Arguments = {
               '--day_partition_key':   'partition_0',
               '--hour_partition_key':  'partition_1',
               '--day_partition_value':  day_partition_value,
               '--hour_partition_value': hour_partition_value } )

然后在您的粘合作业中,您可以按如下方式访问这些变量:

args = getResolvedOptions(sys.argv,
                          ['JOB_NAME',
                           'day_partition_key',
                           'hour_partition_key',
                           'day_partition_value',
                           'hour_partition_value'])

因此,您在某处传递了 variable/value 作为作业名称。聪明的,尝试通过按名称 JOB_NAME 设置参数并传递一个值来 运行 作业。

以上代码示例参考:https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-extensions-get-resolved-options.html

让我们知道。

您不能在开发环境中运行以下命令。

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

这可能是一个迟到的回复,但为我解决了同样的错误。 将参数传递给 Glue 脚本: 在 Security configuration, script libraries, and job parameters (optional) --> Job parameters (key value) 中的 adding/editing 作业中传递作业参数,例如:

key = --JOB_NAME    value= my_job
key = --input       value= 'xyz'

要在 Glue 脚本中使用参数:

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

## @params: [job_name]
sc = SparkContext()
glueContext = GlueContext(SparkContext.getOrCreate())
spark = glueContext.spark_session
job = Job(glueContext)
args = getResolvedOptions(sys.argv, ['JOB_NAME','input'])
job.init(args['JOB_NAME'], args)
print("Job name is:{}, and input: {}".format(args["JOB_NAME"],args["input"]))

job.commit()

另外根据我的理解,它与开发环境无关,同时 adding/editing 仪表板参数中的胶水作业可以在不创建 lambda 函数的情况下传递。

我在遇到与 OP 类似的问题时偶然发现了这个解决方案,但使用的是 AWS Glue Python Shell 作业。上面斯瓦蒂的回答很有帮助。

如果有人试图将参数传递给 AWS Glue Python Shell 工作,下面是一个适合我的模板:

key = --JOB_NAME    value= my_job
key = --input       value= 'xyz'

AWS Glue Python Shell 作业脚本:

import sys
from awsglue.utils import getResolvedOptions

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

print("Job name is:{}, and input: {}".format(args["JOB_NAME"],args["input"]))

将JOB_NAME传递给脚本使用下面的命令提交您的脚本

$HOME/bin/aws-glue-libs-glue-1.0/bin/gluesparksubmit TestScripy.py --JOB_NAME local_test

local_test 是作业名称。我仍然不知道如何传递 JOBNAME

以外的键值对

更多信息请点击此处:https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html