1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DatabricksのFileStore

Last updated at Posted at 2022-02-12

FileStore | Databricks on AWS [2021/3/17時点]の翻訳です。

本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。

FileStoreはDatabricksファイルシステム(DBFS)の特殊なフォルダーであり、保存したファイルにお使いのWebブラウザーからアクセスすることができます。以下のような用途でFileStoreを活用することができます。

  • displayHTML関数を呼び出す際に、HTMLやJavaScriptからアクセスできる画像やライブラリを保存する。
  • ローカルマシンにダウンロードしたい出力ファイルを保存する。
  • Databricksで処理するために、CSVや他のデータファイルをローカルマシンからアップロードする。

特定の機能を使用する際、DatabricksはFileStore配下の以下のフォルダーにファイルを保存します。

  • /FileStore/jars - アップロードしたライブラリが格納されます。このフォルダーのファイルを削除すると、ワークスペースでこれらのファイルを参照するライブラリは動作しなくなります。
  • /FileStore/tables - UIを用いてインポートしたファイルが格納されます。このフォルダーのファイルを削除すると、これらのファイルから作成したテーブルにはアクセスできなくなります。
  • /FileStore/plots - ノートブックでggplotmatplotlibプロットのようなPython、Rプロットオブジェクトに対してdisplay()関数を呼び出した際に作成される画像が格納されます。このフォルダーのファイルを削除した場合、これらを参照するノートブックでこれらのプロットを再生成する必要があるかもしれません。詳細はMatplotlibggplot2を参照ください。
  • /FileStore/import-stage - ノートブックDatabricksアーカイブファイルをインポートする際に生成される一時ファイルが格納されます。これらの一時ファイルはノートブックのインポートが完了すると削除されます。

FileStoreにファイルを保存する

FileStoreにファイルを保存するには、DBFSの/FileStoreディレクトリに保存します。

Python
dbutils.fs.put("/FileStore/my-stuff/my-file.txt", "Contents of my file")

以下では、<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.txthttps://<databricks-instance>/files/my-stuff/my-file.txt?o=######で置き換えてください。o=の後の数字は、お使いのURLに含まれているものと同じものとなります。

注意
/FileStoreに直接ファイルを保存するために、DBFSのファイルアップロードインタフェースを使うこともできます。ファイルアップロードインタフェースを参照ください。

ノートブックに静的な画像を埋め込む

ノートブックに静的な画像を埋め込むために/filesの場所を使用することができます。

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

あるいは、マークダウンの画像インポートシンタックスを使用できます。

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

DBFSのDatabricks REST APIとPython HTTPライブラリのrequestsを用いて、静的な画像をアップロードすることができます。以下の例では、

  • <databricks-instance>はお使いのDatabricksデプロイメントのワークスペースURLで置き換えてください。
  • <token>はご自身のパーソナルアクセストークンを指定してください。
  • FileStore配下の<image-dir>には画像ファイルをアップロードしたい場所を指定してください。
Python
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の画像パラメーターを用いてリサイズします。

Python
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ライブラリを使う

このノートブックでは、JavaScriptライブラリを使用するためにどのようにFileStoreを使用するのかを説明します。

FileStoreデモノートブック

Databricks 無料トライアル

Databricks 無料トライアル

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?