Я пытаюсь прочитать schema
из файла text
в том же пакете, что и код, но не могу прочитать этот файл с помощью задания склеивания AWS. Я буду использовать это schema
для создания фрейма данных с помощью Pyspark
. Я могу загрузить этот файл локально. Я сжимаю файлы кода в формате .zip, помещаю их в корзину s3
, а затем ссылаюсь на них в работе по склеиванию. Все остальное работает нормально. Никаких проблем. Но когда я пробую приведенный ниже код, он не работает.
file_path = os.path.join(Path(os.path.dirname(os.path.relpath(__file__))), "verifications.txt")
multiline_data = None
with open(file_path, 'r') as data_file:
multiline_data = data_file.read()
self.logger.info(f"Schema is {multiline_data}")
Этот код выдает следующую ошибку:
Error Category: UNCLASSIFIED_ERROR; NotADirectoryError: [Errno 20] Not a directory: 'src.zip/src/ingestion/jobs/verifications.txt'
Я тоже пробовал с abs_path
, но тоже не помогло. Тот же блок кода отлично работает локально.
Я также пытался пройти путь "./verifications.txt"
напрямую, но безуспешно.
И как мне прочитать этот файл?
Скрипты AWS Glue обычно выполняются в управляемой среде, то есть ваш файл не виден сценарию ETL. Причина, по которой импорт работает на вашем локальном компьютере, заключается в том, что файл доступен оттуда, поскольку оба находятся на одном компьютере. Для таких работ рассмотрите возможность использования S3 для хранения файлов.
Как упомянул @Bogdan, способ сделать это — использовать S3 для хранения файла verifications.txt
. Вот пример кода с использованием boto3
import boto3
# Hardcoded S3 bucket/key (these are normally passed in as Glue Job params)
s3_bucket = 'your-bucket-name'
s3_key = 'path/to/verifications.txt'
# Read data from S3 using boto3
s3_client = boto3.client('s3')
response = s3_client.get_object(Bucket=s3_bucket, Key=s3_key)
multiline_data = response['Body'].read().decode('utf-8')
Если вы хотите получить доступ к файлу напрямую из zip-архива (учитывая ваш комментарий), вам, возможно, придется проявить больше фантазии...
import boto3
import zipfile
import io
# Initialize boto3 client for S3
s3 = boto3.client('s3')
# Define the bucket name and the zip file key
bucket_name = 'your-bucket-name'
zip_file_key = 'path/to/src.zip'
# Download the zip file from S3
zip_obj = s3.get_object(Bucket=bucket_name, Key=zip_file_key)
buffer = io.BytesIO(zip_obj['Body'].read())
# Open the zip file in memory
with zipfile.ZipFile(buffer, 'r') as zip_ref:
# List all files in the zip
print("Files in the zip:", zip_ref.namelist())
# Open and read a specific file within the zip without extracting
with zip_ref.open('verifications.txt') as file:
text_content = file.read().decode('utf-8')
print("Contents of the text file:", text_content)
Мой вопрос остается прежним. Итак, ребята, по вашему мнению, мы не можем использовать файловые операции с zip-файлом? Есть ли ссылки, подтверждающие ваши обоснования, пожалуйста?
Я думаю, что здесь есть два измерения: первое и самое важное заключается в том, что S3 является «хранилищем объектов» и не поддерживает обычные операции с файлами Python, такие как прямое чтение файлов, второе — как мне прочитать что-то из zip-файла, не разархивируя его. . Надеюсь, мой обновленный ответ охватывает оба измерения. :)
Да, имеет смысл
То есть вы имеете в виду, что файловые операции не будут работать в Glue? @Богдан