共用方式為


在 Azure Databricks 上處理檔案

Azure Databricks 有多個公用程式和 API,可與下列位置中的檔案互動:

  • Unity 目錄磁碟區
  • 工作區檔案
  • 雲端物件記憶體
  • DBFS 掛接和 DBFS 根目錄
  • 附加至叢集驅動程序節點的暫時記憶體

本文提供下列工具在這些位置中與檔案互動的範例:

  • Apache Spark
  • Spark SQL 和 Databricks SQL
  • Databricks 檔案系統公用程式 (dbutils.fs%fs
  • Databricks CLI
  • Databricks REST API
  • Bash Shell 指令 (%sh
  • 使用 %pip 安裝筆記本範圍函式庫
  • 熊貓
  • OSS Python 檔案管理和處理公用程式

重要

需要 FUSE 資料存取的檔案作業無法使用 URI 直接存取雲端物件記憶體。 Databricks 建議使用 Unity Catalog 磁碟區來設定 FUSE 存取這些位置的權限。

Scala 支援 FUSE,用於在配置有 Unity 目錄和共用存取模式的計算上,管理 Unity 目錄磁碟區和工作區檔案。 在設定了單一使用者存取模式並運行 Databricks Runtime 14.3 及更新版本的計算機上,Scala 支援 Unity Catalog 磁碟區和工作區檔案的 FUSE 功能,但不支援來自 Scala 的子進程,例如 Scala 的命令 "cat /Volumes/path/to/file".!!

Spark 和其他 JVM 程式只能使用支援 Unity 目錄的讀取器和寫入器來存取 Unity 目錄磁碟區或工作區檔案。 例如,您無法在Spark組態中將JAR檔案指定為相依性,而且無法使用 PySpark 自定義數據源。 如果您有來自需要存取磁碟區或工作區檔案的庫的 JVM 工作負載,可以使用 Python 或 Shell 命令(如 %sh mv.)將這些檔案複製到計算本機儲存空間。 請勿使用使用 JVM 的 %fsdbutils.fs。 如果需要在叢集啟動期間出現檔案,請使用 init 腳本先移動檔案。 請參閱 什麼是 init 腳本?

我需要提供 URI 配置來存取資料嗎?

Azure Databricks 中的數據存取路徑遵循下列其中一個標準:

  • URI 格式路徑 包含 URI 協議。 針對 Databricks 原生數據存取解決方案,在大部分使用案例中,URI 配置都是選擇性的。 直接存取雲端物件記憶體中的數據時,您必須為記憶體類型提供正確的 URI 配置。

    URI 路徑圖表

  • POSIX 樣式路徑 提供相對於驅動程式根目錄的數據存取權(/)。 POSIX 樣式的路徑永遠不需要方案。 您可以使用 Unity Catalog 卷或 DBFS 掛載來提供類 POSIX 存取以訪問雲端物件存儲中的資料。 許多 ML 架構和其他 OSS Python 模組都需要 FUSE,而且只能使用 POSIX 樣式的路徑。

    POSIX 路徑圖表

使用 Unity 目錄磁碟區中的檔案

Databricks 建議使用 Unity 目錄磁碟區來設定存取儲存在雲端物件記憶體中的非表格式數據檔。 請參閱 什麼是 Unity 目錄磁碟區?

工具
Apache Spark spark.read.format("json").load("/Volumes/my_catalog/my_schema/my_volume/data.json").show()
Spark SQL 和 Databricks SQL SELECT * FROM csv.`/Volumes/my_catalog/my_schema/my_volume/data.csv`;
LIST '/Volumes/my_catalog/my_schema/my_volume/';
Databricks 檔案系統公用程式 dbutils.fs.ls("/Volumes/my_catalog/my_schema/my_volume/")
%fs ls /Volumes/my_catalog/my_schema/my_volume/
Databricks CLI 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"}],},...]}
Bash 指令直譯器命令 %sh curl http://<address>/text.zip -o /Volumes/my_catalog/my_schema/my_volume/tmp/text.zip
程式庫安裝 %pip install /Volumes/my_catalog/my_schema/my_volume/my_library.whl
熊貓 df = pd.read_csv('/Volumes/my_catalog/my_schema/my_volume/data.csv')
開源軟體 Python os.listdir('/Volumes/my_catalog/my_schema/my_volume/path/to/directory')

注意

使用 Databricks CLI 時,需要 dbfs:/ 配置。

磁碟區限制

卷有下列限制:

  • 不支援直接附加或非循序(隨機)寫入,例如寫入 Zip 和 Excel 檔案。 針對直接附加或隨機寫入工作負載,請先在本機磁碟上執行作業,然後將結果複製到 Unity 目錄磁碟區。 例如:

    # 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')
    
  • 不支援稀疏檔案。 若要複製疏鬆檔案,請使用 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
    

使用工作區檔案

Databricks 工作區檔案 是工作區中的檔案。 您可以使用工作區檔案來儲存和存取檔案,例如筆記本、原始碼檔案、數據檔和其他工作區資產。 因為工作區檔案有大小限制,Databricks 建議只在這裡儲存小型數據檔,主要是用於開發和測試。

工具
Apache Spark spark.read.format("json").load("file:/Workspace/Users/<user-folder>/data.json").show()
Spark SQL 和 Databricks SQL SELECT * FROM json.`file:/Workspace/Users/<user-folder>/file.json`;
Databricks 檔案系統公用程式 dbutils.fs.ls("file:/Workspace/Users/<user-folder>/")
%fs ls file:/Workspace/Users/<user-folder>/
Databricks CLI databricks workspace list
Databricks REST API POST https://<databricks-instance>/api/2.0/workspace/delete
{"path": "/Workspace/Shared/code.py", "recursive": "false"}
Bash Shell 命令 %sh curl http://<address>/text.zip -o /Workspace/Users/<user-folder>/text.zip
函式庫安裝 %pip install /Workspace/Users/<user-folder>/my_library.whl
熊貓 df = pd.read_csv('/Workspace/Users/<user-folder>/data.csv')
OSS Python os.listdir('/Workspace/Users/<user-folder>/path/to/directory')

注意

使用 Databricks Utilities、Apache Spark 或 SQL 時,需要 file:/ 架構。

使用工作區檔案時的限制,請參閱 限制

刪除的工作區檔案會移至何處?

刪除工作區檔案會將它傳送至垃圾桶。 您可以使用 UI 從回收站復原或永久刪除檔案。

請參閱 刪除物件

在雲端物件存儲中處理檔案

Databricks 建議使用 Unity 目錄磁碟區來設定雲端物件記憶體中檔案的安全存取。 如果您選擇使用 URI 直接存取雲端物件記憶體中的數據,則必須設定許可權。 請參閱 管理外部位置、外部數據表和外部磁碟區

下列範例使用 URI 來存取雲端物件記憶體中的資料:

工具
Apache Spark spark.read.format("json").load("abfss://container-name@storage-account-name.dfs.core.windows.net/path/file.json").show()
Spark SQL 和 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';
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/
Databricks CLI 不支援
Databricks REST API 不支援
Bash Shell 指令 不支援
程式庫安裝 %pip install abfss://container-name@storage-account-name.dfs.core.windows.net/path/to/library.whl
熊貓 不支援
開源軟體 Python 不支援

注意

使用 DBFS 掛載和 DBFS 根目錄中的檔案

DBFS 掛載並不能使用 Unity Catalog 進行安全管理,Databricks 已不再建議使用。 儲存在 DBFS 根目錄中的數據可供工作區中的所有使用者存取。 Databricks 建議不要將任何敏感或生產程式代碼或數據儲存在 DBFS 根目錄中。 請參閱 什麼是 DBFS?

工具
Apache Spark spark.read.format("json").load("/mnt/path/to/data.json").show()
Spark SQL 和 Databricks SQL SELECT * FROM json.`/mnt/path/to/data.json`;
Databricks 檔案系統公用程式 dbutils.fs.ls("/mnt/path")
%fs ls /mnt/path
Databricks CLI 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" }'
Bash 指令介面命令 %sh curl http://<address>/text.zip > /dbfs/mnt/tmp/text.zip
程式庫安裝 %pip install /dbfs/mnt/path/to/my_library.whl
熊貓 df = pd.read_csv('/dbfs/mnt/path/to/data.csv')
開源軟體 Python os.listdir('/dbfs/mnt/path/to/directory')

注意

使用 Databricks CLI 時,需要 dbfs:/ 配置。

在附加至驅動程序節點的暫時記憶體中使用檔案

連結至驅動程式節點的暫時記憶體是具有內建 POSIX 型路徑存取的區塊記憶體。 當叢集終止或重新啟動時,儲存在此位置的任何數據都會消失。

工具
Apache Spark 不支援
Spark SQL 和 Databricks SQL 不支援
Databricks 檔案系統公用程式 dbutils.fs.ls("file:/path")
%fs ls file:/path
Databricks CLI 不支援
Databricks REST API 不支援
Bash Shell 命令 %sh curl http://<address>/text.zip > /tmp/text.zip
庫安裝 不支援
熊貓 df = pd.read_csv('/path/to/data.csv')
開源軟體 Python os.listdir('/path/to/directory')

注意

使用 Databricks Utilities 時,需要 file:/ 架構。

將數據從暫時記憶體移至磁碟區

您可能想要使用 Apache Spark 存取下載或儲存至暫時記憶體的數據。 因為暫時記憶體會連結至驅動程式,而Spark是分散式處理引擎,並非所有作業都可以直接存取此處的數據。 假設您必須將資料從驅動程式檔案系統移至 Unity 目錄磁碟區。 在此情況下,您可以使用 magic 命令來複製檔案,Databricks 公用程式,如下列範例所示:

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>

其他資源

如需上傳本機檔案或將因特網檔案下載至 Azure Databricks 的詳細資訊,請參閱 將檔案上傳至 Azure Databricks