適用対象:
Azure Data Factory
Azure Synapse Analytics
ヒント
Data Factory in Microsoft Fabric は、よりシンプルなアーキテクチャ、組み込みの AI、および新機能を備えた次世代のAzure Data Factoryです。 データ統合を初めて使用する場合は、Fabric Data Factory から始めます。 既存の ADF ワークロードをFabricにアップグレードして、データ サイエンス、リアルタイム分析、レポートの新機能にアクセスできます。
データ フローは、Azure Data Factory パイプラインとAzure Synapse Analytics パイプラインの両方で使用できます。 この記事は、マッピング データ フローに適用されます。 変換を初めて使用する場合は、入門記事「 マッピング データ フローを使用したデータの変換」を参照してください。
ヒント
Dataflow Gen2 の同等の変換 (列の展開) については、データ フロー ユーザーのマッピングに関する Dataflow Gen2 のガイドを参照してください。
フラット化変換を使用して、JSON などの階層構造内の配列値を取得し、それらを個々の行にアンロールします。 このプロセスは非正規化と呼ばれるものです。
構成
フラット化変換には、次の構成設定が含まれます。
アンロール
アンロールする配列を選択します。 出力データは、各配列の項目ごとに 1 行です。 入力行の配列によるアンロールが null または空の場合、未登録の値が null の出力行が 1 つ存在します。 フラット化変換ごとに複数の配列の登録を解除できます。 1 つのフラット化変換に複数の配列を含めるには、プラス (+) ボタンを選択します。 ここでは、ADF データ フロー メタ関数 (name と type を含む) を使用できます。また、パターン マッチングを使用して、これらの条件に一致する配列の登録を解除することもできます。 単一のフラット化変換に複数の配列を含める場合、結果は可能なすべての配列値のデカルト積になります。
ルートのアンロール
既定では、フラット化変換によって、配列はそれが存在する階層の最上位にアンロールされます。 必要に応じて、アンロール ルートとして配列を選択できます。 アンロール ルートは、アンロール配列である、またはアンロール配列を含む、複合オブジェクトの配列である必要があります。 登録解除ルートが選択されている場合、出力データには、登録解除ルート内の項目ごとに少なくとも 1 つの行が含まれます。 入力行に展開ルートでの項目がない場合、出力データから削除されます。 アンロール ルートを選択すると、常に既定の動作より少ないか等しい行数が出力されます。
マッピングのフラット化
選択変換と同様に、入力フィールドと正規化されていない配列から新しい構造のプロジェクションを選択します。 非正規化配列がマップされている場合、出力列は配列と同じデータ型になります。 配列によるアンロールが、サブ配列を含む複合オブジェクトの配列である場合、そのサブ配列の項目をマッピングすると配列が出力されます。
マッピングの出力を確認するには、検査タブとデータのプレビューを参照してください。
ルールベースのマッピング
フラット化変換では、ルールベースのマッピングがサポートされているため、ルールに基づいて配列をフラット化し、階層レベルに基づいて構造をフラット化する動的で柔軟な変換を作成できます。
Matching condition (一致条件)
完全一致やパターンを使用してフラット化したい列に対するパターンマッチング条件を入力してください。 例: like(name,'cust%')
Deep column traversal (ディープ列トラバーサル)
複合オブジェクト全体を列として処理するのではなく、複合オブジェクトのすべてのサブ列を個別に処理するようサービスに指示するオプションの設定。
階層レベル
展開する階層のレベルを選択します。
Name matches (名前一致) (正規表現)
必要に応じて、一致条件を使用する代わりに、名前の一致を正規表現として表すように選択します。
例
フラット化変換の以下の例については、次の 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}
複合配列を含むアンロール ルートがない
| アンロール | ルートのアンロール | プロジェクション |
|---|---|---|
| goods.orders.shipped.orderItems | なし | 名前 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 場所 = 場所 |
出力
{ '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)