我有一个脚本,我想将配置文件传递到其中。在 Glue 作业页面上,我看到有一个指向我的配置文件的"引用文件路径"。然后,如何在 ETL 脚本中使用该文件?
我已经尝试过from configuration import *
,其中引用的文件名是 configuration.py
,但没有运气(导入错误:没有名为配置的模块(。
我注意到了同样的问题。我相信已经有一张票可以解决这个问题,但这是AWS支持在此期间的建议。
如果您在 Python 中使用引用的文件路径变量 shell job,引用的文件位于
/tmp
中,其中 Python shell 默认情况下,作业没有访问权限。但是,相同的操作有效 在 Spark 作业中成功,因为在默认中找到该文件 文件目录。
下面的代码有助于查找 Glue 作业配置中引用的sample_config.json
的绝对路径并打印其内容。
import json
import sys, os
def get_referenced_filepath(file_name, matchFunc=os.path.isfile):
for dir_name in sys.path:
candidate = os.path.join(dir_name, file_name)
if matchFunc(candidate):
return candidate
raise Exception("Can't find file: ".format(file_name))
with open(get_referenced_filepath('sample_config.json'), "r") as f:
data = json.load(f)
print(data)
Boto3 API也可用于访问引用的文件
import boto3
s3 = boto3.resource('s3')
obj = s3.Object('sample_bucket', 'sample_config.json')
for line in obj.get()['Body']._raw_stream:
print(line)
我在 Glue v2 Spark 作业中遇到了这个问题,而不是另一个答案详细讨论的 Python shell 作业。
AWS 文档指出,没有必要压缩单个.py
文件。但是,我决定无论如何都使用.zip
文件。
我的.zip
文件包含以下内容:
Archive: utils.zip
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
0 Defl:N 5 0% 01-01-2049 00:00 00000000 __init__.py
6603 Defl:N 1676 75% 01-01-2049 00:00 f4551ccb utils.py
-------- ------- --- -------
6603 1681 75% 2 files
请注意,__init__.py
存在,并且使用Deflate(通常的zip格式(压缩存档。
在我的 Glue 作业中,我添加了指向 S3 上的 zip 文件的引用文件路径作业参数。
在作业脚本中,我需要在导入工作之前将我的 zip 文件显式添加到 Python 路径。
import sys
sys.path.insert(0, "utils.zip")
import utils
未能执行上述操作会导致ImportError: No module named
错误。
对于其他正在为此苦苦挣扎的人,检查以下变量帮助我调试问题并找到解决方案。粘贴到您的 Glue 作业中,并在 Cloudwatch 中查看结果。
import sys
import os
print(f"os.getcwd()={os.getcwd()}")
print(f"os.listdir('.')={os.listdir('.')}")
print(f"sys.path={sys.path}")