Databricksでpandasは使えるのか？

[Can you use pandas on Databricks? \| Databricks on AWS](https://docs.databricks.com/pandas/index.html) [2022/11/18時点]の翻訳です。

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

Databricksランタイムには、標準的なPythonパッケージの一つとしてpandasが含まれており、Databricksのノートブックやジョブでpandasデータフレームを作成、活用することができます。

Databricksランタイム10.0以降では、[Pandas API on Spark](https://qiita.com/taka_yayoi/items/db8e1ea52afe5c282c94)がPySparkデータフレーム上における馴染み深いpandasコマンドを提供しています。また、[pandasデータフレームとPySparkデータフレームの間で変換](https://qiita.com/taka_yayoi/items/063c2360670f59b38471)を行うことができます。

Apache Sparkには、PySparkデータフレームに直接pandasの変換処理を適用できる[pandas function API](https://qiita.com/taka_yayoi/items/0fe6534824797b630176)の形でPythonロジックを実行するArrow最適化処理が含まれています。また、Apache Sparkでは、Pythonで定義された任意のユーザー関数に対して同様のArrow最適化を活用する[pandas UDF](https://qiita.com/taka_yayoi/items/b65197128ee698d87910)もサポートしています。

# pandasはDatabricksのどこにデータを格納するのか？

Databricksのさまざまな場所にデータを格納するためにpandasを使用することができます。どこにデータを格納し、どこからデータをロードできるのかは、ワークスペース管理者による設定に依存します。

:::note
**注意**
クラウドオブジェクトストレージにプロダクションのデータを格納することをお勧めします。[Working with data in Amazon S3](https://docs.databricks.com/external-data/amazon-s3.html)をご覧ください。

Unity Catalogが有効化されたワークスペースをお使いの際には、外部ロケーションのクラウドストレージにアクセスすることができます。[Unity Catalogにおける外部ロケーションとストレージ認証情報の管理](https://qiita.com/taka_yayoi/items/18fee92365eee58e0b94)をご覧ください。
:::

センシティブな情報がないデータにクイックな探索を行うには、以下のサンプルの様に相対パスや[DBFS](https://qiita.com/taka_yayoi/items/f15b50469b368907ec3b)を用いて安全にデータを保存することができます。

```py:Python
import pandas as pd

df = pd.DataFrame([["a", 1], ["b", 2], ["c", 3]])

df.to_csv("./relative_path_test.csv")
df.to_csv("/dbfs/dbfs_test.csv")
```

以下の様に、`%fs`マジックコマンドを用いてDBFSに書き込まれたファイルを探索することができます。

```bash:Bash
%fs ls
```

相対パスに保存する際、ファイルの場所はコードを実行した場所に依存します。Databricksノートブックを使用している場合、データファイルはお使いのクラスターのドライバーにアタッチされたボリュームストレージに保存されます。この場所に格納されたデータは、クラスターが停止されると永久的に削除されます。任意ファイルのサポートが有効化された[Databricks Repos](https://qiita.com/taka_yayoi/items/b89f199ff0d3a4c16140)を使用している場合には、データは現在のプロジェクトのルートに保存されます。いずれのケースでも、以下の様にカレントのルートディレクトリから簡単なbashオペレーションを実行できる`%sh`マジックコマンドを用いて、書き込まれたファイルを探索することができます。

```sh:Bash
%sh ls
```

Databricksがどのように様々なファイルを保存するのかに関しては、[How to work with files on Databricks](https://docs.databricks.com/files/index.html)をご覧ください。

# Databricksではpandasを用いてどの様にデータをロードするのか？

Databricksでは、探索のためにワークスペースにデータをアップロードするために、数多くの選択肢を提供しています。pandaによるデータロードで望ましい方法は、データをどのようにワークスペースにロードするのかによって変化します。

ローカルマシン上にノートブックと一緒に小規模なデータファイルを格納していたのであれば、データとコードを一緒に[Repos](https://docs.databricks.com/repos/work-with-notebooks-other-files.html)にアップロードすることができます。データファイルをロードするために相対パスを使うことができます。

Databricksではデータロードに対する数多くの[UIベースのオプション](https://docs.databricks.com/ingestion/add-data/index.html)を提供しています。これらのオプションの多くは、あなたのデータをDetlaテーブルとして保存します。そして、Sparkデータフレームに[Deltaテーブルを読み込み](https://docs.databricks.com/delta/tutorial.html#read)、それを[pandasデータフレームに変換](https://qiita.com/taka_yayoi/items/063c2360670f59b38471)することができます。

DBFSや相対パスを用いてデータファイルを保存している場合には、これらのデータファイルを再ロードするためにDBFSや相対パスを使用することができます。以下のコードではサンプルを示しています。

```py:Python
import pandas as pd

df = pd.read_csv("./relative_path_test.csv")
df = pd.read_csv("/dbfs/dbfs_test.csv")
```

プロダクションデータはクラウドオブジェクトストレージに保存することをお勧めします。[Working with data in Amazon S3](https://docs.databricks.com/external-data/amazon-s3.html)をご覧ください。

Unity Catalogが有効化されたワークスペースをお使いの場合は、外部ロケーションに設定されたクラウドストレージにアクセスすることができます。[Unity Catalogにおける外部ロケーションとストレージ認証情報の管理](https://qiita.com/taka_yayoi/items/18fee92365eee58e0b94)をご覧ください。

pandasと完全修飾のURLを用いることで、S3から直接データをロードすることができます。クラウドのデータにアクセスするためにクラウドの認証情報を指定する必要があります。

```py:Python
df = pd.read_csv(
  f"s3://{bucket_name}/{file_path}",
  storage_options={
    "key": aws_access_key_id,
    "secret": aws_secret_access_key,
    "token": aws_session_token
  }
)
```

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)