マッピング データ フローのフラット化変換

適用対象: Azure Data Factory Azure Synapse Analytics

ヒント

企業向けのオールインワン分析ソリューション、Microsoft Fabric の Data Factory をお試しください。 Microsoft Fabric は、データ移動からデータ サイエンス、リアルタイム分析、ビジネス インテリジェンス、レポートまで、あらゆるものをカバーしています。 無料で新しい試用版を開始する方法について説明します。

データ フローは、Azure Data Factory および Azure Synapse Pipelines の両方で使用できます。 この記事は、マッピング データ フローに適用されます。 変換を初めて使用する場合は、概要の記事「マッピング データ フローを使用してデータを変換する」を参照してください。

フラット化変換を使用して、JSON などの階層構造内の配列値を取得し、それらを個々の行にアンロールします。 このプロセスは非正規化と呼ばれるものです。

構成

フラット化変換には、次の構成設定が含まれます。

Screenshot that shows flatten settings.

アンロール

アンロールする配列を選択します。 出力データでは、配列の各項目が 1 つの行になります。 入力行のアンロール配列が null または空の場合は、アンロールされた値が null の出力行が 1 つ存在します。 フラット化変換ごとに複数の配列の登録を解除するオプションがあります。 1 つのフラット化変換に複数の配列を含めるには、プラス (+) ボタンをクリックします。 ここでは、ADF データ フロー メタ関数 (nametype を含む) を使用できます。また、パターン マッチングを使用して、これらの条件に一致する配列の登録を解除することもできます。 1 つのフラット化変換に複数の配列を含めると、結果は可能なすべての配列値のデカルト積になります。

Screenshot that shows flatten results.

ルートのアンロール

既定では、フラット化変換によって、配列はそれが存在する階層の最上位にアンロールされます。 必要に応じて、アンロール ルートとして配列を選択できます。 アンロール ルートは、アンロール配列である、またはアンロール配列を含む、複合オブジェクトの配列である必要があります。 アンロール ルートを選択した場合、出力データには、アンロール ルート内の項目ごとに少なくとも 1 行が含まれます。 入力行の項目がアンロール ルートにない場合、その入力行は出力データから削除されます。 アンロール ルートを選択したときの出力の行数は、常に、既定の動作での行数以下になります。

マッピングのフラット化

選択変換と同様に、入力フィールドと正規化されていない配列から新しい構造のプロジェクションを選択します。 正規化されていない配列がマップされている場合、出力列は配列と同じデータ型になります。 アンロール配列が、サブ配列を含む複合オブジェクトの配列である場合、そのサブ配列の項目をマッピングすると、配列が出力されます。

マッピングの出力を確認するには、検査タブとデータのプレビューを参照してください。

ルールベースのマッピング

フラット化変換では、ルールベースのマッピングがサポートされており、ルールに基づいて配列をフラット化し、階層レベルに基づいて構造体をフラット化する、動的で柔軟な変換を作成できます。

Flatten pattern

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"}

文字列配列を含むアンロール ルートがない

アンロール ルートのアンロール Projection
goods.customers なし 名前
customer = goods.customer

出力

{ 'MSFT', 'government'}
{ 'MSFT', 'distributer'}
{ 'MSFT', 'retail'}
{ 'Company1', 'store'}
{ 'Company1', 'store2'}
{ 'Company2', 'Bank'}
{ 'Company3', null}

複合配列を含むアンロール ルートがない

アンロール ルートのアンロール Projection
goods.orders.shipped.orderItems なし 名前
orderId = goods.orders.orderId
itemName = goods.orders.shipped.orderItems.itemName
itemQty = goods.orders.shipped.orderItems.itemQty
location = 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'}
{ 'Company3', null, null, null, 'Kirkland'}

アンロール配列と同じルート

アンロール ルートのアンロール Projection
goods.orders goods.orders 名前
goods.orders.shipped.orderItems.itemName
goods.customers
location

出力

{ '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'}

複合配列を含むアンロール ルート

アンロール ルートのアンロール Projection
goods.orders.shipped.orderItem goods.orders 名前
orderId = goods.orders.orderId
itemName = goods.orders.shipped.orderItems.itemName
itemQty = goods.orders.shipped.orderItems.itemQty
location = 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)