如何在 ETL 脚本中导入引用的文件



我有一个脚本,我想将配置文件传递到其中。在 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}")

最新更新