Databricks 上のファイルを操作する

Databricks には、次の場所にあるファイルを操作するための複数のユーティリティと APIs が用意されています。

  • Unity Catalogボリューム

  • ワークスペースファイル

  • クラウドオブジェクトストレージ

  • DBFS マウントと DBFS ルート

  • クラスターのドライバーノードに接続された一時ストレージ

この記事では、次のツールでこれらの場所にあるファイルを操作するための例を示します。

  • Apache Spark

  • Spark SQL と Databricks SQL

  • Databricks ファイル システム ユーティリティ ( dbutils.fsまたは%fs )

  • Databricks CLI

  • Databricks REST API

  • Bash シェル コマンド ( %sh )

  • ノートブック スコープのライブラリは次を使用してインストールされます %pip

  • Pandas

  • OSS Python ファイル管理および処理ユーティリティ

重要

データへのFUSEアクセスを必要とするファイル操作は、URIを使用してクラウドオブジェクトストレージに直接アクセスすることはできません。 Databricks では、 Unity Catalog ボリュームを使用して、FUSE のこれらの場所へのアクセスを構成することをお勧めします。

Scala では、シングル ユーザー アクセス モードで構成されたコンピュート上の Unity Catalog ボリュームまたはワークスペース ファイル、または Unity Catalog を使用しないクラスターの FUSE はサポートされていません。 Scala では、Unity Catalog と共有アクセス モードで構成されたコンピュート上の Unity Catalog ボリュームとワークスペース ファイルの FUSE がサポートされています。

データにアクセスするためにURIスキームを提供する必要がありますか?

Databricks のデータ アクセス パスは、次のいずれかの標準に従います。

  • URI スタイルのパスには、URI スキームが含まれます。Databricks ネイティブ データ アクセス ソリューションの場合、URI スキームはほとんどのユース ケースで省略可能です。 クラウド・オブジェクト・ストレージ内のデータに直接アクセスする場合は、ストレージ・タイプに対して正しいURIスキームを指定する必要があります。

    URI パスの図
  • POSIX スタイルのパスは 、ドライバー ルート (/) を基準としたデータ アクセスを提供します。 POSIX スタイルのパスは、スキームを必要としません。 Unity CatalogボリュームまたはDBFSマウントを使用して、クラウドオブジェクトストレージ内のデータへのPOSIXスタイルのアクセスを提供できます。多くの機械学習フレームワークやその他の OSS Python モジュールは FUSE を必要とし、POSIX スタイルのパスしか使用できません。

    POSIX パスの図

Unity Catalogボリューム内のファイルを操作する

Databricks では、Unity Catalog ボリュームを使用して、クラウド オブジェクト ストレージに格納されている表形式以外のデータ ファイルへのアクセスを構成することをお勧めします。 「ボリュームの作成と操作」を参照してください。

道具

Apache Spark

spark.read.format("json").load("/Volumes/my_catalog/my_schema/my_volume/data.json").show()

Spark SQL と Databricks SQL

SELECT * FROM csv.`/Volumes/my_catalog/my_schema/my_volume/data.csv`; LIST '/Volumes/my_catalog/my_schema/my_volume/';

Databricks ファイルシステムユーティリティ

dbutils.fs.ls("/Volumes/my_catalog/my_schema/my_volume/") %fs ls /Volumes/my_catalog/my_schema/my_volume/

Databricks CLI

databricks fs cp /path/to/local/file dbfs:/Volumes/my_catalog/my_schema/my_volume/

Databricks REST API

POST https://<databricks-instance>/api/2.1/jobs/create {"name": "A multitask job", "tasks": [{..."libraries": [{"jar": "/Volumes/dev/environment/libraries/logging/Logging.jar"}],},...]}

Bash シェルコマンド

%sh curl http://<address>/text.zip -o /Volumes/my_catalog/my_schema/my_volume/tmp/text.zip

ライブラリのインストール

%pip install /Volumes/my_catalog/my_schema/my_volume/my_library.whl

Pandas

df = pd.read_csv('/Volumes/my_catalog/my_schema/my_volume/data.csv')

OSS Python

os.listdir('/Volumes/my_catalog/my_schema/my_volume/path/to/directory')

dbfs:/ スキーマは、Databricks CLI を操作するときに必要です。

ボリュームの制限

ボリュームには、次の制限があります。

  • Zip ファイルや Excel ファイルの書き込みなど、直接追加または非順次 (ランダム) 書き込みはサポートされていません。 直接追加またはランダム書き込みワークロードの場合は、最初にローカル ディスク上で操作を実行し、次に結果をUnity Catalogボリュームにコピーします。 例えば:

    # python
    import xlsxwriter
    from shutil import copyfile
    
    workbook = xlsxwriter.Workbook('/local_disk0/tmp/excel.xlsx')
    worksheet = workbook.add_worksheet()
    worksheet.write(0, 0, "Key")
    worksheet.write(0, 1, "Value")
    workbook.close()
    
    copyfile('/local_disk0/tmp/excel.xlsx', '/Volumes/my_catalog/my_schema/my_volume/excel.xlsx')
    
  • スパース ファイルはサポートされていません。 スパース ファイルをコピーするには、 cp --sparse=neverを使用します。

    $ cp sparse.file /Volumes/my_catalog/my_schema/my_volume/sparse.file
    error writing '/dbfs/sparse.file': Operation not supported
    $ cp --sparse=never sparse.file /Volumes/my_catalog/my_schema/my_volume/sparse.file
    

ワークスペース ファイルの操作

Databricksワークスペース ファイルは、ノートブックではないワークスペース内のファイルのセットです。 ワークスペース ファイルを使用すると、ノートブックや他のワークスペース アセットと一緒に保存されたデータやその他のファイルを保存したり、アクセスしたりできます。 ワークスペース ファイルにはサイズ制限があるため、Databricks では、主に開発とテストのために小さなデータ ファイルのみをここに保存することをお勧めします。

道具

Apache Spark

spark.read.format("json").load("file:/Workspace/Users/<user-folder>/data.json").show()

Spark SQL と Databricks SQL

SELECT * FROM json.`file:/Workspace/Users/<user-folder>/file.json`;

Databricks ファイルシステムユーティリティ

dbutils.fs.ls("file:/Workspace/Users/<user-folder>/") %fs ls file:/Workspace/Users/<user-folder>/

Databricks CLI

databricks workspace list

Databricks REST API

POST https://<databricks-instance>/api/2.0/workspace/delete {"path": "/Workspace/Shared/code.py", "recursive": "false"}

Bash シェルコマンド

%sh curl http://<address>/text.zip -o /Workspace/Users/<user-folder>/text.zip

ライブラリのインストール

%pip install /Workspace/Users/<user-folder>/my_library.whl

Pandas

df = pd.read_csv('/Workspace/Users/<user-folder>/data.csv')

OSS Python

os.listdir('/Workspace/Users/<user-folder>/path/to/directory')

file:/スキーマは、Databricks ユーティリティ、Apache Spark、または SQL を操作するときに必要です。

ワークスペースファイルの制限事項

ワークスペース ファイルには次の制限があります。

  • ワークスペースのファイル サイズは 500MB に制限されています。 この制限を超えるファイルをダウンロードまたは作成しようとする操作は失敗します。

  • ワークフローがリモート Git リポジトリにあるソース コードを使用している場合、現在のディレクトリに書き込んだり、相対パスを使用して書き込んだりすることはできません。 他の場所オプションにデータを書き込みます。

  • ワークスペース ファイルに保存するときに git コマンドを使用することはできません。 .gitディレクトリの作成は、ワークスペースファイルでは許可されていません。

  • サーバレス コンピュートからのワークスペース ファイル操作のサポートは限定的です。

  • エグゼキューターはワークスペース ファイルに書き込むことができません。

  • シンボリックリンクはサポートされていません。

  • 共有アクセス モード では、クラスター上の ユーザー定義関数 (UDF) からワークスペース ファイルにアクセスできません。

削除されたワークスペースファイルはどこに行くのでしょうか?

ワークスペース ファイルを削除すると、そのファイルはごみ箱に送られます。 UI を使用して、ごみ箱からファイルを復元したり、完全に削除したりできます。

「オブジェクトの削除」を参照してください。

クラウドオブジェクトストレージ内のファイルの操作

Databricks では、Unity Catalog ボリュームを使用して、クラウド オブジェクト ストレージ内のファイルへのセキュリティで保護されたアクセスを構成することをお勧めします。 URI を使用してクラウド・オブジェクト・ストレージ内のデータに直接アクセスする場合は、権限を構成する必要があります。 「外部ロケーション、外部テーブル、および外部ボリュームの管理」を参照してください。

次の例では、URI を使用してクラウドオブジェクトストレージ内のデータにアクセスします。

道具

Apache Spark

spark.read.format("json").load("gs://<bucket>/path/file.json").show()

Spark SQL と Databricks SQL

SELECT * FROM csv.`gs://<bucket>/path/file.json`; LIST 'gs://<bucket>/path';

Databricks ファイルシステムユーティリティ

dbutils.fs.ls("gs://<bucket>/path/") %fs ls gs://<bucket>/path/

Databricks CLI

サポートされていない

Databricks REST API

サポートされていない

Bash シェルコマンド

サポートされていない

ライブラリのインストール

%pip install gs://bucket-name/path/to/library.whl

Pandas

サポートされていない

OSS Python

サポートされていない

クラウド オブジェクト ストレージは認証情報のパススルーをサポートしていません。

DBFS マウントおよび DBFSルート内のファイルを操作する

DBFS マウントは、 Unity Catalog を使用してセキュリティ保護可能ではなく、Databricks では推奨されなくなりました。 DBFSルートに格納されているデータには、ワークスペース内のすべてのユーザーがアクセスできます。 Databricks では、機密性の高いコードや本番運用コードやデータを DBFSルートに格納しないことをお勧めします。 「 Databricks ファイル システム (DBFS) とは」を参照してください。

道具

Apache Spark

spark.read.format("json").load("/mnt/path/to/data.json").show()

Spark SQL と Databricks SQL

SELECT * FROM json.`/mnt/path/to/data.json`;

Databricks ファイルシステムユーティリティ

dbutils.fs.ls("/mnt/path") %fs ls /mnt/path

Databricks CLI

databricks fs cp dbfs:/mnt/path/to/remote/file /path/to/local/file

Databricks REST API

POST https://<host>/api/2.0/dbfs/delete --data '{ "path": "/tmp/HelloWorld.txt" }'

Bash シェルコマンド

%sh curl http://<address>/text.zip > /dbfs/mnt/tmp/text.zip

ライブラリのインストール

%pip install /dbfs/mnt/path/to/my_library.whl

Pandas

df = pd.read_csv('/dbfs/mnt/path/to/data.csv')

OSS Python

os.listdir('/dbfs/mnt/path/to/directory')

dbfs:/ スキーマは、Databricks CLI を操作するときに必要です。

ドライバーノードに接続されたエフェメラルストレージ内のファイルを操作する

ドライバー・ノードにアタッチされたエファーマル・ストレージは、ネイティブの POSIX ベースのパス・アクセスを持つブロック・ストレージです。 この場所に保存されているデータは、クラスターが終了または再起動すると失われます。

道具

Apache Spark

サポートされていない

Spark SQL と Databricks SQL

サポートされていない

Databricks ファイルシステムユーティリティ

dbutils.fs.ls("file:/path") %fs ls file:/path

Databricks CLI

サポートされていない

Databricks REST API

サポートされていない

Bash シェルコマンド

%sh curl http://<address>/text.zip > /tmp/text.zip

ライブラリのインストール

サポートされていない

Pandas

df = pd.read_csv('/path/to/data.csv')

OSS Python

os.listdir('/path/to/directory')

file:/ スキーマは、Databricks ユーティリティを使用する場合に必要です。

エフェメラルストレージからボリュームへのデータの移動

Apache Spark を使用して、一時ストレージにダウンロードまたは保存されたデータにアクセスしたい場合があります。 一時ストレージはドライバーに接続されており、Spark は分散処理エンジンであるため、すべての操作がここでデータに直接アクセスできるわけではありません。 ドライバー ファイルシステムからUnity Catalogボリュームにデータを移動する必要がある場合は、次の例のように、 マジック コマンドまたはDatabricks ユーティリティを使用してファイルをコピーできます。

dbutils.fs.cp ("file:/<path>", "/Volumes/<catalog>/<schema>/<volume>/<path>")
%sh cp /<path> /Volumes/<catalog>/<schema>/<volume>/<path>
%fs cp file:/<path> /Volumes/<catalog>/<schema>/<volume>/<path>