Google Colab で操作した Delta Lake のデータから Delta Lake 用の BigLake 外部テーブルを作成する方法

## 概要
本記事では、Google Colab で操作した Delta Lake のデータを用い、Delta Lake 用の BigLake 外部テーブルを作成する手順を解説します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d3c5fd34-c7e3-4b8d-bd06-7f2d45f7f296.png)

出所：[Delta Lake 用の BigLake 外部テーブルを作成する  | BigQuery  | Google Cloud](https://cloud.google.com/bigquery/docs/create-delta-lake-table?hl=ja)

ドキュメントにて最新のメタデータをディレクトリから参照する仕様が記載されており、本記事の結果としてもメタデータの最新化の処理は不要でした。

> Delta Lake テーブルにクエリを実行すると、BigQuery は接頭辞の下にあるデータを読み取ってテーブルの現在のバージョンを識別し、テーブルのメタデータとファイルを計算します。

出所：[Delta Lake 用の BigLake 外部テーブルを作成する  | BigQuery  | Google Cloud](https://cloud.google.com/bigquery/docs/create-delta-lake-table?hl=ja)

利用時の制限事項についてドキュメントに記載されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8b757128-ebbf-41e3-9a01-c50593ffb14f.png)

出所：[Delta Lake 用の BigLake 外部テーブルを作成する  | BigQuery  | Google Cloud](https://cloud.google.com/bigquery/docs/create-delta-lake-table?hl=ja#limitations)

## 事前準備

下記の記事を参考にして Google Colab と GCS を接続する方法を確立してください。

- [Google Colab の Spark にて Google Cloud Storage と連携する方法 #GoogleCloud - Qiita](https://qiita.com/manabian/items/3ef03f927a0230a57f05)

## 手順

### Delta Lake 用の BigLake 外部テーブルの作成

#### 1. Google Colab にて Spark のバージョンを確認

```bash
!pyspark --version
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/960160f0-636e-40b2-9718-5007dd198871.png)

#### 2. SparkSession の定義

`/content/drive/MyDrive/Colab Notebooks/bigquery_iceberg/gcs_key.json`に GCS への接続情報を配置することを前提としています。

```python
from google.colab import drive
drive.mount('/content/drive')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5d2e71e2-22a6-4ce8-a04d-a774e726cb53.png)

#### 3. GCS 上に Delta Lake テーブルを作成

```python
gcs_deltalake_path = "gs://manabianqiita/deltalake"
gcs_key_path = "/content/drive/MyDrive/Colab Notebooks/bigquery_iceberg/gcs_key.json"
```

```python
from pyspark.sql import SparkSession

spark = (
    SparkSession.builder
        .appName("DeltaLakeExample")
        .config("spark.jars", "https://storage.googleapis.com/hadoop-lib/gcs/gcs-connector-hadoop3-latest.jar")
        .config("spark.jars.packages", "io.delta:delta-spark_2.12:3.2.1")
        .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension")
        .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog")
        .config("spark.sql.warehouse.dir", gcs_deltalake_path)
        .config("spark.hadoop.fs.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem")
        .config("google.cloud.auth.service.account.enable", "true")
        .config("spark.hadoop.google.cloud.auth.service.account.enable", "true")
        .config("spark.hadoop.google.cloud.auth.service.account.json.keyfile", gcs_key_path)
        .getOrCreate()
)
spark
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4c74225b-dbc0-4875-b81b-322260704167.png)

#### 4. Delta Lake テーブルの作成とデータ挿入

```python
spark.sql("""
CREATE OR REPLACE TABLE first_table (
  id INT,
  name STRING
)
USING delta
""")
```

```python
spark.sql("""
INSERT INTO
    default.first_table (id, name, status)
VALUES
    (1, 'Alice', 'active'),
    (2, 'Bob', 'active'),
    (3, 'Charlie', 'active'),
    (4, 'Daisy', 'active'),
    (5, 'Ethan', 'active');
""").show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/49dfa8cb-6efc-4a03-a096-c127db7dfb3d.png)

GCS にて Delta Lake のディレクトリが作成されていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/39199c62-a7ce-454c-a1f1-43409103eb64.png)

#### 5. Delta Lake 用の BigLake 外部テーブルの作成

`{project_id}`を実際のプロジェクト ID に置き換えて以下のコマンドを実行します。

```sql
CREATE OR REPLACE EXTERNAL TABLE `{project_id}.qiita.delta_lake_first_table`
OPTIONS(
  format="DELTA_LAKE",
  uris=["gs://manabianqiita/deltalake/first_table"]
);
```

:::note warn

CONNECTION （接続）を利用せずにテーブルを作成しておりますが、本番環境では非推奨のようです。

> 接続なしでも Delta Lake 外部テーブルを作成できますが、次の理由からおすすめしません。

出所：[Delta Lake 用の BigLake 外部テーブルを作成する  | BigQuery  | Google Cloud](https://cloud.google.com/bigquery/docs/create-delta-lake-table?hl=ja#create-tables)
:::

#### 6. Delta Lake 用の BigLake 外部テーブルに対するクエリ実行

```sql
SELECT * FROM `qiita.delta_lake_first_table` ORDER BY id LIMIT 10;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7cfa4ab0-031e-45e8-82b6-6a7fcf4ee1df.png)

### Delta Lake テーブルのデータ操作後の Delta Lake 用の BigLake 外部テーブルの確認

#### 1. Delta Lake テーブルに対する DELETE を実施

```python
spark.sql("""
DELETE FROM 
    default.first_table
    WHERE
        id > 3;
""").show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2164e66d-2d2a-4334-b47a-492b0ff44c06.png)

#### 2. BigLake 外部テーブルの作成

メタデータの更新を実施することなく、最新データを取得することができます。

```sql
SELECT * FROM `qiita.delta_lake_first_table` ORDER BY id LIMIT 10;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/eb3c2cde-6163-4220-8d80-e0fc2a012db4.png)