Snowflake Azure BLOB Storageデータロード：③外部ステージ～データロード

[目次に戻る](https://qiita.com/taku_tachibana/items/408686a031b9624e981e)

### ■本記事の目的
Snowflakeのデータロードを理解する。
ユーザー管理のAzureBLOBStorageからSnowflakeにデータロードを行います。
コンテナーおよび取込用のテストデータ（CSV形式）は、事前に作成済みとします。
※階層型名前空間を有効にしないのでコンテナー配下のフォルダはありません。

### ■前回の記事
[Snowflake Azure BLOB Storageデータロード：②ストレージネットワーク構成](https://qiita.com/taku_tachibana/items/4252293bf53d498f971c)

### ■概要
外部ステージを作成していきます。
前回、作成したストレージ統合を利用し作成します。

ファイル形式については、S3データロードの際に行ったものと共通利用のため
以下参照ください。
[Snowflake S3データロード：②ファイル形式](https://qiita.com/taku_tachibana/items/6ca0f9a49158260c1e39)

COPY INTOによるデータをロードして検証します。

### ■前提
SnowflakeはAzure（tokyoリージョン）にホストします。トライアル環境です。
ストレージ統合は、前段で作成済みとします。

### ■外部ステージを作成する。
スキーマオブジェクトのため、作成権を持っているロールで作成します。
作成済みのストレージ統合、ファイル形式を以下の構文に入れてください。
```
use role <ロール名>;
use database <データベース名>;
use schema <スキーマ名>;

create or replace stage <外部ステージ名>
storage_integration=<ストレージ統合名>
url='<azure://に変換したパスURL/>'
file_format=<ファイル形式名>
--directory=(enable=true)--ディレクトリテーブル使用する場合は付加する。

例）
use role SYSADMIN;
use database TEST_DB;
use schema TEST_SC;
create or replace stage TEST_STAGE_AZ
storage_integration=TEST_INTEG_AZ
url='azure://storage_account.blob.core.windows.net/container/'
file_format=CSV_HE_CM_NFO_U8 
;
```
階層型名前空間が有効ではない場合、コンテナーまでの階層になります。
1つのストレージ統合（コンテナー）から複数の外部ステージを作成することも可能ですが、S3と比較するとそのケースでの用途はあまりなさそうです。
※運用、監視、セキュリティなどの観点は考慮しましょう。

### ■参照の確認
Snowflakeからの外部ステージのBLOB参照の確認方法はいくつかありますが、
代表的なものを紹介します。
　
LIST文：ストレージアカウント/コンテナーのファイルリストを出力できます。
```
LIST @<外部ステージ>;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/50669266-0fe8-5ce3-c0e2-c9d5794f0526.png)
　
外部ステージへのクエリ：外部ステージに対して直接クエリします。
```
SELECT $1,$2,…,$N -- 区切り列の分だけ調整
FROM @<外部ステージ>;
```
※ファイル形式が適合していれば、列番で参照可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/aa4e333b-f961-0408-2acf-fba01ef133b4.png)
　
ディレクトリテーブルへのクエリ：※外部ステージへの有効化設定が必要
```
SELECT * FROM 
DIRECTORY(@<外部ステージ>);
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/7349bb98-136b-b25e-3af2-9db0e5f3e958.png)

### ■エラーが出た場合
以下をご確認ください。
〇ユーザー管理のAzure
・エンタープライズアプリケーションに割り当てているロール
・Azureストレージのネットワークの設定

〇Snowflake
・外部ステージ使用権
・ファイル形式使用権

### ■テーブルを作成する。
データをロードするためには、テーブルオブジェクトが必要になります。
ファイルに合わせて、列を定義してください。
```
USE DATABASE <データベース>;
USE SCHEAMA <スキーマ>;
CREATE TABLE <テーブル>
(
<COLUMN_NAME_1> <DATA_TYPE>,
<COLUMN_NAME_2> <DATA_TYPE>,
・
・
・
<COLUMN_NAME_N> <DATA_TYPE>
)
/*他テーブルオプションなど*/
;

例）
USE DATABASE TEST_DB;
USE SCHEAMA TEST_SC;
CREATE TABLE TEST_TB
(
TARGET_YM VARCHAR(6),
ORG_CD VARCHAR(10),
ORG_NM VARCHAR(200),
AC_CD VARCHAR(10),
AC_NM VARCHAR(200),
BG_AM NUMBER(28,0),
RS_AM NUMBER(28,0),
RG_TS TIMESTAMP_NTZ
)
;

```

### ■データをロードする。
COPY INTO文でデータをロードします。
この処理には、ウェアハウスを指定してください。
```
USE ROLE <ロール名>;
USE WAREHOUSE <ウェアハウス名>;
USE DATABASE <データベース名>;
USE ROLE <スキーマ名>;

COPY INTO <テーブル名>
FROM @<外部ステージ名>
;

例）
USE ROLE SYSADMIN;
USE WAREHOUSE SYSADMIN\XS;
USE DATABASE TEST_DB;
USE ROLE TEST_SC;
COPY INTO TEST_TB
FROM @TEST_STAGE_AZ
;
```

### ■ロードの確認
正常にロードされると、ワークシートでは以下のように出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/0a6565c0-3fb2-13ac-e50a-013d4a38b931.png)

　
履歴を確認する場合、以下で確認可能です。
```
/*14日以内のCOPY INTOによるロードを確認する。*/
SELECT * FROM INFORMATION_SCHEMA.LOAD_HISTORY;
```

### ■あとがき
今回はAzureの組み合わせで作成・ロードしていきました。
AWSとのセキュリティのアーキテクチャが異なるため、多少戸惑いもありました。
どちらの方が簡単かというのは、クラウドサービスの習熟度やセキュリティの記述方式の知識によりけりなので、言及はしません。

詳細なセキュリティの調整をされるユースケースの場合、同じクラウドプロバイダでのSnowflakeとクラウドストレージの構成をいただくことをお勧めします。
　
[目次に戻る](https://qiita.com/taku_tachibana/items/408686a031b9624e981e)