FileStore
FileStoreはDBFS内の特別なフォルダです。このフォルダでファイルを保存してWebブラウザからアクセスすることができます。FileStoreは、以下のように使用できます。
displayHTML
を呼び出すときにHTMLおよびJavaScript内でアクセスできる画像やライブラリなどのファイルを保存するダウンロードする出力ファイルをローカル・デスクトップに保存する
CSVやその他のデータファイルをローカル・デスクトップからアップロードして Databricksで処理する
特定の機能を使用する際に、DatabricksはFileStore内の次のフォルダにファイルを配置します。
/FileStore/jars
- アップロードされたレガシー ワークスペース ライブラリが含まれます。 このフォルダー内のファイルを削除すると、ワークスペース内でこれらのファイルを参照するライブラリが機能しなくなる可能性があります。/FileStore/tables
- UI を使用してインポートするファイルが含まれます。 このフォルダー内のファイルを削除すると、これらのファイルから作成したテーブルにアクセスできなくなる可能性があります。
重要:
Databricks Runtime 14.3 LTS 以下を使用する場合、ライブラリは DBFS からインストールできます。 ただし、ワークスペース ユーザーは、DBFS に格納されているライブラリ ファイルを変更できます。 Databricks ワークスペース内のライブラリのセキュリティを向上させるため、DBFS ルートへのライブラリ ファイルの保存は非推奨となり、Databricks Runtime 15.0 以降ではデフォルトで無効になっています。 「DBFS ルートへのライブラリの保存は非推奨であり、デフォルトで無効になっている」を参照してください。
代わりに、 、 Databricksライブラリ、PythonJAR ファイル、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>
を Databricks デプロイの ワークスペース URL に置き換えます。
/FileStore
に保存されたファイルは、 https://<databricks-instance>/files/
のウェブブラウザからアクセスできます。例えば、 /FileStore/my-stuff/my-file.txt
に保存したファイルは https://<databricks-instance>/files/my-stuff/my-file.txt
からアクセスできます。
ただし、デプロイメントURLに?o=
が含まれる場合(例:https://<databricks-instance>/?o=6280049833385130
)は、https://<databricks-instance>/files/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>
を Databricks デプロイの ワークスペース URL に置き換えます。<token>
を 個人用アクセストークンの値に置き換えます。<image-dir>
を、画像ファイルをアップロードするFileStore
内の場所に置き換えます。
注:
自動化されたツール、システム、スクリプト、アプリを使用して認証する場合のセキュリティのベスト プラクティスとして、Databricks ではOAuth トークンを使用することをお勧めします。
個人用アクセストークン認証を使用する場合、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)