LoginSignup
21
18

Databricks弥生です。今年もよろしくお願いします。Databricksに入社してからはや3年が経ち、これまでに入門書的な記事をいくつか書いてきています。

クイックスタートガイドについては本も出しました。

しかし、これらの内容が古くなってきているのもありますし、今更ながら「はじめてのDatabricks」の記事を書いていないことに気づきましたので書きます。

対象読者

  • Databricksの環境(ワークスペース)が構築されている。ワークスペースがない場合には無料トライアルに申し込んでください。
  • Databricksワークスペースのユーザーが払い出されている。
  • これからDatabricksを使い始めるが、どこから手をつけたらいいのか悩んでいる。

お悩み事

これまでに以下のようなお悩み事を伺っているので、可能な限り解消していきたいと思います。

  • Databricksとは何かがわからない、何ができるのかわからない
  • Juypter NotebookやGoogle Colaboratoryと何が違うのかがわからない
  • Databricksをどう使えばいいのかがわからない
    • 画面が英語でとっつきにくい
    • Databricksのメニュー項目が多すぎてどれがどれかがわからない
    • 不用意にデータやファイルを上書きしてしまわないかが怖い

Databricksとは

以下にまとめていますが、すごくざっくり言えばデータやAIの活用というユースケースで必要となるさまざまな便利機能を搭載しているノートブック開発環境です。ざっくりしすぎかもしれませんが、データサイエンティストやデータエンジニアの方が最初に触れるインタフェースはJupyter NotebookやGoogle Colaboratoryと同様のノートブックです。

Juypter NotebookやGoogle Colaboratoryとの違い

Jupyter Notebookとの違い

こちらにまとめています。

Databricksではビルトインのビジュアライゼーションの機能があるなど、細かいところを挙げると色々ありますが、大きな違いはラップトップで稼働させるのかクラウドで稼働させるのかだと思います。稼働する場所で何が違うのかというと:

Jupyter Notebook Databricks
計算リソース Juypter Notebookが稼働しているラップトップ、サーバーのリソースに制限を受けます。多くの場合、pandasの利用が前提となるのでメモリーの制約を受けます。 クラウドプロバイダー(AWS/Azure/GCP)が提供するリソースを理論上無制限に活用できます。pandasに加えてSparkも活用できるので、並列処理による恩恵を享受することができます。
コラボレーション ラップトップで動作しているJupyter Notebookでの他のユーザーとのコラボレーションは限定的であり、JupyterHubを用いたとしてもその機能は限定的です。 複数ユーザーによるコラボレーションを前提としており、ノートブックやデータに対するアクセス制御やノートブックの同時参照、同時編集をサポートしています。
ガバナンス ラップトップで動作しているJupyter Notebookでは、個人のデータサイエンティストによる管理しか行えず、企業全体でのデータやコード、機械学習モデルの管理を統一することができません。 MLOpsを前提としており、データ、コード、機械学習モデルは全てUnity Catalogによって管理されます。
本格運用(Production) ラップトップ上で実験的にPythonを実行するには適してますが、本格運用するためにジョブを組むには別のシステムが必要となります。 Databricksにはワークフローの機能が搭載されているので、実験・テストを経たロジックを簡単に本格運用に移行することができます。また、さまざまなAPIを公開しているので、他のシステムとの連携も容易です。

Google Colaboratoryとの違い

Google Colaboratoryもクラウドで稼働するのでJuypter Notebookのリソースやコラボレーションの課題はある程度解消されますが、以下で詳細に比較が行われています。

Google Colaboratory Databricks
ホスティング Googleがホスティングしているので、データをGoogleに渡すことになります。 自分のクラウドアカウントにホスティングするので、データをDatabricksに渡す必要はありません。(サーバレスを利用する際にはこの限りではありません)
データソース Google Drive Unity Catalogやご自身のクラウドアカウントのクラウドストレージ

ガバナンスや本格運用などその他の違いに関してはJupyter Notebookと同様です。Google ColaboratoryではGPUを利用することができますが、あくまでGoogleが使用を許可しているスペックのみです。Databricksの場合はお客様が契約しているクラウドアカウントにおけるクォータの範囲内であれば、自由に計算資源を構成・利用することができます。

Databricksの使い方

私は全体像を大まかに理解してから、必要に応じて詳細に踏み込むアプローチが好きです。最初から全てを理解しようとしていたら、いつまで経っても一歩を踏み出せません。

ということで、使い方のイメージをざっくり書いてみました。
Screenshot 2024-01-07 at 18.41.51.png

ユーザーはデータサイエンティストやデータエンジニアです。それ以外の登場人物はこちらです。

  • ノートブック: そのままです。Pythonなどでロジックを記述します。
  • 計算資源: Jupyter Notebookを利用している際にはあまり意識しないかもしれませんが、ラップトップであればラップトップのCPUやメモリーを使ってプログラムが実行されます。
  • データベース・ファイルシステム: データを読み込んだり永続化するにはデータベースやファイルシステムが必要となります。 Jupyter NotebookであればローカルのファイルシステムやODBC/JDBC経由で接続したデータベースになるでしょう。

なので、Databricksを使うにしても、使い方にはJupyter Notebookと大きな違いはないと言えます(LLMなど複雑なことをやり始めるとこの限りではありませんが)。

とは言え、これではあまりにも抽象的なので、以下のステップを経てDatabricksでどういうことができるのかをウォークスルーしていきます。

  1. Databricksワークスペースへのアクセス
  2. ノートブックの作成
  3. 計算資源の準備
  4. データの読み込み
  5. データの加工
  6. データの保存

Databricksワークスペースへのアクセス

Databricksの環境はお客様ごとに構築するので、ワークスペースと呼ばれる作業環境のURLもお客様固有のものとなります。環境構築をされた方にURLを確認してください。

初回アクセスの際、画面がすべて英語で面食らうかもしれません。ブラウザの言語設定が日本語になっていれば、右上に言語設定のダイアログが表示されます。日本語を使うをクリックしてください。
Screenshot 2024-01-07 at 20.16.36.png

GUIが日本語に切り替わります。
Screenshot 2024-01-07 at 20.16.50.png

ダイアログが表示されない場合には、以下の手順に従ってください。

  1. 画面右上のメールアドレスをクリックして、User Settingsをクリック。
    Screenshot 2024-01-07 at 20.25.49.png
  2. Userの下にあるPreferenceをクリック。
    Screenshot 2024-01-07 at 20.26.40.png
  3. Languageから日本語を選択。
    Screenshot 2024-01-07 at 20.27.31.png

以下のような画面が表示されるはずです。
Screenshot 2024-01-07 at 20.28.03.png

まずは、画面構成に慣れましょう。これもざっくり。
Screenshot 2024-01-07 at 20.32.10.png

まず慣れる必要があるのは、画面左にあるサイドメニューです。Databricksの主要機能にアクセスする際に使用することになります。サイドメニュー上にカーソルを移動するとメニューが展開されます。
Screenshot 2024-01-07 at 20.34.43.png

ここでも最初から全てを理解するのではなく、以下の項目にフォーカスします。他の機能は必要になったら勉強すればいいのです。

  • 新規: Databricksにおけるさまざまなアセット(資産)を作成するときに使います。ノートブックやクラスターなど色々なアセットを作成できます。
  • ワークスペース: アセットはフォルダで整理することができます。このフォルダ階層にアクセスするために使うメニュー項目がワークスペースです。
  • カタログ: Databricksにビルトインされているデータベースのようなものです。テーブルだけでなくファイルや機械学習モデルなども格納することができます。
  • クラスター: Databricksにおける計算資源です。ノートブックの編集では計算資源は不要ですが、プログラムを実行する際にはクラスターは必須となります。

ノートブックの作成

Screenshot 2024-01-07 at 21.44.05.png

Databricksでもプログラムを実行するにはノートブックを作成する必要があります(IDE連携をするなどすればPythonファイルを実行することもできます)。ノートブックを作成する前に、Databricksワークスペースのフォルダ階層を理解しましょう。

上述したようにDatabricksの環境は複数ユーザーによるコラボレーションを前提としています。このため、以下のフォルダがデフォルトで作成されます。

  • ホームフォルダ: 各ユーザーごとのホームフォルダ。自分のアセットはデフォルトでホームフォルダ配下に作成されます。アクセス権を付与しない限り、他のユーザーがあなたのアセットにアクセスすることはできません。しかし、管理ユーザーはこの限りではありません。
    Screenshot 2024-01-07 at 20.43.39.png
  • Workspace: ワークスペースに登録されたユーザーそれぞれのホームフォルダを格納します。
    Screenshot 2024-01-07 at 20.44.05.png
  • Shared: すべてのユーザーが読み書きできるフォルダです。ノートブックの共有などの目的で使用します。
  • お気に入り: ノートブックやフォルダをお気に入りに登録するとこちらに表示されます。ショートカットできます。
  • ゴミ箱: 削除されたノートブックなどは一定期間こちらに格納されます。元に戻すこともできます。

自分のアセットはホームフォルダ配下、削除されたアセットはゴミ箱をまず覚えておくと良いかと思います。

ホームフォルダ直下にノートブックを作成しても構いませんが、整理できるように私は作業内容ごとにフォルダを作成しています。ワークスペースを表示している状態で右上の追加をクリックします。
Screenshot 2024-01-07 at 20.51.11.png

フォルダを選択します。
Screenshot 2024-01-07 at 20.52.59.png

フォルダ名を記入します。
Screenshot 2024-01-07 at 20.54.07.png
Screenshot 2024-01-07 at 20.54.27.png

ノートブックを作成する手段はいくつかありますが、上と同じように追加 > ノートブックを選択します。
Screenshot 2024-01-07 at 20.55.25.png

これでノートブックを作成できました。
Screenshot 2024-01-07 at 21.00.22.png

ここで、ノートブックの画面にも慣れておきましょう。ノートブックのインタフェース自体はJupyterやColaboratoryと大きな違いはないと思います。
Screenshot 2024-01-07 at 21.05.47.png

ノートブック名はクリックで編集できます。
Screenshot 2024-01-07 at 21.17.53.png

今回、便利メニューの説明は割愛します。目次の表示、ワークスペースフォルダへのアクセスUnity CatalogメタストアへのアクセスAIアシスタント、ノートブックコメント、機械学習モデルのトラッキング、バージョン履歴、変数エクスプローラライブラリエクスプローラなどを利用できます。

今回重要になるのはノートブック本体とクラスターセレクターです。ノートブックにプログラムを記述するのは当たり前ですが、Databricksの計算資源であるクラスターが必要となります。

計算資源の準備

Screenshot 2024-01-07 at 21.44.43.png

Databricksクラスターはクラウドプロバイダーの提供する仮想マシン(EC2/VMなど)をカプセル化して、さまざまな要件の処理に柔軟に対応できる機能を提供します。以下のような機能を提供します。

  • プレインストールされるソフトウェア(Python/Sparkの実行環境、scikit-learn/tensorflowなど)
  • ライブラリの追加インストール
  • オートスケーリング(クラスターの実態は複数台の仮想マシンです。クラスターの由来はここにあります。処理の負荷などに応じて自動でマシン数を増減させます)
  • 自動停止(クラウドで一番お金がかかるのは計算資源です。使われていない計算資源はコスト的に一番の無駄です)

ということで、クラスターを作成しましょう。サイドメニューのクラスターをクリックします。
Screenshot 2024-01-07 at 21.18.39.png

すでに作成済みのクラスターがあれば一覧に表示されます。なお、上の画像ではすべてのクラスターの状態は停止状態です。この状態ではお金は全くかかっていません。Databricksもクラウドプロバイダーも計算資源の費用は稼働している状態にのみ発生します。Databricksにおける計算資源、クラスターの考え方としては揮発性(ephemerarl) というものがあります。これは、処理が必要なときだけ計算資源をかき集めてクラスターを構成して、処理が終わったら解放するという使い方に立脚しています。ラップトップやオンプレミスのサーバーは所有している計算資源=活用できる計算資源となりますが、クラウドリソースを活用する際にはその制限を気にする必要はありません。処理対象のデータ構造、データ量、処理内容に応じて計算資源を充当できるのがクラウドを活用することの大きなメリットと言えます(コストも考慮する必要はありますが)。ここで作成するクラスターというのは計算資源のメタデータであって、そのメタデータに従って計算資源が構成されるという考え方になります。言い方はあれですが「使い捨て」の計算資源となります。

右上のコンピューティングを作成でクラスターを作成できるのですが、クイックに最小規模のクラスターを作成するにはその左にあるPersonal Computeで作成をクリックします。パーソナルコンピュートとはクイックにクラスターを作成できるテンプレートのようなものです。Databricksクラスターは詳細な設定を含めると、台数だけではなくインスタンスタイプ、initスクリプト、ソフトウェアバージョンなどなど多様な設定が可能です。それらを毎回選択するのは手間なので、クイックに作業に取り掛かれるようにするためのパーソナルコンピュートが用意されています。なお、以下のスペックとなります。

これをクリックするとデフォルト設定が行われた状態でクラスター作成画面が表示されます。コンピューティングを作成をクリックすることでクラスターが作成されます。
Screenshot 2024-01-07 at 21.28.34.png

仮想マシンの取得、ソフトウェアのインストールが行われるので5分ほどお待ちください。クラスター名の右にインジケータが表示されます。
Screenshot 2024-01-07 at 21.31.25.png

起動すると以下のような画面になります。
Screenshot 2024-01-07 at 21.33.49.png

しかし、これで終わりではありません。このクラスターは起動しているだけであり、上で作成したノートブックの処理をこのクラスターで実行するという指示を行う必要があります。そのためにはノートブックの画面に戻る必要があります。サイドメニューのワークスペースにアクセスして、作成したフォルダ、ノートブックにアクセスします。
Screenshot 2024-01-07 at 21.36.04.png

そして、右上のクラスターセレクターをクリックします。
Screenshot 2024-01-07 at 21.36.53.png
起動しているクラスターが一覧に表示されるはずです。クラスターを選択します。
Screenshot 2024-01-07 at 21.37.22.png

これでプログラムを実行できるようになりました。
Screenshot 2024-01-07 at 21.37.30.png

お約束のプログラムを実行しましょう。セルに以下を記述します。

Python
print("Hello Databricks!")

Screenshot 2024-01-07 at 21.39.14.png

セルの右上にある▶️をクリックし、セルを実行をクリックします。
Screenshot 2024-01-07 at 21.39.35.png

動きました!
Screenshot 2024-01-07 at 21.40.29.png

注意
エラーが出る場合には、ノートブック名の右にある言語がPythonであるかどうかを確認してください。
Screenshot 2024-01-07 at 21.41.21.png

データの読み込み

Screenshot 2024-01-07 at 21.45.48.png

これでDatabricksでプログラムを実行できるようになりました。早速データを処理していきましょう。ノートブックにセルを追加するには、ノートブックの上か下の端にカーソルを移動します。+ ボタンが表示されるのでこれをクリックします。
Screenshot 2024-01-07 at 21.42.14.png
Screenshot 2024-01-07 at 21.46.10.png

Databricksにおいてデータやファイル、機械学習モデルを管理するためのソリューションはUnity Catalogです。名前の通り、カタログソリューションであり上述のアセットのアクセス管理、監査ログ、依存関係などをまるっと面倒見てくれます。色々な機能を提供しますが、ここではデータの読み書きにフォーカスします。

Unity Catalogにはすぐに利用できるサンプルデータが格納されているので、ここではそれを使います。Unity Catalogで管理されているデータをクイックに確認するにはカタログエクスプローラが便利です。サイドメニューのカタログをクリックします。スキーマやデータを簡単に確認できます。
Screenshot 2024-01-08 at 8.51.57.png
Screenshot 2024-01-08 at 8.52.08.png

ノートブックに戻ります。ここでのノートブックはPythonなので、Pythonで処理するのが素直だと思うのですが、データベースの処理をするならSQLの方がわかりやすいので、PythonノートブックでSQLを使います。これもDatabricksの提供する柔軟性の一つです。セルの先頭にマジックコマンド%sqlを追加することでそのセルの言語をSQLに切り替えることができます。他の言語(R、SQL、Python)も同様です。

SQL
%sql
select * from samples.tpch.orders limit 1000;

Screenshot 2024-01-07 at 21.59.37.png

テーブル名をsamples.tpch.ordersと指定していることに注意してください。Unity Catalogで管理されるテーブルは3階層の名前空間で管理されます。<カタログ>.<スキーマ(データベース)>.<テーブル>で個々のテーブルを特定します。テーブルだろうがファイルだろうが、データを読み書きする際には、どのデータを対象に処理をしているのかを意識することが重要です。テーブルなら上記の名前空間、ファイルならパスとなります。よくある間違いの一つは意図しないテーブルやパスのファイルを読み込んだり、書き込んだりしていただと思います。

読み込み処理はこれで終わりではありません。上のスクリーンショットにはテーブルの右に + が表示されてます。これをクリックします。可視化を選択します。
Screenshot 2024-01-07 at 22.00.43.png

こちらの手順に従ってビジュアライゼーションの設定を行います。
Screenshot 2024-01-07 at 22.07.28.png

これでノートブックにグラフを追加することができました。Jupyterなどであればmatplotlibやseabornで可視化のロジックを記述しないとグラフにすることができませんが、Databricksならこの辺りはお手軽にできます。もちろん、matplotlibやseabornも使えます。
Screenshot 2024-01-07 at 22.07.12.png

データの加工

こちらでも書いていますが、どのような変換を行いたいのかに応じて処理を実装することになります。

ここではすでに別の方(データエンジニアなど)によってデータが準備されていることを前提にします。自分でデータを準備する場合にはこちらをご一読ください。

例えば、対象データの特定の列と特定の行に限定したいというフィルタリング処理を行ってみます。行の絞り込みではo_orderdateo_totalpriceにフィルタリング条件を適用しています。

SQL
%sql
SELECT
  o_orderkey,
  o_custkey,
  o_orderstatus,
  o_totalprice,
  o_orderdate,
  o_orderpriority
FROM
  samples.tpch.orders
WHERE
  o_orderdate = "1998-07-01"
  AND o_totalprice >= 100000

Screenshot 2024-01-08 at 8.43.28.png

このように、どのような形状のデータが必要なのかという要件に応じてデータを加工することになります。

データの書き込み

上述したように、どこに書き込みを行うのかを意識することが重要です。特に書き込みの際には対象データを上書きしてしまう可能性があるので注意してください。当たり前の話ですが、どんなに仕組みが洗練されたとしても既存データに対して書き込み権限があるのであれば、データの上書きは可能です。

注意
管理者の方向けの話となりますが、誤った操作でデータを上書きしてしまうというのは日常的に起こる事故といえます。このような事故を避けるためにも環境の分離(開発用/本番用)や適切なアクセス権の設定を行うことをご検討ください。なお、Databricksにおけるデフォルトのテーブル形式であるDelta Lakeではテーブルの更新ログが自動で記録されますので、テーブル状態のロールバックは可能です。

テーブルへの書き込み

加工したデータを自分用のカタログ、スキーマ(データベース)配下のテーブルとして保存するのがよくある使い方でしょう。ここでは、自分用のカタログtakaakiyayoi_catalog、スキーマtpchが作成されており、権限が付与されているものとします。カタログの作成権限があるかどうか、自分が使えるカタログがあるのかについては管理者の方に確認してください。
Screenshot 2024-01-08 at 8.55.32.png

ここがテーブルの書き込み先となります。一旦SQLでやり切るのでいわゆるCTAS(Create Table As Select)構文を使います。作成するテーブル名は上述のカタログとスキーマを使うのでtakaakiyayoi_catalog.tpch.orders_199807とします。

SQL
%sql
CREATE TABLE takaakiyayoi_catalog.tpch.orders_199807 AS
SELECT
  o_orderkey,
  o_custkey,
  o_orderstatus,
  o_totalprice,
  o_orderdate,
  o_orderpriority
FROM
  samples.tpch.orders
WHERE
  o_orderdate = "1998-07-01"
  AND o_totalprice >= 100000

エラーが出なければ問題なくテーブルを書き込めています。
Screenshot 2024-01-08 at 8.58.04.png

カタログエクスプローラにアクセスすると、作成されたテーブルを確認できます。
Screenshot 2024-01-08 at 8.58.38.png
Screenshot 2024-01-08 at 8.59.19.png

これでデータを永続化することができました。もう一つ重要な観点が権限です。デフォルトではテーブルの作成者(あなた)のみがこのテーブルにアクセスできます。このデータを他のユーザーと共有したい場合には、権限を付与することで他のユーザーの方も活用できるようになります。このような機能もデータによるコラボレーションを促進するためのものです。
Screenshot 2024-01-08 at 8.59.47.png
Screenshot 2024-01-08 at 9.00.48.png

ずっとSQLで処理を記述してきましたが、Pythonでも同様のことは可能です。ここまでSparkの話はしてきていませんでしたが、Databricksの処理の肝になっているのがApache Sparkです。大量データの処理を効率的に行うための分散処理フレームワークです。ここでは詳細に踏み込みませんが、これもざっくりいうとペタバイトであろうがエクサバイトのデータであろうが、マシン台数を増やして並列に高速に処理できる仕組みです。この処理には、上で行ったようなデータの加工や機械学習モデルのトレーニングなどさまざまなものが含まれます。そして、Sparkの長所の一つにさまざまな言語のサポートがあります。上でSQLを実行していましたが、これはSparkによって処理されています。それ以外にもPython、R、Scalaもサポートしています。Pythonを使う際にはSparkに対するPython APIであるPySparkを使います。

プログラムとしてロジックを記述するのであれば、SQLよりもPythonがおすすめとなります。ループや条件分岐をSQLで記述するのは相当難易度高いです。

ただ、「PySparkは敷居が高い」という声も伺います。しかし、pandasやRを使いこなしている方であれば、PySparkは方言の一つと言えるのではないかと個人的には思いますし、パフォーマンス最適化などの話が出てくると細かい設定が必要となりますので、早い段階でPySparkに慣れていただくのが良いかと思います。「PySparkをマスターするぜ」という気概のある方はこのあたりからいかがでしょうか。

あと、SparkでPandas APIを実行する手段もあります。

なお、上のSQLのロジックをPySparkで実装すると以下のようになります。

Python
sdf = spark.table("samples.tpch.orders")
(
    sdf.select(
        [
            "o_orderkey",
            "o_custkey",
            "o_orderstatus",
            "o_totalprice",
            "o_orderdate",
            "o_orderpriority",
        ]
    )
    .filter("o_orderdate = '1998-07-01' AND o_totalprice >= 100000")
    .write.saveAsTable("takaakiyayoi_catalog.tpch.orders_199807")
)

このように、データフレームを保存するのであればテーブルとして保存するのがおすすめです。カタログエクスプローラで容易にメタデータを確認できますし、他のユーザーへの共有も楽です。

ボリュームへの書き込み

ファイルとして保存したい場合には、ボリュームを活用ください。Unity Catalogで管理されるファイルシステムのマウントポイントです。ボリュームでもUnity Catalogの名前空間の考え方は踏襲されています。パスは/Volumes/takaakiyayoi_catalog/japan_covid_analysis/covid_dataのように/Volumes/<カタログ>/<スキーマ>/<ボリューム>となります。pandas/PySpark/シェルコマンドなど使うツールに関係なくこれらのファイルにアクセスできます。
Screenshot 2024-01-08 at 9.23.04.png

以下のようにpandasで読み込めます。

Python
import pandas as pd

covid_pdf = pd.read_csv(
    "/Volumes/takaakiyayoi_catalog/japan_covid_analysis/covid_data/newly_confirmed_cases_daily.csv"
)
display(covid_pdf)

Screenshot 2024-01-08 at 9.32.35.png

ちなみに上のdisplay関数はDatabricksで使える便利コマンドで、データフレームを表示する際にお使いください。上述の可視化機能も利用できます。

PySparkでも読み込めます。

Python
covid_df = spark.read.csv(
    "/Volumes/takaakiyayoi_catalog/japan_covid_analysis/covid_data/newly_confirmed_cases_daily.csv",
    header=True,
)
display(covid_df)

Screenshot 2024-01-08 at 9.26.33.png

シェルコマンドでもアクセスできます。シェルコマンドを実行するにはマジックコマンド%shを使います。

%sh
head /Volumes/takaakiyayoi_catalog/japan_covid_analysis/covid_data/newly_confirmed_cases_daily.csv
Date,ALL,Hokkaido,Aomori,Iwate,Miyagi,Akita,Yamagata,Fukushima,Ibaraki,Tochigi,Gunma,Saitama,Chiba,Tokyo,Kanagawa,Niigata,Toyama,Ishikawa,Fukui,Yamanashi,Nagano,Gifu,Shizuoka,Aichi,Mie,Shiga,Kyoto,Osaka,Hyogo,Nara,Wakayama,Tottori,Shimane,Okayama,Hiroshima,Yamaguchi,Tokushima,Kagawa,Ehime,Kochi,Fukuoka,Saga,Nagasaki,Kumamoto,Oita,Miyazaki,Kagoshima,Okinawa
2020/1/16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2020/1/17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2020/1/18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2020/1/19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2020/1/20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2020/1/21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2020/1/22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2020/1/23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2020/1/24,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

pandasデータフレームをCSVとしてボリュームに保存します。

Python
covid_pdf.to_csv("/Volumes/takaakiyayoi_catalog/japan_covid_analysis/covid_data/pandas_data.csv")

保存されました。
Screenshot 2024-01-08 at 9.35.12.png

上書きの回避策

最後にもう一度上書きの件ですが、Sparkの場合には防御機構があります。例えば、テーブルを再度作成しようとすると以下のようにエラーとなりテーブルは上書きされません。すでにテーブルが存在しているというメッセージです。

TableAlreadyExistsException: [TABLE_OR_VIEW_ALREADY_EXISTS] Cannot create table or view tpch.orders_199807 because it already exists.

このような場合、明示的に上書きを指示することができます。CREATE OR REPLACE TABLEを使います。テーブルが存在する場合にはデータを洗い替えするコマンドです。

SQL
%sql
CREATE OR REPLACE TABLE takaakiyayoi_catalog.tpch.orders_199807 AS
SELECT
  o_orderkey,
  o_custkey,
  o_orderstatus,
  o_totalprice,
  o_orderdate,
  o_orderpriority
FROM
  samples.tpch.orders
WHERE
  o_orderdate = "1998-07-01"
  AND o_totalprice >= 100000

PySparkでも同様です。テーブルが存在する場合にはSQLの際と同じエラーとなります。明示的に上書きを指示するには、writeの後にmode("overwrite")を指定します。

Python
sdf = spark.table("samples.tpch.orders")
(
    sdf.select(
        [
            "o_orderkey",
            "o_custkey",
            "o_orderstatus",
            "o_totalprice",
            "o_orderdate",
            "o_orderpriority",
        ]
    )
    .filter("o_orderdate = '1998-07-01' AND o_totalprice >= 100000")
    .write.mode("overwrite").saveAsTable("takaakiyayoi_catalog.tpch.orders_199807")
)

ですので、通常Sparkを使ってデータを書き込む際に上書きを心配する必要はないのですが、最悪のパターンは明示的に上書きを指定していることを忘れて上書きしてしまったというものです。これは、上述どこに書き込みを行うのかに加えて、どのAPIのどの書き込みモードを使っているのかについても注意を払う以外に対策はありません。逆にこれらを意識しないでプログラムを実行しているのであれば、それによるリスクを想像していただき注意深くコーディングすることをお勧めします。と言っている私もたまにやってしまいます。

まとめ

書き込みのセクションは注意すべきことが多いので量が増えてしまいましたが、以下を注意いただきつつDatabricksを活用いただけると幸いです。

  • データの読み書きはテーブルがお勧めです。アクセスが容易で上書きしたとしてもロールバックが簡単です。
  • どのテーブル、ファイルを読み込んでいるのかを常に意識ください。
  • どのテーブル、ファイルに書き込みを行うのかを常に意識ください。
  • どのAPIのどの書き込みモードを使っているのか。明示的に上書きを指定している場合、それは適切なものであるのかをご確認ください。

そして、「これだとJupyter Notebookと大差ないのでは?」と思われた方もいらっしゃるかもしれませんが、これは「はじめてのDatabricks」です。ここでご紹介したのはDatabricksのほんの一部の機能です。

こちらに説明があるように、Databricksは以下のような用途でご活用いただけます。

  • データ処理ワークフローのスケジューリングと管理
  • ダッシュボードとビジュアライゼーションの生成
  • セキュリティー、ガバナンス、高可用性、およびディザスタリカバリーの管理
  • データの検出、アノテーション、探索
  • 機械学習 (ML) のモデリング、追跡、モデルサービング
  • 生成AI ソリューション

本書ではビジュアライゼーションとガバナンスの一部に触れたに過ぎません。それ以外の機能についても今後紹介してこうと思いますし、これまでに記述した記事はこちらにありますので、ご興味のある方は一覧いただけると幸いです。

最後になりますが、クラスターが起動している間課金が発生しますので、使い終わったクラスターは停止しましょう。
Screenshot 2024-01-08 at 10.38.34.png

参考資料

Databricksクイックスタートガイド

Databricksクイックスタートガイド

Databricks無料トライアル

Databricks無料トライアル

21
18
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
21
18