Partilhar via


Utilitários do sistema de ficheiros NotebookUtils para Fabric

notebookutils.fs fornece utilitários para trabalhar com vários sistemas de ficheiros, incluindo Azure Data Lake Storage (ADLS) Gen2 e Azure Blob Storage. Certifique-se de configurar o acesso ao Azure Data Lake Storage Gen2 e ao Armazenamento Blob do Azure adequadamente.

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

notebookutils.fs.help()

A tabela seguinte lista os métodos disponíveis no sistema de ficheiros:

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 dado se este não existir, criando também quaisquer diretórios pais necessários.
cp cp(src: String, dest: String, recurse: Boolean = false): Boolean Copia um ficheiro ou diretório, possivelmente entre sistemas de ficheiros.
fastcp fastcp(src: String, dest: String, recurse: Boolean = true, extraConfigs: Map = None): Boolean Copia um ficheiro ou diretório via azcopy para melhor desempenho com volumes de dados grandes.
mv mv(src: String, dest: String, create_path: Boolean, overwrite: Boolean = false): Boolean Move um ficheiro ou diretório, possivelmente entre sistemas de ficheiros.
put put(file: String, content: String, overwrite: Boolean = false): Boolean Grava a cadeia de caracteres fornecida em um arquivo, codificado em UTF-8.
head head(file: String, max_bytes: int = 1024 * 100): String Retorna até os primeiros max_bytes bytes do ficheiro dado como um String codificado em UTF-8.
append append(file: String, content: String, createFileIfNotExists: Boolean = false): Boolean Acrescenta o conteúdo a um ficheiro.
rm rm(path: String, recurse: Boolean = false): Boolean Remove um ficheiro ou diretório.
exists exists(path: String): Boolean Verifica se existe um ficheiro ou diretório.
getProperties getProperties(path: String): Map Obtém as propriedades do caminho dado. Disponível apenas em notebooks Python (não suportado em PySpark, Scala ou R).

Observação

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

Para operações de montagem e desmontagem, veja Montar e desmontar Ficheiros.

Observação

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

  • O comportamento dos caminhos varia consoante o tipo de caderno: Nos cadernos Spark, os caminhos relativos resolvem-se para o caminho ABFSS padrão do Lakehouse. Em cadernos Python, os caminhos relativos resolvem-se para o diretório de trabalho do sistema de ficheiros local (/home/trusted-service-user/work).
  • Limitações de escrita concorrente: notebookutils.fs.append() e notebookutils.fs.put() não suportam escritas concorrentes no mesmo ficheiro devido à falta de garantias de atomicidade.
  • Adicionar atraso de loop: Ao usar notebookutils.fs.append() em loops, adicione 0,5-1 segundo de pausa entre escritas para garantir a integridade dos dados.
  • Limitações de atalhos 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 suporta copiar ficheiros no OneLake entre regiões. Utilize cp() em substituição.
  • Versão em tempo de execução: O NotebookUtils foi concebido para funcionar com o Spark 3.4 (Runtime v1.2) e versões posteriores.
  • cp() comportamento em cadernos Python: Nos cadernos Python, cp() internamente usa o mesmo mecanismo baseado em azcopy que fastcp(), pelo que ambos os métodos comportam-se de forma idêntica.

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

Utilização Caminho relativo da raiz HDFS Caminho absoluto para o sistema de arquivos ABFS Caminho absoluto para o sistema de arquivos local no nó controlador
Lakehouse não padrão Não suportado notebookutils.fs.mkdirs("abfss://<container_name>@<storage_account_name>.dfs.core.windows.net/<new_dir>") notebookutils.fs.mkdirs("file:/<new_dir>")
Casa do Lago Padrão Diretório em 'Ficheiros' 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>")
  • No Lakehouse padrão, os caminhos dos ficheiros são montados no notebook com um tempo de espera de cache de ficheiros de 120 segundos. Isto significa que os ficheiros ficam armazenados em cache na pasta temporária local do caderno durante 120 segundos, mesmo que sejam removidos do Lakehouse. Se quiseres alterar a regra do timeout, podes desmontar os caminhos de ficheiros padrão do Lakehouse e montá-los novamente com um valor diferente fileCacheTimeout .

  • Para configurações Lakehouse não padrão, 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 no servidor Lakehouse.

Listar ficheiros

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 comporta-se de forma diferente quando se utiliza um caminho relativo, dependendo do tipo de caderno.

  • Num caderno do Spark: O caminho relativo refere-se 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")
    
  • Num caderno Python: O caminho relativo é relativo ao diretório de trabalho do sistema de ficheiros local, que por defeito é /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")
    

Ver propriedades do ficheiro

Use notebookutils.fs.ls() para inspecionar propriedades do ficheiro como nome do ficheiro, caminho do ficheiro, tamanho do ficheiro e se um item é um ficheiro 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)

Usa f-strings se quiseres 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 novo diretório

Cria um diretório caso não exista, incluindo quaisquer diretórios pais 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 ficheiro

Copie um ficheiro ou diretório entre sistemas de ficheiros. Definir recurse=True para copiar diretórios recursivamente.

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

Observação

Nota do caderno Python: Nos cadernos Python, cp() internamente utiliza o mesmo mecanismo baseado em azcopy que fastcp(), proporcionando desempenho eficiente para ambos os métodos. Devido às limitações do atalho OneLake, quando precisas notebookutils.fs.cp() de copiar dados de atalhos do tipo S3/GCS, recomenda-se usar um caminho montado em vez de um caminho abfss.

Sugestão

Verifique sempre o valor de retorno booleano para verificar se a operação teve sucesso. Use notebookutils.fs.exists() para verificar o caminho de origem antes de iniciar uma operação de cópia.

O exemplo seguinte mostra uma cópia entre armazenamentos do Lakehouse padrão para uma conta ADLS Gen2.

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

Cópia de ficheiro eficiente

Use fastcp para operações de cópia mais eficientes, especialmente com volumes de dados grandes. O recurse parâmetro é definido para True.

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

Sugestão

Use fastcp() em vez de cp() para grandes transferências de dados. O método fastcp utiliza azcopy nos bastidores, o que proporciona um throughput significativamente melhor para operações massivas de ficheiros. Em cadernos Python, ambos cp() e fastcp() usam o mesmo mecanismo subjacente.

Tenha estas considerações em mente:

  • notebookutils.fs.fastcp() não suporta copiar ficheiros no OneLake entre regiões. Neste caso, você pode usar notebookutils.fs.cp() em vez disso.
  • Devido às limitações do atalho OneLake, quando você precisar notebookutils.fs.fastcp() de copiar dados de atalhos do tipo S3/GCS, recomenda-se usar um caminho montado em vez de um caminho abfss.

Visualizar conteúdo do arquivo

Retorne até aos primeiros max_bytes bytes de um ficheiro como uma string UTF-8.

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

Sugestão

Para ficheiros 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 seguinte lê os primeiros 1.000 bytes de um ficheiro:

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

Observação

O valor padrão para max_bytes varia entre linguagens: os notebooks Python e Scala usam 102400 (100 KB), enquanto os notebooks R usam 65535 (64 KB). Em Scala, este parâmetro é chamado maxBytes.

Mover o ficheiro

Mover um ficheiro ou diretório entre sistemas de ficheiros.

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

Importante

O create_path parâmetro predefinido varia consoante o tempo de execução.

  • Spark notebooks (PySpark, Scala, R): por padrão False (false em Scala, FALSE em R). O diretório pai deve existir antes da operação de movimentação.
  • Cadernos Python: o padrão é True. O diretório principal é criado automaticamente se não existir.

Para garantir um comportamento consistente em tempos de execução, defina explicitamente o create_path parâmetro no seu código. Em Scala, este parâmetro é chamado createPath.

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

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

Gravar arquivo

Escreve uma string UTF-8 num ficheiro.

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 ficheiro

Adicione uma cadeia UTF-8 a um ficheiro.

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 a escrita simultânea no mesmo ficheiro devido à falta de garantias de atomicidade.

Ao usar a notebookutils.fs.append API num for ciclo para escrever no mesmo ficheiro, adicione uma sleep instrução de cerca de 0,5 a 1 segundo entre as escritas 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. Definir recurse=True para remover diretórios recursivamente.

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

Verifique se existe um ficheiro ou diretório

Verifique se existe um ficheiro ou diretório no caminho especificado. Devolve True se o caminho existir; caso contrário, devolve False.

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

Sugestão

Use exists() antes de realizar operações de ficheiro para evitar erros. Por exemplo, verifique se existe um ficheiro fonte 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

Obtém propriedades para um caminho como um mapa de pares nome-valor. Só é suportado para os caminhos do Azure Blob Storage.

Observação

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

Parâmetros:

Parâmetro Tipo Obrigatório Descrição
path Cordão Sim Caminho ABFS até ao ficheiro ou diretório.

Retornos: Um dicionário (mapa) contendo propriedades de metadados como tamanho do ficheiro, hora 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)