HULFT Squareを使用してSnowflakeにデータをロードしてみた(Snowpipe編）

# はじめに

こんにちは、すぎもんです:smile:

企業内に点在する大量のデータを集約・蓄積し、データの統合と分析を可能にするため、データウェアハウス（DWH）の必要性が高まっています。
DWHを活用すれば、必要なデータを統合して分析を行えるため、業務の効率化に繋げられます。

# Snowflakeとは
Snowflake はクラウド上に展開で実行されるDWHです。
Amazon Web Services、Microsoft Azure、Google Cloud Storage といったクラウドサービスで使用の基盤上に構築できます。

データレイクとして想定するAWS S3等クラウドサービスのストレージにあるファイルをロード(読み込み)、およびアンロード(書き出し)を行うことができます。

# Snowpipeとは
SnowpipeはSnowflakeの継続的なデータロードの仕組みです。COPYコマンドを利用した一括ロードとは異なり、外部ステージに置かれたファイルを自動的、継続的にロードすることができます。

# 今回やること
HULFT Squareを利用してAWS S3へファイル送信し、Snowpipeを用いて自動的にS3→Snowflakeへデータがロードされる確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/4bfad27b-b4db-ca19-cf22-8939e9f18eaf.png)
①HULFT Squareのスクリプトにより、ファイルをS3上に転送します。
②S3バケットのイベント通知機能によりファイルの存在が通知され、通知後SnowflakeからCOPYコマンドが自動実行されます。




# 実行環境準備

ここからは下記のイメージ図に従って、SnouwflakeとAWSの設定を進めていきます。

## Snowpipeの処理とデータの流れ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/0fe3e8a4-0166-7e44-46cf-121d4e883246.png)


:::note info
AWS　S3に置かれたファイルをSnowpipeでロードするためには外部ステージ設定が必要です。
外部ステージの設定方法については以前に記述した下記記事をご参照下さい。
[HULFT Squareを使用してSnowflakeにデータをロードしてみた](https://qiita.com/sugimon/items/92d29ab67f21126d947e)
今回の検証では上記ブログで作成した外部ステージ **「HSQ_EXT_STAGE」** を使用します。
:::


## 1.Snowflake側設定
まずはSnowpipeを作成していきます。

### 1-1.「外部ステージ」名の確認
SnowflakeのWebコンソールSnowsightで以下のSQLを実行して、Snowpipeで指定する「外部ステージ」の名称を確認します。

```
select stage_schema,
       stage_name,
       stage_url,
       stage_type
  from TEST.information_schema.stages;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/5eb34e7d-a99d-572d-00c1-a2a6d30c950b.png)

:::note info
確認した外部ステージ名は「1-2.Snowpipe作成」で使用します。
:::

### 1-2.Snowpipe作成
以下のSQLを実行して、Snowpipeを作成します。

```
create pipe <作成するSnowpipe名称> auto_ingest=true as
  copy into <ロード先となるテーブル>
  from @<外部ステージ名>;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/00594567-2a32-f753-a3f8-9658cff53d17.png)

### 1-3.SQS情報の取得

S3バケットのイベント通知の設定に必要なSQSのarnレコードを下記  **show pipes**  コマンドで取得します。

```
show pipes;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/1da15c1c-865d-ec3c-89fd-67f601d863f3.png)

:::note info
取得したarnレコードは「2-2.イベント通知作成」で使用します。
:::

## 2.AWS S3設定
AWS S3がファイル受信した際にSnowflake側へデータを自動的に連携するための設定をしていきます。

### 2-1.S3 URLを取得
AWSのS3コンソールを開き、「外部ステージ」の参照先フォルダのS3 URIを取得します。

:::note info
以下の赤字のプレフィックスレコードのみを「2-2.イベント通知作成」で使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/7f397103-12ee-9946-e81f-58520412f137.png)
:::

### 2-2.イベント通知作成
S3バケットへイベント通知を作成します。「プロパティ」を開き、「イベント通知」を作成していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/f1726cb9-a819-6cf2-2f9e-78d1ac8fb603.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/13215f25-8828-c3e2-a291-d7c5196fbda5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/46ccbfb1-40fd-bfcd-382e-f8a469725486.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/4e65e546-e152-886f-9a98-947402a9803e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/d0050bbb-5a8c-532d-e597-cc8dbac5af7a.png)


# 検証手順

## 1.実行前準備

### 1-1.実行前テーブル確認
書き込み対象テーブルの定義は下記の通りです
```
create or replace TABLE TEST.PUBLIC.CUSTOMER_SP (
	C_CUSTKEY NUMBER(38,0),
	C_NAME VARCHAR(25),
	C_ADDRESS VARCHAR(40),
	C_NATIONKEY NUMBER(3,0),
	C_PHONE VARCHAR(18),
	C_ACCTBAL NUMBER(6,2),
	C_MKTSEGMENT VARCHAR(25),
	C_COMMENT VARCHAR(400)
);
```

### 1-2.読み込みファイル配置

HULFT Squareのストレージ上に **「data_0_0_0.csv」** を用意しました。 

::: note info
**[配置ディレクトリ]** 「Personal/demo/Snowpipe」
**[レコード数]**　30000
**[データサイズ]**　4.64 MB	
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ccc94162-a62b-b7e6-3e45-c212bacca8b7.png)


### 1-3.AWSコネクション準備
HULFT SquareからAWS s3へ接続用のコネクションを用意します。

今回は作成済みの下記コネクションを使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/b0e3dafc-8897-7d89-9581-88e0376a4483.png)


:::note info
今回の検証ではHULFT SquareからSnowflakeへの接続設定は必要ありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/97746158-3ab4-6c41-8c6f-d26c6b15d5f6.png)
:::

## 2.検証実施
### 2-1.スクリプト作成

:::note info
HULFT Squareのプロジェクトは下記ブログで作成したものを使用します。
[HULFT Squareを使用してSnowflakeにデータをロードしてみた](https://qiita.com/sugimon/items/92d29ab67f21126d947e)
**[プロジェクト]**　`Snowflakeload`
:::


**[スクリプト名]**　任意の名前、今回は`Snowpipe連携`を入力して作成していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/f0c543aa-3fd0-5c3a-599b-30614f1a8569.png)


**[ツールパレット]**　より　**[クラウド＞Amazon S3＞ファイル/フォルダ書き込み]**　アイコンを選択しドラッグ＆ドロップしてスクリプトキャンバスへ配置します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/379e161b-a71b-162e-e514-9cdc8f1998f5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/d41b44ac-2047-0d20-e7d2-d40081f8088b.png)

**[名前]**　任意の名前、今回は`Snowpipe連携`を入力
**[接続先]**　今回は用意した`Amazon S3接続`コネクションを選択
**[ローカルディレクトリ]**　1-2.読み込みファイル配置でファイルを格納したフォルダ`Personal/demo/`
**[ローカルファイル/ディレクトリ名]**　1-2.読み込みファイル配置でファイルを格納したフォルダ`Snowpipe`
**[バケット名]**　 Snouwflake「外部ステージ」の参照先S3バケット名称　今回は `hsq-snowflaketest`
**[フォルダパス]**　連携先S3バケット配下のフォルダ名　今回は `/data`

:::note warn
同一ファイル名での連続的な連携が想定される場合は　**[ファイルが存在する場合は上書きする]**　にチェックが必要です。
:::


下記のように　**[start]**　から　**[END]**　までドラッグ＆ドロップでプロセスフローの矢印を繋ぐとAWS S3へのファイルアップロード用スクリプトの完成です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/d9606ae3-1ae7-e78d-bbf4-59774f824d7c.png)


 ### 2-2.検証結果確認
HULFT Squareデザイナ画面からスクリプトを実行すると正常終了が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/71f2ed65-3ec4-8ccc-4fe2-f1229deb6c81.png)

 
また、SnowsightからもHSQパイプで正常にデータがロードできたことが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/d90f95f8-21ed-3aba-4482-8fdc59ebf3d9.png)

# おわりに
いかがだったでしょうか。
HULFT Squareを利用してAWS S3へファイル送信し、Snowpipeを用いてSnowflakeへのデータロードを実施できることが確認できました。

HULFT SquareはHULFTと連携してのファイル受信が可能なため、オンプレミス環境からHULFTにて集信したファイルをHULFT SquareのETL機能でSnowflakeのテーブルに合わせた形へ加工した後に、Snowpipeで自動的にデータロードするという処理も実現可能です。

当ブログが下記ブログと合わせて、SnowflakeとHULFT Squareとの連携構築の一助にもなれば幸いです。

[HULFT Squareを使用してSnowflakeにデータをロードしてみた](https://qiita.com/sugimon/items/92d29ab67f21126d947e)

ここまで読んでいただきありがとうございました。それでは、また！