Databricksのサンプルデータを操作する

[Databricksのサンプルデータ](https://qiita.com/taka_yayoi/items/3f8ccad13c6efd242be1)を用いて、Databricksにおけるデータ操作を体感します。

こちらで使用しているノートブックはこちらとなります。こちらのノートブックを[インポート](https://qiita.com/taka_yayoi/items/c306161906d6d34e8bd5#%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88)して使うこともできます。

https://github.com/taka-yayoi/public_repo/blob/main/databricks_sample_datasets/2022-06-03%20-%20DBFS%20Example.py

# Databricksにおけるデータの格納場所

Databricksをデプロイする際にS3の設定を行なっており、Databricksで使用するデータはこちらのS3バケットに格納されます。DatabricksからS3のデータにアクセスする際には、**Databricksファイルシステム(DBFS)** 経由でアクセスすることになります。DBFSを利用することで、S3のURLなどを意識することなしに、フォルダー、ファイルの概念でファイルを操作することができます。

![](https://camo.qiitausercontent.com/226e804c772f45d7267917336e094f914af63371/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313136383838322f63303064663339632d643864622d333862642d386532632d3438666533376635353636372e706e67)

:::note info
**DBFSのアクセス権に関する重要な情報**
[DBFSルート](https://qiita.com/taka_yayoi/items/897264c486e179d72247#dbfs%E3%83%AB%E3%83%BC%E3%83%88)を除き、DBFSにマウントされたオブジェクトストレージのオブジェクトに対してすべてのユーザーが読み書きのアクセス権を持ちます。

しかし、インスタンスプロファイルを用いてマウントが作成されている場合、IAMロールが許可するユーザーのみがアクセス権を持ち、当該インスタンスプロファイルを使用するように設定されたクラスターのみがアクセスすることができます。このため、インスタンスプロファイルを用いて作成されたマウントにはDBFS CLIでアクセスすることはできません。

インスタンスプロファイルを用いたS3バケットのマウントに関しては、[DBFSを通じたS3バケットへのアクセス](https://qiita.com/taka_yayoi/items/a26a1fb49c0e217ad10b#dbfs%E3%82%92%E9%80%9A%E3%81%98%E3%81%9Fs3%E3%83%90%E3%82%B1%E3%83%83%E3%83%88%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9)をご覧ください。
:::

**参考資料**
- [Databricksのアーキテクチャ](https://qiita.com/taka_yayoi/items/7d209bc8d32bc5f2dba4)
- [Databricksにおけるファイルシステム](https://qiita.com/taka_yayoi/items/e16c7272a7feb5ec9a92)
- [Databricksファイルシステム\(DBFS\)](https://qiita.com/taka_yayoi/items/897264c486e179d72247)

# データ操作用ノートブックを作成する

:::note info
**注意**
画面が日本語になっていない場合は、[こちら](https://qiita.com/taka_yayoi/items/ff4127e0d632f5e02603)を参考にしてください。
:::

1. Databricksワークスペースにログインします。
1. サイドメニューの**作成**をクリックします。
![Screen Shot 2022-06-03 at 12.20.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/24c4bca5-5247-b662-632c-856689f74481.png)
1. **ノートブック**を選択します。
![Screen Shot 2022-06-03 at 12.20.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/23735e1b-07ae-ad04-9750-6c86717db283.png)
1. ノートブック名を入力し、デフォルト言語は**Python**とし、クラスターでは稼働中のクラスターを選択します。なお、後からクラスターを起動することも可能です。
![Screen Shot 2022-06-03 at 12.20.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a4049bf7-1119-3ac1-8983-c5609116c540.png)
1. ホームフォルダにノートブックが作成されます。
![Screen Shot 2022-06-03 at 12.21.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5c853825-0e9c-d9cc-7382-1340899149dd.png)

# ノートブックからサンプルデータにアクセスする

アクセスしたいデータに合わせて、ノートブックに処理を記述していきます。ここではCOVID-19の感染者数のデータにアクセスします。

ノートブックがクラスターにアタッチされていない場合は、稼働しているクラスターにノートブックをアタッチします。ノートブック左上のドロップダウンリストからグリーンのインジケータが表示されているクラスターを選択します。
![Screen Shot 2022-06-03 at 12.13.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b853b74e-755c-a1dc-6174-7fc4041bc6a0.png)

ノートブックの最初のセルに以下の内容を貼り付けます。以下の`%fs`はDBFSを操作する際に指定するマジックコマンドとなります。マジックコマンドの詳細に関しては[こちら](https://qiita.com/taka_yayoi/items/dfb53f63aed2fbd344fc#%E3%83%9F%E3%83%83%E3%82%AF%E3%82%B9%E8%A8%80%E8%AA%9E)を参照ください。

このセルを実行することで、DBFSのパス`/databricks-datasets/COVID/covid-19-data`のファイル一覧を表示します。

```
%fs
ls /databricks-datasets/COVID/covid-19-data
```

![Screen Shot 2022-06-03 at 12.52.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/41a1a093-ff11-3e44-4cd9-737af6ddf90e.png)



ノートブックにセルを追加して、`/databricks-datasets/COVID/covid-19-data/us-states.csv`の中身を確認するコマンドを実行します。セルを追加するには、セルの下部にカーソルを持っていくことで表示される **+** ボタンをクリックします。
![Screen Shot 2022-06-03 at 12.31.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/45b55915-7c03-7332-d191-b129afd43863.png)


```
%fs
head /databricks-datasets/COVID/covid-19-data/us-states.csv
```

こちらを実行することで、CSVファイルの中身を確認することができます。
![Screen Shot 2022-06-03 at 12.53.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5866c6ef-61b4-fbb9-1875-eff1b425fcbb.png)


さらにセルを追加し、以下の内容を記述します。

```py:Python
# ファイルの格納場所とタイプ
file_location = "dbfs:/databricks-datasets/COVID/covid-19-data/us-states.csv"
file_type = "csv"

# CSVのオプション
infer_schema = "false" # スキーマの推定は行わない
first_row_is_header = "true" # 先頭行はヘッダー
delimiter = "," # 区切り文字

# CSVファイルのオプションが適用されます。他のファイルタイプの場合、これらは無視されます。
df = spark.read.format(file_type) \
  .option("inferSchema", infer_schema) \
  .option("header", first_row_is_header) \
  .option("sep", delimiter) \
  .load(file_location)

# 読み込んだデータフレームを表示します
display(df)
```

こちらを実行することで、サンプルデータをデータフレームに読み込むことができます。
![Screen Shot 2022-06-03 at 12.54.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/66b9b8e8-78be-2fd1-dc71-e27e4176db7c.png)

`display`を用いてデータフレームを表示すると、結果の並び替えや結果からグラフを表示することも可能です。表示結果の下に表示される表とグラフマークのボタンで表示を切り替えることができます。

![Screen Shot 2022-06-03 at 12.35.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/84c18061-6f04-8ae8-ad5e-4e0d2d756568.png)

グラフボタンを押した後に表示される**プロットオプション**で、以下のように設定をしてみます。

- キー: `date`
- シリーズのグループ分け: `state`
- 値: `cases`
- 表示タイプ: 折れ線グラフ

![Screen Shot 2022-06-03 at 12.57.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/03c68032-3cb3-5fcd-a531-bda295528543.png)

これで、州ごとの感染者数の時系列変化を示す折れ線グラフを表示することができます。表形式に戻すには表マークのボタンを押します。この可視化機能を活用することで、クイックにデータの傾向を把握することができます。他のプロットオプションも試してみてください。

![Screen Shot 2022-06-03 at 12.58.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cac30653-973a-d170-6f13-3bf3e4f0ebe2.png)


## 一時ビューの作成

SQLをメインで使用してデータの操作を行いたい場合には、`createOrReplaceTempView`を用いてデータフレームを一時ビューに登録するのが便利です。

```py:Python
# ビューの作成

temp_table_name = "usstates"

df.createOrReplaceTempView(temp_table_name)
```

一時ビューとして登録することで、SQLセルからさまざまな操作を行えるようになります。

```sql:SQL
%sql

/* 作成した一時ビューをSQLセルでクエリーします */

select * from `usstates`
```

![Screen Shot 2022-06-03 at 12.55.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0e94a2d0-6121-6d07-b27b-701340139165.png)

この一時ビューは上のコマンドを実行したノートブックからのみアクセスすることができます。また、クラスターが停止すると削除されます。

## テーブルの永続化

他のユーザーもテーブルにクエリーできるようにするには、上のデータフレームからテーブルを作成することもできます。データベースにテーブルとして保存することで、テーブルは永続化され、クラスターを再起動してもデータにアクセスでき、他のユーザーのノートブックからもアクセスできるようになります。

```py:Python
# 他のテーブルと重複しない名前を指定します
permanent_table_name = "taka_usstates"

df.write.format("parquet").saveAsTable(permanent_table_name)
```

このようにすることでテーブルが永続化され、永続化されたテーブルはサイドメニューの**データ**から確認することができます。
![Screen Shot 2022-06-03 at 12.56.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/64c8f796-a686-9430-d847-911f8db6e6fa.png)


:::note info
**注意**
上の例では、データベースを明示的に指定しないので、デフォルトのデータベース`default`の中にテーブルが作成されます。必要に応じて別のデータベースを作成し、その中にテーブルを保存してください。詳細は[Databricksにおけるデータベースおよびテーブル](https://qiita.com/taka_yayoi/items/e7f6982dfbee7fc84894)をご覧ください。
:::

## クリーンアップ

永続化したテーブルを削除するには`DROP TABLE`を実行します。

```sql:SQL
%sql
-- クリーンアップ
DROP TABLE taka_usstates;
```

この他にも`/databricks-datasets`の下には、以下のように数多くのサンプルデータがありますので、色々試してみてください！

- `/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv`: ダイアモンドデータセット
- `/databricks-datasets/flights/departuredelays.csv`: フライトデータセット
- `/databricks-datasets/bikeSharing/data-001/day.csv`: バイクシェアリングデータセット

ファイルの詳細はディレクトリ配下のREADME.mdなどで確認することができます。

```
%fs
head /databricks-datasets/bikeSharing/README.md
```

![Screen Shot 2022-06-03 at 13.12.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e100ce81-ed61-7ff4-611a-96a9df5ce150.png)


### Databricks 無料トライアル

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