Azure Synapse Analytics のラングリングデータフローでデータ変換を行う

# はじめに

Azure Data Factory の GUI ベースのデータフローには「マッピングデータフロー」と「ラングリングデータフロー」という大きく 2 つの機能があります。両者の詳細な違いは割愛しますが、ラングリングデータフローは Power Query Online をベースとしており直感的にデータ操作が定義できるという特徴を持っています。

Azure Synapse Analytics においてはこれまでマッピングデータフローのみが提供されており、Microsoft Docs の記載もそのようになっているのですが、2020 年 10 月時点で Synapse Studio からラングリングデータフローが定義・実行できるようになっていたため、一通り試してみた結果をご紹介します。

## データ紹介、事前準備

機能を試すにあたり、2 つの CSV ファイルを用意しました。一つは生徒情報を記したもの(student.csv)、もう一つが生徒の試験結果(score.csv)を記したものです。両データをラングリングデータフローで加工することで、生徒ごとの成績や順位付けを行ってみます。

```student.csv
ID,Name,Grade,Birthday
1,Suzuki,2,2003/2/24
2,Tanaka,1,2004/5/16
3,Sato,2,2003/4/15
4,Yamada,3,2002/6/20
5,Kato,3,2002/10/1
6,Nakamura,2,2003/8/28
7,Miura,1,2004/12/3
```

```score.csv
Subject,ID,Score
English,1,42
English,2,22
English,3,73
English,4,52
English,5,54
English,6,57
English,7,13
Chemistry,1,48
Chemistry,2,60
Chemistry,3,21
Chemistry,4,64
Chemistry,5,26
Chemistry,6,58
Chemistry,7,56
Mathematics,1,75
Mathematics,2,40
Mathematics,3,74
Mathematics,4,57
Mathematics,5,98
Mathematics,6,84
Mathematics,7,25
```

2 つの CSV ファイルは ADLS Gen2 に格納しておき、後続の手順で Synapse Studio からデータソースとして定義できるようにしておきます。
![20201015_synapse_dataflow_01_gen2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/8c6d4808-8e86-c128-bab9-809f6718fa47.jpeg)

## データフローの作成

Synapse Studio の Integrate タブ(旧 Orchestrate タブ)から新しいパイプラインを作成し、Activities で Data flow をドラッグすると 2 種類の選択肢が表示されますので、下部の「Wrngling Data Flow (Preview)」を選択します。
![20201015_synapse_dataflow_02_dataflowJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/7b34fdd4-3c38-12a5-1a7e-c75301bd1d60.jpeg)

Source と Sink のデータセットをそれぞれ定義します。必須なのは Source 側のみですが、Sink が無いと Publish する際にエラーになるので同時に定義しておいたほうが効率的かと思います。
![20201015_synapse_dataflow_03_dataflowJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/a20c552d-e9b0-38cb-619f-e59b13ca1c8a.jpeg)

データセットは新規に作ることも既存のものを使うこともできます。今回は、あらかじめ作成したおいたものを作っていますが、作成・定義に当たりいくつか制約がありエラーも出たため、気が付いたことを記します。

- Sink のデータセットとして定義できるのは ADLS Gen2 上の CSV ファイルのみ
- ADLS Gen2 への認証方式は「Account Key」か「Serivce Principal」のいずれかのみが対応

データセットの定義後、画面上にマッシュアップ エディターが表示されていれば OK です。
![20201015_synapse_dataflow_04_dataflowJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/1f3cd80e-6241-f6fe-4a56-246ffcbc23e1.jpeg)

## 使ってみる

必要な準備が整いましたので、ラングリングデータフローによるデータ変換を実施してみます。本稿執筆時点ではデータ変換で使用できるのは、Power Query M 関数の中の一部関数のみとなります。

[ラングリング データ フローの変換関数](https://docs.microsoft.com/ja-jp/azure/data-factory/wrangling-data-flow-functions)

上記に記載されている関数を、マッシュアップエディターを使って画面上で試してみます。

### 列の管理

ヘッダーをダブルクリックすることで、列名を変更できます。Name 列を StudentName 列に変更しました。
![20201015_synapse_dataflow_05_queryJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/8ea8ea08-5994-2e55-df12-344570111ec1.jpeg)

### 行のフィルタリング

ヘッダーの「▼」から「Text filters」-「Begins with」と辿り、戦闘が S で始まる生徒名のみを抽出しました。
![20201015_synapse_dataflow_06_queryJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/de07cf2a-7c34-3d75-bfdd-d58b641fb58a.jpeg)
![20201015_synapse_dataflow_07_queryJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/c085eb73-8f66-c060-514d-3e5cf744c630.jpeg)

### 列の追加と変換

StudentName 列を選択した状態で Transform タブの「Add column」-「losercase」をクリックし生徒名が小文字に変換された列を追加しました。
![20201015_synapse_dataflow_08_queryJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/66d4750e-fa79-1fa1-630c-2ce3266774c4.jpeg)
![20201015_synapse_dataflow_09_queryJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/137ba064-6481-7096-aa4f-277c9807ad84.jpeg)

### テーブルのマージ/結合

本作業の前に、ここまでの変換処理を一度リセットします。エディター右の「Applied steps」で「×」を押すことで各処理をリセットできますので、初期状態まで戻します。
![20201015_synapse_dataflow_10_queryJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/2efc9b60-7552-2fb8-d2a6-78f0d6d82f43.jpeg)

初期状態まで戻った後に「Merge queries」をクリックします。結合するテーブルとして「csvScore」を選択し、**結合用のキーとして ID 列を選択しておきます**。Join は何でも良いですが、今回は「Inner」を選択しておきます。
![20201015_synapse_dataflow_11_queryJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/ddf262d1-71b1-f2d3-c152-517c85da6f47.jpeg)

csvScore 列が Table 形式で追加されていれば Join 成功です。ドキュメントには書かれていますが、結合直後はテーブルが入れ子の状態となっているため、ここから手動で列を展開します。
![20201015_synapse_dataflow_12_queryJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/a8f07ad5-75df-a7ec-c3ad-9520b002ef04.jpeg)

列ヘッダーのボタンをクリックし、結合キーである ID 列のチェックを外すと、その他の列が展開されます。
![20201015_synapse_dataflow_13_queryJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/e5e25f3b-4e5d-e600-fa8e-f6e873b56be5.jpeg)

結合結果として、生徒 7 名の試験 3 科目のスコア合計 21 件のデータが取得できていることが確認できました。
![20201015_synapse_dataflow_14_queryJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/2f2e75d7-6071-3642-5ad1-2650383930e5.jpeg)

### グループ化

結合結果から、各生徒の 3 科目平均点を算出してみます。前準備として計算する列を数値データに変換するため、csvScore.Score 列を右クリックし「Change type」-「Whole number」をクリックして変換処理を行っておきます。
![20201015_synapse_dataflow_15_queryJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/a4f174e4-526b-b3a1-7193-fed1fcd211e3.jpeg)

エディターで「Group by」をクリックし、ID 列で集計し csvScore.Score 列の Average を算出します。
![20201015_synapse_dataflow_16_queryJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/fc101f35-d16b-1d1a-bbf1-0005fbeeee62.jpeg)

各生徒の 3 科目平均点を算出されたことが確認できました。
![20201015_synapse_dataflow_17_queryJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/da742b1f-9279-4dde-a394-4dc171d28c5a.jpeg)

### 並べ替え

集計列を選択した状態でタブの「Sort」をクリックすることで、平均点の高い生徒の降順に並べ替えました。
![20201015_synapse_dataflow_18_queryJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/91d19bbb-73ba-b4b4-a730-40b6c8f01dff.jpeg)

### 行の削減

タブの「Keep rows」-「Keep top rows」をクリックし 3 を入力することで、上位 3 行を除く下位の行を削除しました。
![20201015_synapse_dataflow_19_queryJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/7770eb43-a4ca-d1a7-0737-abc363687a1d.jpeg)
![20201015_synapse_dataflow_20_queryJPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/95731f69-84e0-db3f-6a2d-f87e54eef362.jpeg)

## ジョブの実行

ここまででドキュメントに記載されている変換関数を一通り試しました。変換結果についてはマッピングデータフローと同様に Pipeline 画面で実行し、Monitor ハブで結果を確認することができます。
![20201015_synapse_dataflow_21_pipeline.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/f2639778-8f6b-14a2-d55b-d484c4d49f39.jpeg)
![20201015_synapse_dataflow_22_pipeline.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/af08539f-71f7-2f22-7062-ea3ff8c1d37d.jpeg)

なお、前述の通り現在ラングリングデータフローで利用できる Power Query M 関数は一部のみです。マッシュアップエディター上で変換ができているように見えていても、Pipeline 実行時にエラーとなるケースなどもあるため、利用時にはやりたい変換処理が対応しているかドキュメントをよく読み、こまめにデバッグされることをオススメします。

## まとめと所感

Azure Synapse Analytics の ラングリングデータフローを使ったデータ変換をご紹介しました。機能面でマッピングデータフローと類似する点も多くどちらを選択するか悩むケースもあるかもしれませんが、ラングリングデータフローの強みはやはり**Power Query Online と統合されたマッシュアップエディターを有している**という点にあるかと思います。これはつまり、

- 変換処理の大半をノンコーディングで直感的に行える
- Power Platform 経験者は Power Query Online の知識を再利用できる

という恩恵を受けられることを意味し、非常に強力な機能であるといえます。 Power Query M 関数の対応はまだこれからですが、現状でも十分な使い勝手を有していますので、ご興味ある方はぜひお試しいただければと思います。

## 参考リンク

[ラングリング データ フローとは](https://docs.microsoft.com/ja-jp/azure/data-factory/wrangling-data-flow-overview)
[ラングリング データ フローを使用してデータを準備する](https://docs.microsoft.com/ja-jp/azure/data-factory/wrangling-data-flow-tutorial)