Condividi tramite


Lavorare con i file in Azure Databricks

Azure Databricks include diverse utilità e API per interagire con i file nei percorsi seguenti:

  • Volumi del catalogo Unity
  • File dell'area di lavoro
  • Archiviazione di oggetti cloud
  • Montaggi DBFS e radice DBFS
  • Archiviazione temporanea collegata al nodo driver del cluster

Questo articolo include esempi per interagire con i file in queste posizioni per gli strumenti seguenti:

  • Apache Spark
  • SPARK SQL e Databricks SQL
  • Utilità del file system di Databricks (dbutils.fs o %fs)
  • Interfaccia a riga di comando di Databricks
  • Databricks REST API
  • Comandi della shell Bash (%sh)
  • Le librerie con ambito notebook vengono installate usando %pip
  • Panda
  • Utilità per la gestione ed elaborazione di file Python nel contesto di software open source

Importante

Le operazioni di file che richiedono l'accesso ai dati FUSE non possono accedere direttamente all'archiviazione di oggetti cloud usando gli URI. Databricks consiglia di usare i volumi di Unity Catalog per configurare l'accesso a queste posizioni per FUSE.

Scala supporta FUSE per i volumi del Catalogo Unity e i file dell'area di lavoro su calcoli configurati con il Catalogo Unity e la modalità di accesso condiviso. Nel calcolo configurato con la modalità di accesso utente singolo e Databricks Runtime 14.3 e versioni successive, Scala supporta FUSE per i volumi del catalogo Unity e i file dell'area di lavoro, ad eccezione dei sottoprocessi provenienti da Scala, ad esempio il comando Scala "cat /Volumes/path/to/file".!!.

Spark e altri processi JVM possono accedere solo ai volumi del catalogo Unity o ai file dell'area di lavoro usando i lettori e i writer che supportano Unity Catalog. Ad esempio, non è possibile specificare un file JAR come dipendenza in una configurazione spark e non è possibile usare origini dati personalizzate PySpark. Se si dispone di un carico di lavoro JVM proveniente da librerie che devono accedere ai file nelle unità o nei file dell'area di lavoro, copiare i file nell'archiviazione locale di calcolo usando Python o comandi della shell, ad esempio %sh mv.. Non usare %fs o dbutils.fs che usa la JVM. Se un file deve essere presente durante l'avvio del cluster, usare uno script init per spostare prima il file. Consulta Che cosa sono gli script init?.

È necessario fornire uno schema URI per accedere ai dati?

I percorsi di accesso ai dati in Azure Databricks seguono uno degli standard seguenti:

  • percorsi in stile URI includono uno schema URI. Per le soluzioni di accesso ai dati native di Databricks, gli schemi URI sono facoltativi per la maggior parte dei casi d'uso. Quando si accede direttamente ai dati nell'archiviazione di oggetti cloud, è necessario specificare lo schema URI corretto per il tipo di archiviazione.

    diagramma dei percorsi URI

  • I percorsi in stile POSIX forniscono l'accesso ai dati in modo relativo alla radice del driver (/). I percorsi in stile POSIX non richiedono mai uno schema. È possibile usare volumi del catalogo Unity o montaggi DBFS per fornire l'accesso in stile POSIX ai dati nell'archiviazione di oggetti cloud. Molti framework ML e altri moduli Python OSS richiedono FUSE e possono usare solo percorsi in stile POSIX.

    diagramma dei percorsi POSIX

Lavorare con i file nei volumi di Unity Catalog

Databricks consiglia di usare i volumi di Unity Catalog per configurare l'accesso ai file di dati non tabulari archiviati nell'archiviazione di oggetti cloud. Consulta Che cosa sono i volumi di Unity Catalog?.

Strumento Esempio
Apache Spark spark.read.format("json").load("/Volumes/my_catalog/my_schema/my_volume/data.json").show()
SPARK SQL e Databricks SQL SELECT * FROM csv.`/Volumes/my_catalog/my_schema/my_volume/data.csv`;
LIST '/Volumes/my_catalog/my_schema/my_volume/';
Utilità del file system di Databricks dbutils.fs.ls("/Volumes/my_catalog/my_schema/my_volume/")
%fs ls /Volumes/my_catalog/my_schema/my_volume/
Interfaccia a riga di comando di Databricks databricks fs cp /path/to/local/file dbfs:/Volumes/my_catalog/my_schema/my_volume/
Databricks REST API POST https://<databricks-instance>/api/2.1/jobs/create
{"name": "A multitask job", "tasks": [{..."libraries": [{"jar": "/Volumes/dev/environment/libraries/logging/Logging.jar"}],},...]}
Comandi della shell Bash %sh curl http://<address>/text.zip -o /Volumes/my_catalog/my_schema/my_volume/tmp/text.zip
Installazioni della libreria %pip install /Volumes/my_catalog/my_schema/my_volume/my_library.whl
Panda df = pd.read_csv('/Volumes/my_catalog/my_schema/my_volume/data.csv')
OSS Python os.listdir('/Volumes/my_catalog/my_schema/my_volume/path/to/directory')

Nota

Lo schema dbfs:/ è necessario quando si usa l'interfaccia della riga di comando di Databricks.

Limitazioni dei volumi

I volumi presentano le limitazioni seguenti:

  • Le scritture direct-append o non sequenziali (casuali), ad esempio la scrittura di file ZIP ed Excel non sono supportate. Per i workload direct-append o random-write, eseguire prima le operazioni su un disco locale e quindi copiare i risultati nei volumi di Unity Catalog. Per esempio:

    # python
    import xlsxwriter
    from shutil import copyfile
    
    workbook = xlsxwriter.Workbook('/local_disk0/tmp/excel.xlsx')
    worksheet = workbook.add_worksheet()
    worksheet.write(0, 0, "Key")
    worksheet.write(0, 1, "Value")
    workbook.close()
    
    copyfile('/local_disk0/tmp/excel.xlsx', '/Volumes/my_catalog/my_schema/my_volume/excel.xlsx')
    
  • I file di tipo sparse non sono supportati. Per copiare file sparse, usare cp --sparse=never:

    $ cp sparse.file /Volumes/my_catalog/my_schema/my_volume/sparse.file
    error writing '/dbfs/sparse.file': Operation not supported
    $ cp --sparse=never sparse.file /Volumes/my_catalog/my_schema/my_volume/sparse.file
    

Usare i file dell'area di lavoro

I file di un'area di lavoro di Databricks sono i file presenti in un'area di lavoro. È possibile usare i file dell'area di lavoro per archiviare e accedere a file come notebook, file di codice sorgente, file di dati e altri asset dell'area di lavoro. Poiché i file dell'area di lavoro hanno restrizioni sulle dimensioni, Databricks consiglia di archiviare solo file di dati di piccole dimensioni principalmente per lo sviluppo e il test.

Strumento Esempio
Apache Spark spark.read.format("json").load("file:/Workspace/Users/<user-folder>/data.json").show()
SPARK SQL e Databricks SQL SELECT * FROM json.`file:/Workspace/Users/<user-folder>/file.json`;
Utilità del file system di Databricks dbutils.fs.ls("file:/Workspace/Users/<user-folder>/")
%fs ls file:/Workspace/Users/<user-folder>/
Interfaccia a riga di comando di Databricks databricks workspace list
Databricks REST API POST https://<databricks-instance>/api/2.0/workspace/delete
{"path": "/Workspace/Shared/code.py", "recursive": "false"}
Comandi della shell Bash %sh curl http://<address>/text.zip -o /Workspace/Users/<user-folder>/text.zip
Installazioni della libreria %pip install /Workspace/Users/<user-folder>/my_library.whl
Panda df = pd.read_csv('/Workspace/Users/<user-folder>/data.csv')
OSS Python os.listdir('/Workspace/Users/<user-folder>/path/to/directory')

Nota

Lo schema file:/ è necessario quando si lavora con le utilità di Databricks, Apache Spark o SQL.

Per le limitazioni relative all'uso dei file dell'area di lavoro, vedere Limitazioni.

Dove vanno i file dell'area di lavoro eliminati?

L'eliminazione di un file dell'area di lavoro lo invia al cestino. È possibile recuperare o eliminare definitivamente i file dal cestino usando l'interfaccia utente.

Vedi Eliminare un oggetto.

Lavorare con i file nell'archiviazione oggetti nel cloud

Databricks consiglia di usare i volumi di Unity Catalog per configurare l'accesso sicuro ai file nell'archiviazione di oggetti cloud. È necessario configurare le autorizzazioni se si sceglie di accedere direttamente ai dati nell'archiviazione oggetti cloud usando gli URI. Vedere Gestire percorsi esterni, tabelle esterne e volumi esterni.

Gli esempi seguenti usano gli URI per accedere ai dati nell'archiviazione di oggetti cloud:

Strumento Esempio
Apache Spark spark.read.format("json").load("abfss://container-name@storage-account-name.dfs.core.windows.net/path/file.json").show()
SPARK SQL e Databricks SQL SELECT * FROM csv.`abfss://container-name@storage-account-name.dfs.core.windows.net/path/file.json`; LIST 'abfss://container-name@storage-account-name.dfs.core.windows.net/path';
Utilità del file system di Databricks dbutils.fs.ls("abfss://container-name@storage-account-name.dfs.core.windows.net/path/") %fs ls abfss://container-name@storage-account-name.dfs.core.windows.net/path/
Interfaccia a riga di comando di Databricks Non supportato
Databricks REST API Non supportato
Comandi della shell Bash Non supportato
Installazioni della libreria %pip install abfss://container-name@storage-account-name.dfs.core.windows.net/path/to/library.whl
Panda Non supportato
OSS Python Non supportato

Nota

Uso dei file nei montaggi DBFS e nella radice di DBFS

I mount DBFS non sono sicurizzabili con Unity Catalog e non sono più consigliati da Databricks. I dati archiviati nella radice DBFS sono accessibili da tutti gli utenti nell'area di lavoro. Databricks sconsiglia di archiviare codice o dati sensibili o di produzione nella radice DBFS. Vedere Che cos'è DBFS?.

Strumento Esempio
Apache Spark spark.read.format("json").load("/mnt/path/to/data.json").show()
SPARK SQL e Databricks SQL SELECT * FROM json.`/mnt/path/to/data.json`;
Utilità del file system di Databricks dbutils.fs.ls("/mnt/path")
%fs ls /mnt/path
Interfaccia a riga di comando di Databricks databricks fs cp dbfs:/mnt/path/to/remote/file /path/to/local/file
Databricks REST API POST https://<host>/api/2.0/dbfs/delete --data '{ "path": "/tmp/HelloWorld.txt" }'
Comandi della shell Bash %sh curl http://<address>/text.zip > /dbfs/mnt/tmp/text.zip
Installazioni della libreria %pip install /dbfs/mnt/path/to/my_library.whl
Panda df = pd.read_csv('/dbfs/mnt/path/to/data.csv')
OSS Python os.listdir('/dbfs/mnt/path/to/directory')

Nota

Lo schema dbfs:/ è necessario quando si usa l'interfaccia della riga di comando di Databricks.

Usare i file nell'archiviazione temporanea collegata al nodo driver

L'archiviazione effimera collegata al nodo driver è un'archiviazione a blocchi con accesso al percorso basato su POSIX integrato. Tutti i dati archiviati in questa posizione scompaiono quando un cluster termina o riavvia.

Strumento Esempio
Apache Spark Non supportato
SPARK SQL e Databricks SQL Non supportato
Utilità del file system di Databricks dbutils.fs.ls("file:/path")
%fs ls file:/path
Interfaccia a riga di comando di Databricks Non supportato
Databricks REST API Non supportato
Comandi della shell Bash %sh curl http://<address>/text.zip > /tmp/text.zip
Installazioni della libreria Non supportato
Panda df = pd.read_csv('/path/to/data.csv')
OSS Python os.listdir('/path/to/directory')

Nota

Lo schema file:/ è necessario quando si utilizzano le utilità di Databricks.

Spostare i dati dall'archiviazione temporanea ai volumi

È possibile accedere ai dati scaricati o salvati in un archivio temporaneo usando Apache Spark. Poiché l'archiviazione temporanea è collegata al driver e Spark è un motore di elaborazione distribuito, non tutte le operazioni possono accedere direttamente ai dati qui. Si supponga di dover spostare i dati dal file system del driver ai volumi del catalogo Unity. In tal caso, è possibile copiare i file usando i comandi magic o le utilità Databricks, come negli esempi seguenti:

dbutils.fs.cp ("file:/<path>", "/Volumes/<catalog>/<schema>/<volume>/<path>")
%sh cp /<path> /Volumes/<catalog>/<schema>/<volume>/<path>
%fs cp file:/<path> /Volumes/<catalog>/<schema>/<volume>/<path>

Risorse aggiuntive

Per informazioni sul caricamento di file locali o sul download di file Internet in Azure Databricks, vedere Caricare file in Azure Databricks.