4
respostas

Pasta 'tables'

A expressão

for item in dbutils.fs.ls('/FileStore'):

itera sobre todos os itens no diretório '/FileStore'. A pasta '/tables' é um desses itens. Com isso, não haverá um erro ao tentar mover a pasta 'tables', juntamente com todo o seu conteúdo, para uma pasta 'projetoBike' interna à pasta 'tables'?

4 respostas

Oii, Tiago! Tudo bem?

Boa pergunta, vou te auxiliar na explicação. Vamos lá! Ao iterar sobre todos os itens no diretório '/FileStore', a pasta '/tables' também será incluída. E ao tentar mover essa pasta '/tables' para dentro da pasta 'projetoBike', que é uma subpasta de '/tables', ocorrerá um erro, pois não é possível mover uma pasta para dentro dela mesma.

Então consideramos a alternativa B como certa, pois ela verifica se o item é um arquivo (tamanho diferente de zero) ou uma pasta (tamanho igual a zero). Dessa forma, ela move os arquivos diretamente para a pasta 'projetoBike', e para as pastas, ela as move de forma recursiva, evitando o erro de tentar mover uma pasta para dentro dela mesma.

Espero ter esclarecido sua dúvida. Continue se dedicando aos estudos e conte conosco caso tenha dúvidas.

Bons estudos, Tiago!

Ainda não está claro pra mim... Ao meu ver, na pasta FileStore, após o erro de cópia realizado, temos três itens

tables (pasta com tamanho 0) data-001 (pasta com tamanho 0) README.md (arquivo com tamanho <> 0)

esse bloco

else:     >>> (O item tem tamanho = 0)
        dbutils.fs.mv(
            f'/FileStore/{item.name}',   >>>> {item.name}='tables'
            f'/FileStore/tables/aula-databricks/projetoBike/{item.name}',
            recurse=True

não vai, efitivamente, tentar mover 'FileStore/tables' para 'FileStore/tables/aula-databricks/projetoBike/tables'?

Oii, Tiago! Tudo bem?

Agradeço por retornar! Sinto muito não ter sido clara e de não ter levado em consideração algumas particularidades do Databircks.

Com relação a sua segunda dúvida, sua preocupação faz sentido, mas o código já evita esse problema. Quando item.size == 0, o código entende que o item é uma pasta e a move para um destino que inclui o nome da própria pasta. Isso não cria uma subpasta dentro da pasta original, apenas anexa o nome ao final do caminho. Por exemplo, se item.name for "tables", o destino será/FileStore/tables/aula-databricks/projetoBike/tables.

O Databricks lida com pastas de maneira inteligente, preservando a estrutura interna ao mover. Assim, o código não tentará mover a pasta para dentro de si mesma, mas sim para o destino especificado, mantendo sua estrutura. A verificação de tamanho, item.size != 0, assegura que apenas arquivos sejam movidos diretamente, evitando duplicidade ao mover pastas vazias duas vezes. Portanto, o código está correto e não causará erros.

Espero que isso esclareça sua dúvida. E conte sempre conosco!

Esclarecido, muito obrigado.