分享方式:


FileStore

重要

此文件已淘汰,且可能未更新。 不再支援此內容所提及的產品、服務或技術。

FileStore 是 DBFS 內的特殊資料夾,您可以在其中儲存檔案,並讓網頁瀏覽器存取檔案。 您可以使用 FileStore:

  • 當您呼叫 displayHTML 時,儲存檔案,例如映像檔及程式庫可在 HTML 和 JavaScript 存取。
  • 儲存您要下載到本機桌面的輸出檔案。
  • 從本機桌面上傳 CSV 及其他資料檔案,以在 Databricks 進行處理。

當您使用特定功能時,Azure Databricks 會將檔案放在 FileStore 底下的下列資料夾:

  • /FileStore/jars - 包含上傳的舊版工作區程式庫。 如果您刪除此資料夾的檔案,則在工作區參考這些檔案的程式庫可能無法再運作。
  • /FileStore/tables - 包含您使用 UI 匯入的檔案。 如果您刪除此資料夾的檔案,您從這些檔案建立的資料表可能無法再存取。

重要

使用 Databricks Runtime 14.3 LTS 及更舊版本時,可從 DBFS 安裝程式庫。 不過,任何工作區使用者都可以修改儲存在 DBFS 的程式庫檔案。 若要提高 Azure Databricks 工作區程式庫的安全性,在 Databricks Runtime 15.1 和更新版本預設會取代及停用 DBFS 根目錄中的程式庫檔案。 請參閱在 DBFS 根目錄儲存程式庫已被取代,並預設為停用

相反地,Databricks 建議將所有程式庫,包括 Python 程式庫、JAR 檔案及 Spark 連接器上傳至工作區檔案或 Unity 目錄磁碟區,或使用程式庫套件存放庫。 如果您的工作負載不支援這些模式,您也可以使用儲存在雲端物件記憶體的程式庫。

將檔案儲存至 FileStore

您可以使用dbutils.fs.put將任意文字檔/FileStore寫入 DBFS 中的目錄:

dbutils.fs.put("/FileStore/my-stuff/my-file.txt", "This is the actual text that will be saved to disk. Like a 'Hello world!' example")

在下面,將 <databricks-instance> 替換為 Azure Databricks 部署的工作區 URL

儲存在 /FileStore 的檔案可透過您的網頁瀏覽器 https://<databricks-instance>/files/<path-to-file>?o=###### 存取。 例如,您儲存在 /FileStore/my-stuff/my-file.txt 的檔案可以透過 https://<databricks-instance>/files/my-stuff/my-file.txt?o=###### 存取,其中 o= 後面的數字與您的 URL 的數字相同。

注意

您也可以使用 DBFS 檔案上傳介面將檔案放入 /FileStore 目錄。 請參閱 在 DBFS 探索並建立資料表

在筆記本嵌入靜態映像檔

您可使用 files/ 位置將靜態映像檔嵌入筆記本:

displayHTML("<img src ='files/image.jpg'>")

或 Markdown 映像檔匯入語法:

%md
![my_test_image](files/image.jpg)

您可以使用 DBFS API請求 Python HTTP 程式庫來上傳靜態映像檔。 在以下範例中:

  • <databricks-instance> 替換為 Azure Databricks 部署的工作區 URL
  • <token> 替換為您的個人存取權杖的值。
  • <image-dir> 替換為FileStore 要上傳映像檔檔案的位置。

注意

作為安全性最佳做法,當您使用自動化工具、系統、指令碼和應用程式進行驗證時,Databricks 建議您使用屬於服務主體的個人存取權杖,而不是工作區使用者。 若要建立服務主體權杖,請參閱管理服務主體的權杖

import requests
import json
import os

TOKEN = '<token>'
headers = {'Authorization': 'Bearer %s' % TOKEN}
url = "https://<databricks-instance>/api/2.0"
dbfs_dir = "dbfs:/FileStore/<image-dir>/"

def perform_query(path, headers, data={}):
  session = requests.Session()
  resp = session.request('POST', url + path, data=json.dumps(data), verify=True, headers=headers)
  return resp.json()

def mkdirs(path, headers):
  _data = {}
  _data['path'] = path
  return perform_query('/dbfs/mkdirs', headers=headers, data=_data)

def create(path, overwrite, headers):
  _data = {}
  _data['path'] = path
  _data['overwrite'] = overwrite
  return perform_query('/dbfs/create', headers=headers, data=_data)

def add_block(handle, data, headers):
  _data = {}
  _data['handle'] = handle
  _data['data'] = data
  return perform_query('/dbfs/add-block', headers=headers, data=_data)

def close(handle, headers):
  _data = {}
  _data['handle'] = handle
  return perform_query('/dbfs/close', headers=headers, data=_data)

def put_file(src_path, dbfs_path, overwrite, headers):
  handle = create(dbfs_path, overwrite, headers=headers)['handle']
  print("Putting file: " + dbfs_path)
  with open(src_path, 'rb') as local_file:
    while True:
      contents = local_file.read(2**20)
      if len(contents) == 0:
        break
      add_block(handle, b64encode(contents).decode(), headers=headers)
    close(handle, headers=headers)

mkdirs(path=dbfs_dir, headers=headers)
files = [f for f in os.listdir('.') if os.path.isfile(f)]
for f in files:
  if ".png" in f:
    target_path = dbfs_dir + f
    resp = put_file(src_path=f, dbfs_path=target_path, overwrite=True, headers=headers)
    if resp == None:
      print("Success")
    else:
      print(resp)

調整靜態映像檔

若要縮放已儲存至 DBFS 的映像檔大小,請將映像檔複製到 /FileStore,然後使用 displayHTML 的映像檔參數調整大小:

dbutils.fs.cp('dbfs:/user/experimental/MyImage-1.png','dbfs:/FileStore/images/')
displayHTML('''<img src="files/images/MyImage-1.png" style="width:600px;height:600px;">''')

筆記本範例:使用 JavaScript 程式庫

此筆記本示範如何使用 FileStore 來包含 JavaScript 程式庫。

DBFS FileStore 範例筆記本

取得筆記本