チュートリアル: Delta Live TablesでSQLを用いたデータパイプラインの宣言

[Tutorial: Declare a data pipeline with SQL in Delta Live Tables \| Databricks on AWS](https://docs.databricks.com/delta-live-tables/tutorial-sql.html) [2023/4/28時点]の翻訳です。

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

このチュートリアルでは、Delta Live Tablesを用いてデータパイプラインを宣言するためのSQL構文の使い方を説明します。SQLユーザーがDatabricksで新たなETL、取り込み、変換パイプラインを構築する際にはDelta Live TablesとSQLを活用することをおすすめします。Delta Live TablesのSQL構文は、様々な新たなキーワード、構造、テーブル値関数で標準的なSpark SQLを拡張しています。標準SQLに対するこれらの機能追加によって、ユーザーは新たなツールやコンセプトを学ぶ必要なしに、データセット間の依存関係を宣言し、プロダクションレベルのインフラストラクチャをデプロイできるようになります。

Sparkデータフレームに慣れ親しんでおり、繰り返しのテストやメタプログラミングオペレーションのサポートを望むユーザー向けには、Delta Live TablesのPythonを活用することをお勧めします。[Tutorial: Declare a data pipeline with Python in Delta Live Tables](https://docs.databricks.com/delta-live-tables/tutorial-python.html)をご覧ください。

:::note
**注意**
- Delta Live Tablesのソースファイルで言語を混在させることはできません。パイプラインにおいて、異なる言語を用いた複数のノートブックやファイルを活用することは可能です。
- この例のコードを使用するには、パイプラインを作成する際にストレージオプションで`Hive metastore`を選択してください。このサンプルではDBFSのデータを読み込むので、ストレージオプションとしてUnity Catalogを用いるように設定されたパイプラインではこのサンプルを実行することができません。
:::

# Delta Live TablesのSQLクエリーはどこで実行されるのか？

クエリーのロジックを処理するためのパイプライン設定であなたのSQLファイルを追加する必要があります。Delta Live Tablesで定義されるロジックの実行については、[Tutorial: Run your first Delta Live Tables pipeline](https://docs.databricks.com/delta-live-tables/tutorial-pipelines.html)をご覧ください。

Delta Live TablesのSQLクエリーを記述するためにノートブックやSQLファイルを使うことはできますが、Delta Live Tablesはノートブックセルでインタラクティブに実行するように設計されていません。Delta Live Tables構文を含むセルをDatabricksノートブックで実行すると、クエリーは構文的には適切だが、クエリーロジックを実行しない旨のメッセージが返却されます。

# SQLを用いたDelta Live Tablesパイプラインの宣言

このチュートリアルでは、以下を行うためにWikipediaのクリックストリームデータを含むデータセットに対してDelta Live Tablesパイプラインを宣言するためにSQL構文を使用します:

- 生のJSONクリックストリームデータをテーブルに読み込みます。
- 生データのテーブルからレコードを読み込み、クレンジングされたデータを含む新規テーブルを作成するためにDelta Live Tablesの[エクスペクテーション](https://docs.databricks.com/delta-live-tables/expectations.html)を活用します。
- 派生データセットを作成するDelta Live Tablesクエリーを作成するために、クレンジングされたデータテーブルからのレコードを活用します。

このコードでは、メダリオンアーキテクチャの簡素化した例をデモンストレーションします。[Databricksのメダリオンレイクハウスアーキテクチャとは？](https://qiita.com/taka_yayoi/items/f3d9028cf533e2c78b9d)をご覧ください。

新規ノートブックにSQLコードをコピーアンドペーストしてください。ノートブックの単一のセル、あるいは複数のセルにサンプルコードを追加することができます。ノートブック作成のオプションを確認するには、[ノートブックの作成](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%E4%BD%9C%E6%88%90)をご覧ください。

# オブジェクトストレージのファイルからテーブルを作成

Delta Live Tablesでは、Databricksでサポートされているすべてのフォーマットからのデータロードをサポートしています。[Databricksにおける外部データの取り扱い](https://qiita.com/taka_yayoi/items/09348912a92a24441c40)をご覧ください。

Delta Live TablesのすべてのSQL文では、`CREATE OR REFRESH`構文とせまんティクスを使用します。パイプラインをアップデートする際、Delta Live Tablesは、論理的に正しい結果がインクリメンタル処理を通じて実現できるか、あるいは完全な再計算が必要かを判断します。

以下のサンプルでは、オブジェクトストレージに格納されているJSONファイルからデータをロードすることでテーブルを作成します:

```sql:SQL
CREATE OR REFRESH LIVE TABLE clickstream_raw
COMMENT "The raw wikipedia clickstream dataset, ingested from /databricks-datasets."
AS SELECT * FROM json.`/databricks-datasets/wikipedia-datasets/data-001/clickstream/raw-uncompressed-json/2015_2_clickstream.json`;
```

# 前段のデータセットからテーブルをパイプラインに追加

現在使用しているDelta Live Tablesパイプラインで宣言された他のデータセットからデータをクエリーするために`live`バーチャルスキーマを活用することができます。このようにして新規テーブルを宣言すると、アップデートの実行前にDelta Live Tablesが自動で解決する依存関係を構成します。この`live`スキーマは、あなたがご自身のデータセットを公開したい場合には、Delta Live Tablesがターゲットスキーマに置き換えるDelta Live Tablesで実装されているカスタムキーワードです。[Publish data from Delta Live Tables pipelines to the Hive metastore](https://docs.databricks.com/delta-live-tables/publish.html)をご覧ください。

また、以下のコードにはエクスペクテーションを用いたデータ品質の監視と矯正のサンプルが含まれています。[Manage data quality with Delta Live Tables](https://docs.databricks.com/delta-live-tables/expectations.html)をご覧ください。

```sql:SQL
CREATE OR REFRESH LIVE TABLE clickstream_prepared(
  CONSTRAINT valid_current_page EXPECT (current_page_title IS NOT NULL),
  CONSTRAINT valid_count EXPECT (click_count > 0) ON VIOLATION FAIL UPDATE
)
COMMENT "Wikipedia clickstream data cleaned and prepared for analysis."
AS SELECT
  curr_title AS current_page_title,
  CAST(n AS INT) AS click_count,
  prev_title AS previous_page_title
FROM live.clickstream_raw;
```

# 補強されたデータビューの作成

Delta Live Tablesは一連の依存関係グラフとしてパイプラインのアップデートを処理するので、特定のビジネスロジックを持つテーブルを宣言することで、ダッシュボード、BI、分析を支援する高度に補強されたビューを宣言することができます。

ライブテーブルは、コンセプト的にはマテリアライズドビューと同じものです。Sparkにおける従来のビューはビューがクエリーされるたびにロジックを実行しますが、ライブテーブルはデータファイルにおける最新のクエリー結果を格納します。Delta Live Tablesはパイプラインのすべてのデータセットのアップデートを管理するので、マテリアライズドビューのレーテンシー要件にマッチするように、パイプラインアップデートをスケジューリングし、これらのテーブルに対するクエリーには利用できるデータの最新バージョンが含まれることを知ることができます。

以下のコードでは、前段のデータに対して補強されたマテリアライズドビューを作成しています:

```sql:SQL
CREATE OR REFRESH LIVE TABLE top_spark_referers
COMMENT "A table containing the top pages linking to the Apache Spark page."
AS SELECT
  previous_page_title as referrer,
  click_count
FROM live.clickstream_prepared
WHERE current_page_title = 'Apache_Spark'
ORDER BY click_count DESC
LIMIT 10;
```

# 次のステップ

より詳細を学ぶには、[Delta Live Tables SQLリファレンス](https://qiita.com/taka_yayoi/items/51d0dbfbdbea5baa0c1d)をご覧ください。

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

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

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