適用対象:
Azure Data Factory
Azure Synapse Analytics
ヒント
企業向けのオールインワン分析ソリューション、Microsoft Fabric の Data Factory をお試しください。 Microsoft Fabric は、データ移動からデータ サイエンス、リアルタイム分析、ビジネス インテリジェンス、レポートまで、あらゆるものをカバーしています。 無料で新しい試用版を開始する方法について説明します。
データ フローは、Azure Data Factory パイプラインと Azure Synapse Analytics パイプラインの両方で使用できます。 この記事は、マッピング データ フローに適用されます。 変換を初めて使用する場合は、入門記事「 マッピング データ フローを使用したデータの変換」を参照してください。
フラット化変換を使用して、JSON などの階層構造内の配列値を取得し、それらを個々の行にアンロールします。 このプロセスは非正規化と呼ばれるものです。
構成
フラット化変換には、次の構成設定が含まれます。
展開する
アンロールする配列を選択します。 出力データでは、配列の各項目が 1 つの行になります。 入力行のアンロール配列が null または空の場合は、アンロールされた値が null の出力行が 1 つ存在します。 フラット化変換ごとに複数の配列を展開するオプションがあります。 1 つのフラット化変換に複数の配列を含めるには、プラス (+) ボタンをクリックします。 ここでは、ADF データ フロー メタ関数 (name と type を含む) を使用できます。また、パターン マッチングを使用して、これらの条件に一致する配列の登録を解除することもできます。 1 つのフラット化変換に複数の配列を含めると、結果は可能なすべての配列値のデカルト積になります。
ルートのアンロール
既定では、フラット化変換によって、配列はそれが存在する階層の最上位にアンロールされます。 必要に応じて、アンロール ルートとして配列を選択できます。 アンロール ルートは、アンロール配列であるか、またはアンロール配列を含む複合オブジェクトの配列である必要があります。 アンロール ルートを選択した場合、出力データには、アンロール ルート内の項目ごとに少なくとも 1 行が含まれます。 入力行の項目がアンロール ルートにない場合、その入力行は出力データから削除されます。 アンロール ルートを選択したときの出力行数は、常に、既定の動作の行数以下となります。
マッピングのフラット化
選択変換と同様に、入力フィールドと正規化されていない配列から新しい構造のプロジェクションを選択します。 正規化されていない配列がマップされている場合、出力列は配列と同じデータ型になります。 アンロール配列が、サブ配列を含む複合オブジェクトの配列である場合、そのサブ配列の項目をマッピングすると、配列が出力されます。
マッピングの出力を確認するには、検査タブとデータのプレビューを参照してください。
ルールベースのマッピング
フラット化変換では、ルールベースのマッピングがサポートされており、ルールに基づいて配列をフラット化し、階層レベルに基づいて構造体をフラット化する、動的で柔軟な変換を作成できます。
Matching condition (一致条件)
完全一致やパターンを使用してフラット化したい列に対するパターンマッチング条件を入力してください。 例: like(name,'cust%')
Deep column traversal (ディープ列トラバーサル)
複合オブジェクト全体を列として処理するのではなく、複合オブジェクトのすべてのサブ列を個別に処理するようサービスに指示するオプションの設定。
階層レベル
展開する階層のレベルを選択します。
名前のマッチ (正規表現)
必要に応じて、上の一致条件を使用する代わりに、このボックスで名前を正規表現として表現することを選択できます。
例
フラット化変換の以下の例については、次の JSON オブジェクトを参照してください
{
"name":"MSFT","location":"Redmond", "satellites": ["Bay Area", "Shanghai"],
"goods": {
"trade":true, "customers":["government", "distributer", "retail"],
"orders":[
{"orderId":1,"orderTotal":123.34,"shipped":{"orderItems":[{"itemName":"Laptop","itemQty":20},{"itemName":"Charger","itemQty":2}]}},
{"orderId":2,"orderTotal":323.34,"shipped":{"orderItems":[{"itemName":"Mice","itemQty":2},{"itemName":"Keyboard","itemQty":1}]}}
]}}
{"name":"Company1","location":"Seattle", "satellites": ["New York"],
"goods":{"trade":false, "customers":["store1", "store2"],
"orders":[
{"orderId":4,"orderTotal":123.34,"shipped":{"orderItems":[{"itemName":"Laptop","itemQty":20},{"itemName":"Charger","itemQty":3}]}},
{"orderId":5,"orderTotal":343.24,"shipped":{"orderItems":[{"itemName":"Chair","itemQty":4},{"itemName":"Lamp","itemQty":2}]}}
]}}
{"name": "Company2", "location": "Bellevue",
"goods": {"trade": true, "customers":["Bank"], "orders": [{"orderId": 4, "orderTotal": 123.34}]}}
{"name": "Company3", "location": "Kirkland"}
文字列配列に関連するアンロールルートが存在しない
| 展開する | ルートのアンロール | プロジェクション |
|---|---|---|
| 商品.顧客 | なし | 名前 customer = goods.customer |
出力
{ 'MSFT', 'government'}
{ 'MSFT', 'distributer'}
{ 'MSFT', 'retail'}
{ 'Company1', 'store'}
{ 'Company1', 'store2'}
{ 'Company2', 'Bank'}
{ 'Company3', null}
複雑な配列を含む展開ルートはありません
| 展開する | ルートのアンロール | 投影 |
|---|---|---|
| 商品.注文.配送済み.注文アイテム | なし | 名前 orderId = goods.orders.orderId itemName = goods.orders.shipped.orderItems.itemName itemQty = goods.orders.shipped.orderItems.itemQty 場所 = 場所 |
出力
{ 'MSFT', 1, 'Laptop', 20, 'Redmond'}
{ 'MSFT', 1, 'Charger', 2, 'Redmond'}
{ 'MSFT', 2, 'Mice', 2, 'Redmond'}
{ 'MSFT', 2, 'Keyboard', 1, 'Redmond'}
{ 'Company1', 4, 'Laptop', 20, 'Seattle'}
{ 'Company1', 4, 'Charger', 3, 'Seattle'}
{ 'Company1', 5, 'Chair', 4, 'Seattle'}
{ 'Company1', 5, 'Lamp', 2, 'Seattle'}
{ 'Company2', 4, null, null, 'Bellevue'}
{ 'Company3', null, null, null, 'Kirkland'}
アンロール配列の基盤と同じ
| 展開する | ルートのアンロール | 投影 |
|---|---|---|
| 商品.注文 | 商品.注文 | 名前 商品.注文.発送済み.注文アイテム.アイテム名 goods.customers 位置 |
出力
{ 'MSFT', ['Laptop','Charger'], ['government','distributer','retail'], 'Redmond'}
{ 'MSFT', ['Mice', 'Keyboard'], ['government','distributer','retail'], 'Redmond'}
{ 'Company1', ['Laptop','Charger'], ['store', 'store2'], 'Seattle'}
{ 'Company1', ['Chair', 'Lamp'], ['store', 'store2'], 'Seattle'}
{ 'Company2', null, ['Bank'], 'Bellevue'}
複合配列を含むアンロール ルート
| 展開する | ルートのアンロール | 予測 |
|---|---|---|
| 商品.注文.発送済み.注文項目 | 商品.注文 | 名前 orderId = goods.orders.orderId itemName = goods.orders.shipped.orderItems.itemName itemQty = goods.orders.shipped.orderItems.itemQty location = ロケーション |
出力
{ 'MSFT', 1, 'Laptop', 20, 'Redmond'}
{ 'MSFT', 1, 'Charger', 2, 'Redmond'}
{ 'MSFT', 2, 'Mice', 2, 'Redmond'}
{ 'MSFT', 2, 'Keyboard', 1, 'Redmond'}
{ 'Company1', 4, 'Laptop', 20, 'Seattle'}
{ 'Company1', 4, 'Charger', 3, 'Seattle'}
{ 'Company1', 5, 'Chair', 4, 'Seattle'}
{ 'Company1', 5, 'Lamp', 2, 'Seattle'}
{ 'Company2', 4, null, null, 'Bellevue'}
データ フローのスクリプト
構文
<incomingStream>
foldDown(unroll(<unroll cols>),
mapColumn(
name,
each(<array>(type == '<arrayDataType>')),
each(<array>, match(true())),
location
)) ~> <transformationName>
例
source foldDown(unroll(goods.orders.shipped.orderItems, goods.orders),
mapColumn(
name,
orderId = goods.orders.orderId,
itemName = goods.orders.shipped.orderItems.itemName,
itemQty = goods.orders.shipped.orderItems.itemQty,
location = location
),
skipDuplicateMapInputs: false,
skipDuplicateMapOutputs: false)