Compartilhar via


Utilitários do sistema de arquivos NotebookUtils para Fabric

notebookutils.fs fornece utilitários para trabalhar com vários sistemas de arquivos, incluindo o Azure Data Lake Storage (ADLS) Gen2 e o Armazenamento de Blobs do Azure. Configure o acesso ao Azure Data Lake Storage Gen2 e ao Armazenamento de Blobs do Azure adequadamente.

Execute os seguintes comandos para obter uma visão geral dos métodos disponíveis:

notebookutils.fs.help()

A tabela a seguir lista os métodos disponíveis do sistema de arquivos:

Método Signature Descrição
ls ls(path: String): Array Lista o conteúdo de um diretório.
mkdirs mkdirs(path: String): Boolean Cria o diretório especificado se ele não existir, criando também os diretórios pai necessários.
cp cp(src: String, dest: String, recurse: Boolean = false): Boolean Copia um arquivo ou diretório, possivelmente entre sistemas de arquivos.
fastcp fastcp(src: String, dest: String, recurse: Boolean = true, extraConfigs: Map = None): Boolean Copia um arquivo ou diretório por meio de azcopy para melhorar o desempenho com grandes volumes de dados.
mv mv(src: String, dest: String, create_path: Boolean, overwrite: Boolean = false): Boolean Move um arquivo ou diretório, possivelmente entre sistemas de arquivos.
put put(file: String, content: String, overwrite: Boolean = false): Boolean Grava a cadeia de caracteres fornecida em um arquivo, codificada em UTF-8.
head head(file: String, max_bytes: int = 1024 * 100): String Retorna até os primeiros max_bytes bytes do arquivo especificado como uma cadeia de caracteres codificada em UTF-8.
append append(file: String, content: String, createFileIfNotExists: Boolean = false): Boolean Acrescenta o conteúdo a um arquivo.
rm rm(path: String, recurse: Boolean = false): Boolean Remove um arquivo ou diretório.
exists exists(path: String): Boolean Verifica se existe um arquivo ou diretório.
getProperties getProperties(path: String): Map Obtém as propriedades do caminho fornecido. Disponível apenas em notebooks Python (sem suporte no PySpark, Scala ou R).

Observação

Todos os métodos do sistema de arquivos estão disponíveis em notebooks de Python, PySpark, Scala e R, salvo indicação em contrário. Scala usa nomes de parâmetro camelCase (por exemplo, createPath em vez de create_path, maxBytes em vez de max_bytes).

Para operações de montagem e desmontagem, consulte Montagem e desmontagem de arquivos.

Observação

Tenha em mente as seguintes restrições e considerações ao trabalhar com notebookutils.fs:

  • O comportamento do caminho varia por tipo de bloco de anotações: em notebooks Spark, os caminhos relativos resolvem-se para o caminho padrão do Lakehouse ABFSS. Nos notebooks Python, caminhos relativos são resolvidos em relação ao diretório de trabalho do sistema de arquivos local (/home/trusted-service-user/work).
  • Limitações de gravação simultâneas: notebookutils.fs.append() e notebookutils.fs.put() não oferecem suporte a gravações simultâneas no mesmo arquivo devido à falta de garantias de atomicidade.
  • Adicionar atraso no loop: ao usar notebookutils.fs.append() em loops, adicione uma pausa de 0,5 a 1 segundo entre gravações para integridade dos dados.
  • Limitações de atalho do OneLake: para atalhos do tipo S3/GCS, use caminhos montados em vez de caminhos ABFS para operações cp() e fastcp().
  • Limitações entre regiões: fastcp() não dá suporte à cópia de arquivos no OneLake entre regiões. Use cp() em seu lugar.
  • Versão de runtime: o NotebookUtils foi projetado para funcionar com o Spark 3.4 (Runtime v1.2) e superior.
  • cp() comportamento em notebooks Python: Em notebooks Python, cp() usa internamente o mesmo mecanismo, baseado em azcopy, que fastcp(), portanto, ambos os métodos se comportam de forma idêntica.

O NotebookUtils funciona com o sistema de arquivos da mesma forma que as APIs do Spark. Tome notebookutils.fs.mkdirs() e o uso do Lakehouse como exemplo:

Usage Caminho relativo da raiz do HDFS Caminho absoluto para o sistema de arquivos ABFS Caminho absoluto para o sistema de arquivos local no nó do driver
Lakehouse não padrão Sem suporte notebookutils.fs.mkdirs("abfss://<container_name>@<storage_account_name>.dfs.core.windows.net/<new_dir>") notebookutils.fs.mkdirs("file:/<new_dir>")
Lakehouse padrão Diretório em 'Arquivos' ou 'Tabelas': 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>")
  • Para o Lakehouse padrão, os caminhos de arquivo são montados em seu notebook com um tempo limite de cache de arquivo padrão de 120 segundos. Isso significa que os arquivos são armazenados em cache na pasta temporária local do notebook por 120 segundos, mesmo que sejam removidos do Lakehouse. Se você quiser alterar a regra de tempo limite, poderá desmontar os caminhos de arquivo padrão do Lakehouse e montá-los novamente com um valor diferente fileCacheTimeout .

  • Para configurações não padrão do Lakehouse, você pode definir o parâmetro apropriado fileCacheTimeout durante a montagem dos caminhos lakehouse. Definir o tempo limite como 0 garante que o arquivo mais recente seja buscado do servidor Lakehouse.

Listar arquivos

Para listar o conteúdo de um diretório, use notebookutils.fs.ls('Your directory path'). Por exemplo:

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

A notebookutils.fs.ls() API se comporta de forma diferente ao usar um caminho relativo, dependendo do tipo de notebook.

  • Em um notebook do Spark: o caminho relativo se refere ao caminho ABFSS padrão do Lakehouse. Por exemplo, notebookutils.fs.ls("Files") aponta para o diretório Files no Lakehouse padrão.

    Por exemplo:

    notebookutils.fs.ls("Files/sample_datasets/public_holidays.parquet")
    
  • Em um notebook python: o caminho relativo é relativo ao diretório de trabalho do sistema de arquivos local, que por padrão é /home/trusted-service-user/work. Portanto, você deve usar o caminho completo em vez de um caminho relativo notebookutils.fs.ls("/lakehouse/default/Files") para acessar o diretório Files no Lakehouse padrão.

    Por exemplo:

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

Exibir propriedades de arquivo

Use notebookutils.fs.ls() para inspecionar as propriedades do arquivo, como nome do arquivo, caminho do arquivo, tamanho do arquivo e se um item é um arquivo ou diretório.

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

Use cadeias de caracteres f se desejar uma saída mais legível:

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

Criar um diretório

Crie um diretório se ele não existir, incluindo todos os diretórios predecessores necessários.

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 

Copiar arquivo

Copie um arquivo ou diretório entre sistemas de arquivos. Defina recurse=True para copiar diretórios recursivamente.

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

Observação

Observação do notebook Python: nos notebooks Python, cp() usa internamente o mesmo mecanismo baseado em azcopy que o fastcp(), proporcionando um desempenho eficiente para ambos os métodos. Devido às limitações do atalho do OneLake, quando você precisa usar notebookutils.fs.cp() para copiar dados do atalho de tipo S3/GCS, é recomendável usar um caminho montado em vez de um caminho abfss.

Dica

Sempre verifique o valor retornado booliano para verificar se a operação foi bem-sucedida. Use notebookutils.fs.exists() para verificar o caminho de origem antes de iniciar uma operação de cópia.

O exemplo a seguir mostra uma cópia de armazenamento cruzado do Lakehouse padrão para uma conta do ADLS Gen2:

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

Arquivo de cópia com desempenho

Use fastcp para operações de cópia mais eficientes, especialmente com grandes volumes de dados. O recurse parâmetro usa Truecomo padrão .

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

Dica

Use fastcp() em vez de cp() para transferências de dados grandes. O método fastcp usa azcopy nos bastidores, o que proporciona uma taxa de transferência significativamente melhor para operações de arquivos em massa. Nos notebooks Python, ambos cp() e fastcp() usam o mesmo mecanismo subjacente.

Lembre-se do seguinte:

  • notebookutils.fs.fastcp() não dá suporte à cópia de arquivos no OneLake entre regiões. Nesse caso, você pode usar notebookutils.fs.cp().
  • Devido às limitações do atalho do OneLake, quando você precisa usar notebookutils.fs.fastcp() para copiar dados do atalho de tipo S3/GCS, é recomendável usar um caminho montado em vez de um caminho abfss.

Visualizar o conteúdo do arquivo

Retorne até os primeiros max_bytes bytes de um arquivo como uma cadeia de caracteres UTF-8.

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

Dica

Para arquivos grandes, use head() com um valor apropriado max_bytes para evitar problemas de memória. O valor padrão é 100 KB (1024 * 100).

O exemplo a seguir lê os primeiros 1.000 bytes de um arquivo:

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

Observação

O valor padrão de max_bytes difere entre linguagens: os notebooks Python e Scala usam 102400 (100 KB), enquanto os notebooks R usam 65535 (64 KB). No Scala, esse parâmetro é nomeado maxBytes.

Mover arquivo

Mova um arquivo ou diretório entre sistemas de arquivos.

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

Importante

O create_path padrão do parâmetro varia de acordo com o runtime:

  • Notebooks Spark (PySpark, Scala, R): padrão é False (false em Scala, FALSE em R). O diretório pai deve existir antes da operação de movimentação.
  • Notebooks python: padrão para True. O diretório pai será criado automaticamente se ele não existir.

Para garantir um comportamento consistente em runtimes, defina explicitamente o create_path parâmetro em seu código. No Scala, esse parâmetro é nomeado createPath.

Use parâmetros nomeados se desejar um código mais claro:

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

Gravar arquivo

Escreva uma cadeia de caracteres UTF-8 em um arquivo.

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

Acrescentar conteúdo a um arquivo

Acrescente uma cadeia de caracteres UTF-8 a um arquivo.

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

Importante

notebookutils.fs.append() e notebookutils.fs.put() não suportam escrita simultânea no mesmo arquivo devido à ausência de garantias de atomicidade.

Ao usar a notebookutils.fs.append API em um for loop para gravar no mesmo arquivo, adicione uma sleep instrução de cerca de 0,5 a 1 segundo entre as gravações recorrentes. Essa recomendação ocorre porque a operação de notebookutils.fs.append interna da API flush é assíncrona, portanto, um pequeno atraso ajuda a garantir a integridade dos dados.

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

Excluir arquivo ou diretório

Remova um arquivo ou diretório. Defina recurse=True para remover diretórios recursivamente.

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

Verificar se existe um arquivo ou diretório

Verifique se existe um arquivo ou diretório no caminho especificado. Ele retornará True se o caminho existir; caso contrário, retornará False.

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

Dica

Use exists() antes de executar operações de arquivo para evitar erros. Por exemplo, verifique se existe um arquivo de origem antes de tentar copiá-lo ou movê-lo.

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.")

Obter propriedades do arquivo

Obtenha as propriedades de um caminho no formato de um mapa de pares nome-valor. É compatível apenas com caminhos do Azure Blob Storage.

Observação

O getProperties método está disponível apenas em notebooks Python. Não há suporte para ele em notebooks Spark (PySpark, Scala ou R).

Parâmetros:

Parâmetro Tipo Obrigatório Descrição
path String Sim Caminho do ABFS para o arquivo ou diretório.

Retorna: Um dicionário (mapa) que contém propriedades de metadados, como tamanho do arquivo, tempo de criação, hora da última modificação e tipo de conteúdo.

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