Snowflake の外部ステージにある Parquet ファイルを扱う方法


この記事では、AWS S3 上の Parquet ファイルを Snowflake にロードする際に必要なスキーマ確認やデータ操作手順を解説します。
実務で役立つ情報を備忘録としてまとめたものです。

## 外部ステージの確認
### 外部ステージ情報確認
Snowflake の外部ステージを利用して S3 に格納された Parquet ファイルを扱う前に、現在設定されているステージ情報を確認します。
```sql
show stages like 'S3_STAGE';
```
結果例:
| created_on | name | database_name | schema_name | url | ...(省略)... |
|:-----------|:------------|:------------|:------------|:------------|:------------|
| 2024-12-09 01:11:23.789 +0900 | S3_STAGE | TEST_DB | TEST_SCHEMA | s3://test_bucket/import_data | ...(省略)... |

### 外部ステージの設定変更
S3 の URL が誤っている場合、以下のコマンドで修正できます。
```sql
alter stage S3_STAGE set url = 's3://test_bucket/export_data';
```
修正後、再度確認しましょう。
```sql
show stages like 'S3_STAGE';
```
結果例:
| created_on | name | database_name | schema_name | url | ...(省略)... |
|:-----------|:------------|:------------|:------------|:------------|:------------|
| 2024-12-09 01:11:23.789 +0900 | S3_STAGE | TEST_DB | TEST_SCHEMA | s3://test_bucket/export_data | ...(省略)... |


### S3 上のファイル確認
外部ステージに格納されているファイルを確認します。
```sql
list @test_db.test_schema.s3_stage;
```
結果例:
| name | size | md5 | last_modified |
|:-----------|:------------|:------------|:------------|
| s3://test_bucket/export_data/sales_data/LOAD00000001.parquet | 123456  | aaaa1234bbb56789 | Mon, 9 Dec 2024 01:12:34 GMT |
| s3://test_bucket/export_data/sales_data/LOAD00000002.parquet | 234567  | jjj5678rrr123456bbd | Mon, 9 Dec 2024 01:12:36 GMT |
| s3://test_bucket/export_data/sales_data/LOAD00000003.parquet | 345678  | bbb3456ccc789ddd | Mon, 9 Dec 2024 01:12:38 GMT |

## Parquet ファイルのスキーマ確認

### Parquet フォーマットの作成
スキーマ確認のため、まず Parquet フォーマットを作成します。
```sql
create or replace file format test_db.test_schema.parquet_format type = parquet;
```

### parquet のスキーマ定義の参照
次に、infer_schema 関数を利用してファイルのスキーマを推測します。
```sql
select
  *
from table(
  infer_schema(
    location=>'@test_db.test_schema.s3_stage/sales_data/part-0000-aaa123456.parquet'
    , file_format=>'test_db.test_schema.parquet_format'
  )
)
order by order_id
;
```
結果例:
| COLUMN_NAME | TYPE | NULLABLE | EXPRESSION | FILENAMES | ORDER_ID |
|:-----------|:------------|:------------|:------------|:------------|:------------|
| ID | TEXT | TRUE | $1:ID::TEXT | sales_data/LOAD00000001.parquet | 0 |
| NAME | TEXT | TRUE | $1:NAME::TEXT | sales_data/LOAD00000001.parquet | 1 |
| PRICE | NUMBER(10, 0) | TRUE | $1:PRICE::TEXT | sales_data/LOAD00000001.parquet | 2 |
| UPDATE_DATE | DATE | TRUE | $1:UPDATE_DATE::DATE | sales_data/LOAD00000001.parquet | 3 |


### Parquet ファイルのデータ確認
スキーマが確認できたら、データ内容を確認します。
```sql
select
  $1:ID::TEXT as id
  , $1:NAME::TEXT as name
  , $1:PRICE::TEXT as price
  , $1:UPDATE_DATE::DATE as update_date
from
  @test_db.test_schema.s3_stage/sales_data
(
  file_format=>'test_db.test_schema.parquet_format'
)
```
結果例:
| id | name | price | update_date |
|:-----------|:------------|:------------|:------------|
| 0001 | name-1 | 1000 | 2024-12-01 11:22:33 |
| 0002 | name-2 | 2000 | 2024-12-01 20:44:55 |
| 0003 | name-3 | 3000 | 2024-12-02 12:23:34 |

## まとめ
本記事では、AWS S3 の外部ステージを利用した Parquet ファイルのスキーマ確認とデータ操作について解説しました。これらの手順を実践すれば、Snowflake における Parquet ファイルの取り扱いがスムーズになります。

#### Tips:
- `infer_schema` はデータ構造の確認に非常に便利です。
- 大規模なデータセットを扱う場合は、各ファイル（またはその一部）から少量のデータを抽出して、スキーマやデータの内容を事前に確認したほうが効率的に運用できます。