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.1 开始,在 DBFS 根目录中存储库文件的功能已被弃用且默认禁用。 请参阅已弃用并已默认禁用在 DBFS 根目录中存储库的功能。
相反,Databricks 建议将所有库(包括 Python 库、JAR 文件和 Spark 连接器)上传到工作区文件或 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 库。