Служебные программы файловой системы NotebookUtils для Fabric

notebookutils.fs предоставляет служебные программы для работы с различными файловыми системами, включая Azure Data Lake Storage (ADLS) 2-го поколения и хранилище BLOB-объектов Azure. Убедитесь, что доступ к Azure Data Lake Storage 2-го поколения и Хранилищу BLOB-объектов Azure настроен правильно.

Чтобы получить общие сведения о доступных методах, выполните следующие команды:

notebookutils.fs.help()

В следующей таблице перечислены доступные методы файловой системы:

Метод Signature Описание
ls ls(path: String): Array Показывает содержимое каталога.
mkdirs mkdirs(path: String): Boolean Создает указанный каталог, если он не существует, а также создает необходимые родительские каталоги.
cp cp(src: String, dest: String, recurse: Boolean = false): Boolean Копирует файл или каталог, возможно, между файловыми системами.
fastcp fastcp(src: String, dest: String, recurse: Boolean = true, extraConfigs: Map = None): Boolean Копирует файл или каталог с помощью azcopy для повышения производительности с большими томами данных.
mv mv(src: String, dest: String, create_path: Boolean, overwrite: Boolean = false): Boolean Перемещает файл или каталог, возможно, между файловыми системами.
put put(file: String, content: String, overwrite: Boolean = false): Boolean Записывает заданную строку в файл в кодировке UTF-8.
head head(file: String, max_bytes: int = 1024 * 100): String Возвращает до первых max_bytes байтов заданного файла в виде строки, закодированной в UTF-8.
append append(file: String, content: String, createFileIfNotExists: Boolean = false): Boolean Добавляет содержимое в файл.
rm rm(path: String, recurse: Boolean = false): Boolean Удаляет файл или каталог.
exists exists(path: String): Boolean Проверяет, существует ли файл или каталог.
getProperties getProperties(path: String): Map Возвращает свойства заданного пути. Доступно только в записных книжках Python (не поддерживается в PySpark, Scala или R).

Замечание

Все методы файловой системы доступны в записных книжках Python, PySpark, Scala и R, если не указано иное. Scala использует имена параметров в стиле camelCase (например, createPath вместо create_path, maxBytes вместо max_bytes).

Сведения о операциях подключения и отключения см. в разделе "Подключение файлов" и "Отключение".

Замечание

При работе с notebookutils.fs учитывайте следующие ограничения и соображения:

  • Поведение пути зависит от типа записной книжки: в записных книжках Spark относительные пути разрешаются в путь ABFSS, установленный по умолчанию в Lakehouse. В записных книжках Python относительные пути разрешаются в локальный рабочий каталог файловой системы (/home/trusted-service-user/work).
  • Ограничения параллельной записи: notebookutils.fs.append() и notebookutils.fs.put() не поддерживают одновременную запись в тот же файл из-за отсутствия гарантий атомарности.
  • Задержка цикла добавления: при использовании notebookutils.fs.append() в циклах добавьте 0,5-1 секунду спящего режима между записью для целостности данных.
  • Ограничения сочетаний клавиш OneLake: для сочетаний клавиш типа S3/GCS используйте подключенные пути вместо путей ABFS для cp() операций и fastcp() операций.
  • Ограничения между регионами: fastcp() не поддерживает копирование файлов в OneLake в разных регионах. Вместо этого используйте cp().
  • Версия среды выполнения: NotebookUtils предназначена для работы с Spark 3.4 (среда выполнения версии 1.2) и выше.
  • cp() поведение в записных книжках Python: В записных книжках Python cp() внутренне использует тот же механизм на основе azcopy, что и fastcp(), и оба метода ведут себя одинаково.

NotebookUtils работает с файловой системой так же, как и API Spark. Например, рассмотрим использование notebookutils.fs.mkdirs() и Lakehouse:

Использование Относительный путь от корневого каталога HDFS Абсолютный путь для файловой системы ABFS Абсолютный путь к локальной файловой системе на узле драйвера
Не по умолчанию Lakehouse Не поддерживаются notebookutils.fs.mkdirs("abfss://<container_name>@<storage_account_name>.dfs.core.windows.net/<new_dir>") notebookutils.fs.mkdirs("file:/<new_dir>")
По умолчанию Lakehouse Каталог в разделе "Файлы" или "Таблицы": notebookutils.fs.mkdirs("Files/<new_dir>") notebookutils.fs.mkdirs("abfss://<container_name>@<storage_account_name>.dfs.core.windows.net/<new_dir>") notebookutils.fs.mkdirs("file:/<new_dir>")
  • Для Лейкхауса по умолчанию пути к файлам закрепляются в записной книжке, а время ожидания кэша файлов по умолчанию составляет 120 секунд. Это означает, что файлы кэшируются в локальной временной папке записной книжки в течение 120 секунд, даже если они удаляются из Lakehouse. Если вы хотите изменить правило времени ожидания, можно отключить пути к файлам Lakehouse по умолчанию и снова подключить их с другим fileCacheTimeout значением.

  • Для конфигураций Lakehouse, отличных от настроек по умолчанию, можно задать подходящий параметр fileCacheTimeout при подключении путей Lakehouse. Установка времени ожидания на 0 гарантирует, что последний файл извлекается из сервера Lakehouse.

Перечень файлов

Чтобы получить список содержимого каталога, используйте notebookutils.fs.ls('Your directory path'). Рассмотрим пример.

notebookutils.fs.ls("Files/tmp") # Relative path works with different base paths depending on notebook type
notebookutils.fs.ls("abfss://<container_name>@<storage_account_name>.dfs.core.windows.net/<path>")  # Absolute path using ABFS file system
notebookutils.fs.ls("file:/tmp")  # Full path of the local file system of driver node

notebookutils.fs.ls() API ведет себя по-разному при использовании относительного пути в зависимости от типа ноутбука.

  • В записной книжке Spark: относительный путь задаётся относительно пути ABFSS по умолчанию в Lakehouse. Например, notebookutils.fs.ls("Files") указывает на каталог Files в Lakehouse по умолчанию.

    Рассмотрим пример.

    notebookutils.fs.ls("Files/sample_datasets/public_holidays.parquet")
    
  • В записной книжке Python: относительный путь определяется относительно рабочего каталога локальной файловой системы, который по умолчанию является /home/trusted-service-user/work. Вместо относительного пути следует использовать полный путь notebookutils.fs.ls("/lakehouse/default/Files") для доступа к каталогу Files в Lakehouse по умолчанию.

    Рассмотрим пример.

    notebookutils.fs.ls("/lakehouse/default/Files/sample_datasets/public_holidays.parquet")
    

Просмотр свойств файла.

Используется notebookutils.fs.ls() для проверки свойств файла, таких как имя файла, путь к файлу, размер файла и наличие элемента в файле или каталоге.

files = notebookutils.fs.ls('Your directory path')
for file in files:
    print(file.name, file.isDir, file.isFile, file.path, file.size)

Используйте f-strings, если требуется больше доступных для чтения выходных данных:

files = notebookutils.fs.ls("Files/data")
for file in files:
    print(f"Name: {file.name}, Size: {file.size}, IsDir: {file.isDir}, Path: {file.path}")

Создать новый каталог

Создайте каталог, если он не существует, включая все необходимые родительские каталоги.

notebookutils.fs.mkdirs('new directory name')  
notebookutils.fs.mkdirs("Files/<new_dir>")  # Works with the default Lakehouse files using relative path 
notebookutils.fs.mkdirs("abfss://<container_name>@<storage_account_name>.dfs.core.windows.net/<new_dir>")  # Based on ABFS file system 
notebookutils.fs.mkdirs("file:/<new_dir>")  # Based on local file system of driver node 

Копирование файла

Копирование файла или каталога в файловой системе. Задайте recurse=True для рекурсивного копирования каталогов.

notebookutils.fs.cp('source file or directory', 'destination file or directory', recurse=True)

Замечание

Примечание к записной книжке Python: Во внутренних записных книжках Python используется один и тот же механизм на основе azcopy, что обеспечивает эффективную производительность для обоих методов. Из-за ограничений ярлыка OneLake, если необходимо использовать notebookutils.fs.cp() для копирования данных из ярлыка типа S3/GCS, рекомендуется использовать смонтированный путь вместо пути abfss.

Подсказка

Всегда проверяйте возвращаемое значение типа Boolean, чтобы убедиться, что операция выполнена успешно. Используйте notebookutils.fs.exists() для проверки исходного пути перед началом операции копирования.

В следующем примере показана копия между разными системами хранения из стандартного Lakehouse в учетную запись ADLS Gen2.

notebookutils.fs.cp(
    "Files/local_data",
    "abfss://<container>@<account>.dfs.core.windows.net/remote_data",
    recurse=True
)

Эффективное копирование файла

Используйте fastcp для более эффективных операций копирования, особенно с большими томами данных. Параметр recurse по умолчанию True.

notebookutils.fs.fastcp('source file or directory', 'destination file or directory', recurse=True)

Подсказка

Используйте fastcp() вместо передачи cp() больших данных. Метод fastcp использует azcopy под капотом, что обеспечивает значительно лучшую пропускную способность для операций с массовыми файлами. В записных книжках Python и cp(), и fastcp() используют один и тот же базовый механизм.

Учитывайте следующие аспекты:

  • notebookutils.fs.fastcp() не поддерживает копирование файлов в OneLake в разных регионах. В этом случае вместо этого можно использовать notebookutils.fs.cp() .
  • Из-за ограничений ярлыка OneLake, если необходимо использовать notebookutils.fs.fastcp() для копирования данных из ярлыка типа S3/GCS, рекомендуется использовать смонтированный путь вместо пути abfss.

Предварительный просмотр содержимого файла

Вернитесь к первым max_bytes байтам файла в виде строки UTF-8.

notebookutils.fs.head('file path', max_bytes)

Подсказка

Для больших файлов используйте head() с соответствующим значением max_bytes, чтобы избежать проблем с памятью. Значение по умолчанию — 100 КБ (1024 * 100).

Следующий пример считывает первые 1000 байт файла:

content = notebookutils.fs.head("Files/data/sample.txt", 1000)
print(content)

Замечание

Значение max_bytes по умолчанию для разных языков: записные книжки на Python и на Scala используют 102400 (100 КБ), а записные книжки на R используют 65535 (64 КБ). В Scala этот параметр называется maxBytes.

Переместить файл

Перемещение файла или каталога между файловыми системами.

notebookutils.fs.mv('source file or directory', 'destination directory', create_path=True, overwrite=True)

Это важно

Параметр create_path по умолчанию зависит от среды выполнения:

  • Записные книжки Spark (PySpark, Scala, R): по умолчанию False (false в Scala, FALSE в R). Родительский каталог должен существовать перед операцией перемещения.
  • Записные книжки Python: по умолчанию True. Родительский каталог создается автоматически, если он не существует.

Чтобы обеспечить согласованное поведение во всех средах выполнения, явно задайте create_path параметр в коде. В Scala этот параметр называется createPath.

Используйте именованные параметры, если требуется более четкий код:

notebookutils.fs.mv("Files/source.csv", "Files/new_folder/dest.csv", create_path=True, overwrite=True)

Запишите файл

Напишите строку UTF-8 в файл.

notebookutils.fs.put("file path", "content to write", True) # Set the last parameter as True to overwrite the file if it already exists

Добавить содержимое в файл

Добавьте строку UTF-8 в файл.

notebookutils.fs.append("file path", "content to append", True) # Set the last parameter as True to create the file if it doesn't exist

Это важно

notebookutils.fs.append() и notebookutils.fs.put() не поддерживают одновременную запись в тот же файл из-за отсутствия гарантий атомарности.

При использовании notebookutils.fs.append API в цикле для записи в тот же for файл добавьте оператор sleep с задержкой около 0,5–1 секунды между повторяющимися записями. Эта рекомендация обусловлена тем, что внутренняя операция notebookutils.fs.append API flush асинхронна, поэтому короткая задержка помогает обеспечить целостность данных.

import time

for i in range(100):
    notebookutils.fs.append("Files/output/data.txt", f"Line {i}\n", True)
    time.sleep(0.5)  # Prevent data integrity issues

Удалить файл или каталог

Удаление файла или каталога. Установите recurse=True, чтобы рекурсивно удалять каталоги.

notebookutils.fs.rm('file path', recurse=True) 

Проверка наличия файла или каталога

Проверьте, существует ли файл или каталог по указанному пути. Возвращается True , если путь существует; в противном случае возвращается False.

notebookutils.fs.exists("Files/data/input.csv")

Подсказка

Используйте exists() перед выполнением операций с файлами, чтобы предотвратить ошибки. Например, убедитесь, что исходный файл существует, прежде чем пытаться скопировать или переместить его.

if notebookutils.fs.exists("Files/data/input.csv"):
    notebookutils.fs.cp("Files/data/input.csv", "Files/backup/input.csv")
    print("File copied successfully.")
else:
    print("Source file not found.")

Получение свойств файла

Получите свойства пути в формате отображения пар "имя-значение". Он поддерживается только для путей к хранилищу BLOB-объектов Azure.

Замечание

Этот getProperties метод доступен только в записных книжках Python. Он не поддерживается в записных книжках Spark (PySpark, Scala или R).

Параметры:

Параметр Тип Обязательный Описание
path String Да Путь ABFS к файлу или каталогу.

Возвращает: Словарь (карта), содержащий свойства метаданных, такие как размер файла, время создания, время последнего изменения и тип содержимого.

properties = notebookutils.fs.getProperties("abfss://<container_name>@<storage_account_name>.dfs.core.windows.net/<path>")
print(properties)