Azure Synapse Analytics を触ってみた


はじめに

昨年のアドベントカレンダーに引き続き、データエンジニアリング関連のことを書きたいと思います。

ある日、その辺りの知識に乏しい私は思ったわけです。
そもそもデータってどう蓄積してどう活用するものなのか?
そのためにはどんな環境を用意してどんな仕組みを使えばいいのか?

ということで調べていて目に留まったのが Azure Synapse Analytics です。

Azure Synapse Analytics ってサービス名を聞いても「..しなぷす...?は?」ってなりますよね。

公式docだと
“データウェアハウスとビッグ データ システム全体にわたって分析情報を取得する時間を早めるエンタープライズ分析サービス”
だそうです。あーはいはい、ウエハースとビッグマック的な感じね。

要するに、触ってみろってことですね (脳筋)

この流れでやってみたに突入するとアレなのでこの辺りの用語の確認を。

  • データウェアハウス : データを保管する倉庫、構造化されたデータを扱う
  • ビッグデータ : データそのもの、様々な形をした様々な性格を持った様々な種類のデータ

なんとなくイメージ掴めましたかね。
データウェアハウスは構造化データを扱う、リレーショナルデータベースの一種ですが、
データ分析利用に特化しており、時系列でデータを蓄積していき削除・更新をしないという特徴を持ちます。

また、ビッグデータを扱う上で「データレイク」というワードも出てきますので対比的にこちらも確認します。

  • データレイク : ソースから元のままの多様な形式で保管するリポジトリ

データレイクはデータを保管する場所という意味ではデータウェアハウスと一緒ですが、
扱うデータは構造化データ以外に半構造化データ、非構造化データも扱うことができます。

と、用語の確認はこれくらいにして Azure Synapse Analytics 触っていきましょう。


Synapse ワークスペース の作成

Azure Portalにログインし、[ すべてのサービス ] > [ 分析 ] から "Azure Syapse Analytics" を選びます。
(見つかりにくい場合は検索ボックスまたはフィルターで "synapse" とか入れるとすぐサジェストされて出てきます)

[ +作成 ] (もしくは中央の [ Synapse ワークスペース の作成 ] ) を押します。


リソースグループ、リージョン、ワークスペース名、Azure Data Lake Storage アカウント などを指定して作成します。
今回 Azure Data Lake Storage アカウントは新規で作成、セキュリティやネットワークについてのパラメーターはデフォルトのままとしています。


程なくしてワークスペースが作成されました。



データのアップロード

Azure Synapse Analytics には Synapse Studioという統合インターフェースが用意されています。
データのアップロードもそちらでやっていきますので、作成したワークスペースのページから開きます。


左側の [ Data ] (円柱のアイコン) をクリックします。
[ Linked ] を選択し [ Azure Data Lake Storage Gen2 ] > を展開するとワークスペース名でコンテナが作成されていることが確認できます。
その配下にワークスペース作成の際に "ファイル システム名" で指定した名前のコンテナ (今回は users で作成) が見えるので、そこにファイルをアップロードします。


手始めに Parquet 形式のサンプルデータをアップロードしてみました。
Parquet って聞いたことない人も多いかと思いますが、大規模データ処理に最適化された列指向のフォーマットだそうです。
なおバイナリなので通常のテキストエディタでは内容を読むことはできません。
(Parquetについて詳しく知りたい方はこちらの紹介が分かり易いです)


お試しでアップロードしたparqetファイルの中身をSQLを発行し参照したいと思います。
とその前に、参照するための実行リソースについてですが、組み込みのサーバーレス SQL プールを使用します。
(参考:サーバーレス SQL プールを使用してデータを分析する)
左側の [ Develop ] (テキストのアイコンの) アイコンをクリックし [ + ] のメニューから [ SQLスクリプト ] を選択します。
以下のコードを入力し [ ▷ 実行 ] します。

SELECT
    TOP 100 *
FROM
    OPENROWSET(
        BULK 'https://069adls.dfs.core.windows.net/users/NYCTripSmall.parquet',
        FORMAT='PARQUET'
    ) AS [result]

問題なくクエリが実行され、テーブルとして結果が表示されました (画面下部) 。
ちゃんとデータとして取り出すことができました。



データの検索

他の形式のファイルもアップロードして参照してみます。
今度はログで多用されるおなじみ CSV 形式のデータで試します。
使用するサンプルデータについては、列数は4〜6列・行数はいずれも100行で作成しています。

※ここでちょっと余談
CSV のサンプルデータはMockarooで作成しています。
無料で1000行まで作成でき、フォーマットもJSONやXMLなどに対応していてとても便利!

CSV のファイルをアップロードして、Parquet ファイルの時と同様に [ SQLスクリプト ] を作成します。
"FORMAT" の指定と "HEADER_ROW" のオプション追加をしています。
これで [ ▷ 実行 ] します。

SELECT
     TOP 20 *
FROM
     OPENROWSET(
         BULK 'https://069adls.dfs.core.windows.net/users/ProductPurchaseHistory.csv',
         FORMAT = 'CSV',
         PARSER_VERSION='2.0',
         HEADER_ROW=TRUE
     ) AS [result]

こちらも期待通りに結果を表示してくれました。


ここまででふと疑問に感じている方もいるかと思いますが、
SQLで参照しているのはただの CSV ファイルなのに、クエリにはヘッダ行やデータ型の指定ありません。

実はここで使用している "OPENROWSET" 関数にスキーマの自動検出機能が備わっているおかげで、
いい感じにデータ型も推論してくれているのです。
(参考:Azure Synapse Analytics でサーバーレス SQL プールを使う際の OPENROWSET の使用方法)
(数年前までは "WITH" 句でデータ型を明示的に指定する必要があったのがアップデートで機能追加されたんだとか)

またもう一つ特徴的なのが、 Azure Data Lake Storage Gen2 は階層型名前空間がサポートされていて、
馴染みある「フォルダとファイル」の考え方にかなり近いものになっています。
この特徴を利用して、
例えばあるフォルダを指定して配下に蓄積された複数のファイルを検索するといったことが可能なのです。

それでは今度は同じスキーマ構成を持つ CSV ファイルを2つアップロードしますが、
予め作成しておいた "dir1" "dir2" というフォルダにそれぞれを格納します。



(CSV の中身はこんな感じ)
id,first_name,last_name,company,age
1,Zeb,Cromblehome,Stiedemann-Bauch,73
2,Cassaundra,Bountiff,"Jenkins, Lang and Gorczany",22
3,Friedrick,Lamas,Barrows-Trantow,71
4,Abbie,Foulds,Ondricka Inc,47
5,Dierdre,Mcsarry,"Blanda, Metz and Jast",41
6,Demetrius,Gilli,Hyatt Group,63
7,Kristien,Raubenheimer,"Weimann, Cormier and Bechtelar",48
8,Gabriell,Russam,Stiedemann-Berge,85
9,Lia,Canceller,"Windler, Powlowski and Weissnat",61
10,Ozzie,Yter,Smitham and Sons,32
11,Cherice,Greenin,Lemke LLC,35
12,Gearard,Ryott,Johnson LLC,74
.
.

これからそれらファイルを横断的に検索してみます。
検索条件も「年齢が10代と20代をそれぞれカウント」するようにSQLを作成します。

(SQL)
SELECT
    CASE
      WHEN age BETWEEN 10 AND 19 THEN '10s'
      WHEN age BETWEEN 20 AND 29 THEN '20s'
      ELSE NULL
    END AS Generation,
    COUNT(*) AS "Count"
FROM
     OPENROWSET(
         BULK 'https://069adls.dfs.core.windows.net/users/*/*.csv',
         FORMAT = 'CSV',
         PARSER_VERSION='2.0',
         HEADER_ROW=TRUE
     ) AS [result]
GROUP BY
    CASE
      WHEN age BETWEEN 10 AND 19 THEN '10s'
      WHEN age BETWEEN 20 AND 29 THEN '20s'
      ELSE NULL
    END

これで実行すると、ちゃんと2つのファイルを横断的に検索して、
且つ検索条件も満たした結果が返ってきました。



まとめ

Azure Synapse Analytics のワークスペース作成からファイルベースのデータ検索までを試してみました。
「分析」というところまではいきませんでしたが、どのように使うべきかは何となくわかった気がします。

  • Parquet は大規模データ処理向きの列指向フォーマット、バイナリ
  • Azure Data Lake Storage は階層型名前空間をサポート
  • Synapse Studio は統合的で使いやすいインターフェース

あ、昨年の Cosmos DB ネタのまとめで
「今後はSynaps Analyticsといった分析系サービスへの連携も試してみたい思います。」
と適当なこと抜かしてまんまとやらなかったので次はやってみたいと思います (気が向いたら) 。

それでは今回はこの辺で。

コメント

このブログの人気の投稿

ProxmoxでLet's Encryptを使用した証明書セットアップをやってみた

AIと共に「考える」エンジニアに!

ルーティングって何で必要で、何してるの?を React Routerで理解する