Распаковать файл в Azure Blob-хранилище из Databricks

Вопрос или проблема

Я пытаюсь разархивировать файл, который находится в контейнере Azure ADLS Gen2 через Azure Databricks Pyspark. Когда я использую ZipFile, получаю ошибку BadZipFile или FileNotFoundError.

Я могу читать CSV-файлы в той же папке, но не ZIP-файлы.

Путь к ZIP-файлу такой же, как тот, что я получаю из dbutils.fs.ls(blob_folder_url).

Код BadZipFile:
BadZipFile

Код FileNotFound:
FileNotFound

Код чтения CSV:
reading csv

Код:

import zipfile, os, io, re

# Данные о хранилище Azure Blob
storage_account_name = "<>"
container_name = "<>"
folder_path = "<>"

blob_folder_url = f"abfss://{container_name}@{storage_account_name}.dfs.core.windows.net/{folder_path}"
zip_file = blob_folder_url + 'batch1_weekly_catman_20241109.zip'

# Список файлов в указанной папке блоба
files = dbutils.fs.ls(blob_folder_url)

for file in files:
    # Проверка, является ли файл ZIP-файлом
    if file.name.endswith('.zip'):
        print(f"Обработка ZIP-файла: {file.name}")

        # Чтение ZIP-файла в память
        zip_file_path = file.path
        zip_blob_data = dbutils.fs.head(zip_file_path)  # Чтение содержимого ZIP-файла

        # Разархивация файла
        with zipfile.ZipFile(io.BytesIO(zip_blob_data.encode('utf-8')), 'r') as z:
            print('zipppppppper')
        # with zipfile.ZipFile(zip_file, 'r') as z:
        #     print('zipppppppper')  

Сообщения об ошибках:

  1. BadZipFile: Файл не является zip-файлом
  2. FileNotFoundError: [Errno 2] Нет такого файла или директории

Ответ или решение

Как распаковать ZIP-файл в Azure Blob Storage из Databricks с использованием Pyspark

Введение

Работа с файлами в Azure Data Lake Storage (ADLS) Gen2 через Databricks имеет свои нюансы. В частности, распаковка ZIP-файлов может вызвать трудности, если не следовать правильной последовательности действий. Если вы сталкиваетесь с ошибками BadZipFile или FileNotFoundError, это может быть связано с неправильной обработкой файловой системы Azure или с неверным форматом данных.

Решение проблемы

1. Проверка доступа к файлам

Прежде всего, убедитесь, что у вас есть правильные права доступа к контейнеру и к объему данных. Используйте dbutils.fs.ls(blob_folder_url), чтобы убедиться, что файл ZIP действительно находится по указанному пути.

2. Чтение ZIP-файла

Обратите внимание на то, что метод dbutils.fs.head(zip_file_path) будет использоваться для чтения содержимого файла. Этот метод возвращает лишь первые 1 МБ данных, что может не охватывать весь ZIP-файл, особенно если его размер превышает этот лимит. Вместо этого мы можем воспользоваться методом dbutils.fs.cp для копирования ZIP-файла во временное место, прежде чем распаковать его.

Пример кода

Создайте следующий код для правильной распаковки файла:

import zipfile
import io
from pyspark.dbutils import DBUtils

# Инициализация DBUtils
dbutils = DBUtils(spark)

# Azure Blob Storage детали
storage_account_name = "<ваше_имя_хранилища>"
container_name = "<имя_контейнера>"
folder_path = "<путь>"

blob_folder_url = f"abfss://{container_name}@{storage_account_name}.dfs.core.windows.net/{folder_path}"
zip_file_name = 'batch1_weekly_catman_20241109.zip'
zip_file_path = f"{blob_folder_url}/{zip_file_name}"

# Копируем ZIP-файл во временное хранилище Databricks
dbutils.fs.cp(zip_file_path, f"file:/tmp/{zip_file_name}")

# Открываем и распаковываем ZIP-файл
with zipfile.ZipFile(f"/tmp/{zip_file_name}", 'r') as zip_ref:
    zip_ref.extractall("/tmp/extracted_files")

print("Файлы успешно распакованы в /tmp/extracted_files")

3. Работа с распакованными файлами

Теперь, когда вы распаковали файлы, они будут доступны в каталоге /tmp/extracted_files. Вы можете использовать PySpark для обработки этих файлов. Например:

# Пример чтения CSV-файлов после распаковки
csv_files = dbutils.fs.ls("file:/tmp/extracted_files")

for csv_file in csv_files:
    if csv_file.name.endswith('.csv'):
        df = spark.read.csv(csv_file.path, header=True, inferSchema=True)
        df.show()

Заключение

Распаковка ZIP-файлов в Azure Blob Storage из Databricks может быть осуществлена через копирование файла в локальную файловую систему Databricks и дальнейшее использование стандартных инструментов Python для работы с ZIP-архивами. Важно следовать правильной последовательности действий и учитывать ограничения по размеру данных, доступных через dbutils.fs.head. Кроме того, убедитесь, что у вас есть необходимые права доступа на чтение файлов в контейнере.

Следите за обновлениями документации Azure и Databricks, поскольку они постоянно развиваются и могут предоставлять новые возможности для обработки данных.

Оцените материал
Добавить комментарий

Капча загружается...