「S3 + Athena」 で実行していたことを 「BLOB + Azure Data Explorer」 で実現してみました

# STEP-1 ： Azure Data Explorer クラスターとデータベースを作成する

## 概要
AWSの「S3 + Athena」 で実行できること、つまり、S3に保存されているJSON形式等のデータ（以下、JSONデータ）を Athenaで提供されているSQLライクな構文を用いてクエリ実行することによりデータ抽出が可能となっています。同様なことをAzure上の「BLOB + Azure Data Explorer」構成においても可能であることを確認しました。なお、「Web UI」と「Pythonプログラム」の両方で実現しております。

Azure Data Explorer は、ログや利用統計情報データ等のための高速で拡張性に優れたデータ探索サービスです。 
Azure Data Explorer を使用するには、最初にクラスターを作成し、そのクラスター内に 1 つまたは複数のデータベースを作成します。 
その後、クエリを実行できるように、JSONデータ等をデータベースに取り込み (読み込み) ます。

以下の３つのステップで順次説明します。今回は STEP-1 についてとなります。
STEP-1 ： Azure Data Explorer クラスターとデータベースを作成する
STEP-2 ： Azure Data Explorer の Web UI でデータベースへのクエリを実行する
STEP-3 ： Azure Data Explorer の Python ライブラリを使用してデータベースへのクエリを実行する

## ローカル環境
macOS Big Sur 11.1 
python 3.8.3
Microsoft Edge 89.0.774.63（Safariでは Azure Data Explorer がうまく動きませんでした）

## ローカル上での事前準備
Azure Storega Exploere が[インストール](https://azure.microsoft.com/ja-jp/features/storage-explorer/)されていること。

## Azure上での事前準備
今回は、「ストレージアカウント：storageituru」で「BLOBコンテナー：test20210226」を作成し、そこに「ADX2222_test-iot-dummy-2.json」のJSONデータを用意しました。下図は Azure Storage Explorer での確認となります。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/b42a0aee-5df3-b4f4-d21b-95e945998e65.png)|
|:-:|

そのJSONデータは[この記事](https://qiita.com/turupon/items/e16789a959fc92068c68) にある「IoTSample-write.py」で 2222件生成したものとなります。データ構成は以下となります（プログラムの一部抜粋）。

```（抜粋）IoTSample-write.py
# ダミーデータ作成のための Faker の使用
Faker = Factory.create
fake = Faker()
fake = Faker("ja_JP")

# IoT機器のダミーセクション(小文字アルファベットを定義)
section = string.ascii_uppercase

# IoT機器で送信JSONデータの作成
def iot_json_data(count, proc):
    iot_items = json.dumps({
        'items': [{
            'id': i,                            # id
            'time': generate_time(),            # データ生成時間
            'proc': proc,                       # データ生成プロセス名
            'section': random.choice(section),  # IoT機器セクション
            'iot_num': fake.zipcode(),          # IoT機器番号
            'iot_state': fake.prefecture(),     # IoT設置場所
            'vol_1': random.uniform(100, 200),  # IoT値−１
            'vol_2': random.uniform(50, 90)     # IoT値−２
            } 
            for i in range(count)
        ]
    }, ensure_ascii=False).encode('utf-8')
    return iot_items
```


## BLOBコンテナーのSAS（Shared Access Signature）の取得
Azure Data Explorer のデータベースの作成で必要となるBLOBコンテナーのSASを事前に取得しておきます。

１． Azure Storage Explorer 画面の左タブで「BLOBコンテナー：test20210226」を選択し、右クリックで、「Shared Access Signatureの取得...」を選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/826651f8-acd9-b23f-9821-ed62687f3a19.png)|
|:-:|


２．表示された「Shared Access Signature」ダイアログにおいて、「開始時刻」と「有効期限」を設定し、画面の下部にある [作成] を選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/5a6f7887-efb9-362d-fa49-d2e24eaf627a.png)|
|:-:|

 
３．表示されたダイアログには、BLOB コンテナーと共に、ストレージリソースへのアクセスに使用できる URL とクエリ文字列が表示されます。 クリップボードにコピーする URL の横にある [コピー] を選択します。この値を後ほど使用します。コピーが完了したら、画面下部の [閉じる] を選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/5534d165-e5fe-7f14-7760-3d8a2ade46e1.png)|
|:-:|

 

## Azure Data Explorer クラスターの作成
コンピューティング リソースとストレージ リソースの定義済みセットを使って、Azure リソース グループ内に Azure Data Explorer クラスターを作成します。

１．Azureポータルにサインインします。
２．ポータルの左上隅にある [+ リソースの作成] ボタンを選択します。
３．Azure Data Explorer を検索します。
４．[Azure Data Explorer] で、画面の下部にある [作成] を選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/22ee4979-58e6-8682-5a8d-4192d1986e06.png)|
|:-:|

５．次の情報を基本クラスターの詳細として入力します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/4a79b241-c2d0-6e0e-a588-1da13c87a8ca.png)|
|:-:|

 
６．[確認と作成] を選択してクラスターの詳細を確認し、 [作成] を選択してクラスターをプロビジョニングします。 プロビジョニングには 約15分 かかりました。 完了後 [リソースに移動] を選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/f7a4eaf9-d67a-6990-8a04-a890246eace8.png)|
|:-:|


## Azure Data Explorer データベースの作成
１．[概要] タブで [データベースの作成] を選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/52525540-dd63-002c-c86b-06ca72146cf7.png)|
|:-:|
 
２．フォームに次の情報を入力します。入力後、フォーム画面下部の[作成] を選択してデータベースを作成します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/492d8ec0-cb65-77a4-a171-d2c2eacf6342.png)|
|:-:|

３．作成にかかる時間は 1 分未満でした。 プロセスが完了すると、クラスターの [概要] タブに表示が戻ります。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/2ffaf9ec-bdda-da2e-61af-e871390913eb.png)|
|:-:|
 
４．[概要] タブで [新しいデータの取り込み] を選択します。「Ingest new data」フォームが表示されます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/d2adb71d-7264-d3c3-3d89-6122c38a48f0.png)|
|:-:|
 
５．そのフォームの「Table」欄には新規に作成するデータベース名を入力します。
６．そのフォームの「Source type」欄では「BLOBコンテナーから」を選択します。
７．そのフォームの「Link to source」欄には、対象となるBLOBコンテナーのSASを入力します（先述の「BLOBコンテナーのSASの取得」の「３」のURLの値）。
８．フォームの入力が完了したら、画面下部の[Edit schema] を選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/c19c4f55-375b-5101-6137-fc07be72f4ac.png)|
|:-:|
 
９．表示された画面の内容に問題なければ。画面下部の[Start ingestion] を選択します。作成にかかる時間は 1 分未満でした。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/3b3d2861-2bba-9088-8d70-452ef01b7c9a.png)|
|:-:|

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/65f8fa2c-8245-a76f-2ddd-0c2e8053cdf8.png)|
|:-:|

10．クラスターにデータベースが作成されたことを確認できます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/6738bcb0-feb6-85d6-96ba-4cc6c58a5ca8.png)|
|:-:|


## Azure Data Explorer データベースで基本コマンドを実行する
問題なくアクセス可能か確認します。

作成したクラスターで [クエリ] を選択します。「.show databases」コマンドを「クエリ ウィンドウ」に入力後、 [実行] を選択します。結果セットには、このクラスター内の唯一のデータベースである 「IoTDummyDatabase」 が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/4622eca4-0152-8f77-e791-530d7536225a.png)
 
次のステップでは、Azure Data Explorer の Web UI でデータベースへのクエリを実行してみます。


## 本課題のシリーズ情報
３つのステップ
[STEP-1．Azure Data Explorer クラスターとデータベースを作成する](https://qiita.com/turupon/items/ce4be135cb5d1f7f86b4)
[STEP-2．Azure Data Explorer の Web UI でデータベースへのクエリを実行する](https://qiita.com/turupon/items/b2886387832d4826afbf)
[STEP-3．Azure Data Explorer の Python ライブラリを使用してデータベースへのクエリを実行する](https://qiita.com/turupon/items/6739b03ee80d9d5e2ae0)