Databricksの一時ビュー作成時のフォーマットおよびオプションの指定

# 一時ビューとは

Databricksではデータフレームに対してクイックにSQLを使うために **一時ビュー(temporary view)** という機能が存在します。

https://learn.microsoft.com/ja-jp/azure/databricks/sql/language-manual/sql-ref-syntax-ddl-create-view

一時ビューはSparkセッションの中でのみ利用できるビューです。クラスターを停止するなどしてセッションを終了すると一時ビューは削除されます。デバッグなどでよく使います。

```py:Python
diamonds = (
    spark.read.format("csv")
    .option("header", "true")
    .option("inferSchema", "true")
    .load("/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv")
)

display(diamonds)
```
![Screenshot 2024-01-13 at 9.02.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2bdf64e2-953a-77d5-6855-ff15dcfeb670.png)

```py:Python
diamonds.createOrReplaceTempView("diamonds")
```

```sql:SQL
%sql
SELECT * FROM diamonds;
```
![Screenshot 2024-01-13 at 9.02.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/83fd1e53-28fb-b39e-e983-9aba075527b4.png)

SQLからも一時ビューは作成できるのですが、最近以下のノートブックの文法を教えていただきました。

```sql:SQL
-- mode "FAILFAST" will abort file parsing with a RuntimeException if any malformed lines are encountered
CREATE TEMPORARY VIEW diamonds
USING CSV
OPTIONS (path "/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv", header "true", mode "FAILFAST")
```

[こちら](https://learn.microsoft.com/ja-jp/azure/databricks/query/formats/csv)で説明されているものです。[マニュアル](https://learn.microsoft.com/ja-jp/azure/databricks/sql/language-manual/sql-ref-syntax-ddl-create-view)では`CREATE TEMPORARY VIEW`では`USING`や`OPTIONS`は使えない感じなのですが、普通に動きます。

調べてみたら、一時ビューではフォーマットやオプションを問題なく指定できました。

# 一時ビューにおけるフォーマットおよびオプションの指定

こちらで説明されています。

https://learn.microsoft.com/ja-jp/azure/databricks/query/formats/csv

> Databricks では、SQL ユーザーが CSV ファイルを読み取る際に read_files テーブル値関数を使うことをお勧めします。 read_files は Databricks Runtime 13.1 以降で使用できます。
>
> 一時ビューを使うこともできます。 一時ビューまたは read_files を使わずに、SQL を使って CSV データを直接読み取る場合は、次の制限が適用されます。
>
> - データ ソース オプションを指定できません。
> - データに対してデータ スキーマを指定できない。

言い換えると一時ビューを使う、あるいはビューの作成時に`read_files`関数を使うことでオプションを指定できるということです。`read_files`関数はこちらで説明されています。`read_files`関数を使う場合にはフォーマットは自動で判別されます。

https://learn.microsoft.com/ja-jp/azure/databricks/sql/language-manual/functions/read_files

一時ビューを作成する際にオプションを指定できるということなので、CSV以外も試してみます。なお、オプションの`mode`で`FAILFAST`を指定することで、[こちら](https://learn.microsoft.com/ja-jp/azure/databricks/query/formats/csv#--work-with-malformed-csv-records)にあるように、形式が正しくない場合には読み取りを中止するように指示しています。あとはファイルのパスを`path`で指定しています。

## JSON

```sql:SQL
%sql
CREATE TEMPORARY VIEW nyctaxi_tmp_view_sql
USING JSON
OPTIONS (path "/databricks-datasets/nyctaxi/sample/json/", mode "FAILFAST")
```
```sql:SQL
%sql
SELECT * FROM nyctaxi_tmp_view_sql;
```
![Screenshot 2024-01-13 at 9.22.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4455be4e-f574-5ab3-78a9-b65e64dc8f43.png)

## Parquet

```sql:SQL
%sql
CREATE TEMPORARY VIEW parquet_news_tmp_view_sql
USING PARQUET
OPTIONS (path "/databricks-datasets/news20.binary/data-001/training/", mode "FAILFAST")
```
```sql:SQL
%sql
SELECT * FROM parquet_news_tmp_view_sql;
```
![Screenshot 2024-01-13 at 9.34.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cd96499f-083d-b850-5fc2-8a6e554cc985.png)

## Delta

```sql:SQL
%sql
CREATE TEMPORARY VIEW delta_nyctaxi_tmp_view_sql
USING DELTA
OPTIONS (path "/databricks-datasets/nyctaxi-with-zipcodes/subsampled/", mode "FAILFAST")
```
```sql:SQL
%sql
SELECT * FROM delta_nyctaxi_tmp_view_sql;
```

# ビューでのオプション指定

ビューを作成する際にオプションを指定するには、[read_files関数]を使う必要があります。

```sql:SQL
%sql
CREATE VIEW takaakiyayoi_catalog.default.parquet_news_view AS
SELECT
  *
FROM
  read_files(
    "/databricks-datasets/news20.binary/data-001/training/",
    mode = > "FAILFAST"
  )
```

クイックにSQLで操作したいというケースでの自由度が広がりますね。是非ご活用ください！

ちなみに普通に他の方も使われていました。

- [Solved: PARSE\_SYNTAX\_ERROR creating view from CSV \- Databricks \- 38816](https://community.databricks.com/t5/data-engineering/parse-syntax-error-creating-view-from-csv/td-p/38816)

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

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