FileStore

FileStore 是 DBFS 中的一个特殊文件夹,可在其中保存文件并使其可供 Web 浏览器访问。 可使用 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.0 开始,已弃用并已默认禁用在 DBFS 根目录中存储库文件的功能。 请参阅已弃用并已默认禁用在 DBFS 根目录中存储库的功能

相反,Databricks 建议将库上传到工作区文件或 Unity Catalog 卷,或使用库包存储库。 如果工作负荷不支持这些模式,还可以使用存储在云对象存储中的库。

将文件保存到 FileStore

可使用 dbutils.fs.put 将任意文本文件写入 DBFS 中的 /FileStore 目录:

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

可通过 Web 浏览器 (https://<databricks-instance>/files/<path-to-file>?o=######) 访问 /FileStore 中存储的文件。 例如,可在 https://<databricks-instance>/files/my-stuff/my-file.txt?o=###### 访问 /FileStore/my-stuff/my-file.txt 中存储的文件,其中 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 示例笔记本

获取笔记本