トランスフォーメーション > 階層プロセッサトランスフォーメーション > リレーショナル出力の処理
  

リレーショナル出力の処理

階層プロセッサトランスフォーメーションにより、1つの階層入力グループを複数の出力グループに変換できます。これらの出力グループには、区切りフラットファイルまたはリレーショナルファイルを含めることができます。
例えば、顧客情報と注文情報を含む顧客注文ファイルがあるとします。このファイルは、階層的なJSON形式です。リレーショナル顧客テーブルを作成して、マスターデータベースの情報を更新したいと考えています。また、どの注文が増加しているかを確認するために、個別の区切り注文ファイルも必要です。

階層プロセッサトランスフォーメーションを使用したリレーショナル出力の定義

階層プロセッサトランスフォーメーションを定義するには、[階層プロセッサ]タブを使用して受信フィールドを出力フィールドにマッピングし、出力データ構造を設定して、必要に応じてリレーショナル出力用のキーを生成します。
次の図に、階層入力とリレーショナル出力を持つ[階層プロセッサ]タブを示します。
[階層プロセッサ]タブが表示され、[出力形式リレーショナル]が選択されています。トランスフォーメーションには、左側のパネルに受信フィールドが含まれ、右側のパネルに出力グループとフィールドが含まれます。データ設定アイコン、出力フィールドへのリンク、および式へのリンクを使用すると、データ処理ストラテジを定義できます。
  1. 1出力形式。受信階層データを1つ以上のリレーショナル出力グループに変換するには、[リレーショナル]を選択します。
  2. 2入力グループ、受信フィールド。これらのフィールドを使用して出力フィールドにマッピングします。
  3. 3出力グループ、出力フィールド。これらのフィールドを使用して複合出力ファイルを作成します。
  4. 4キーの生成。必要に応じて、入力グループにキーを生成し、出力グループ間のリレーションを定義します。
  5. 5出力グループへの受信フィールドの追加。フィールドを出力グループに追加するために使用します。
  6. 6出力フィールド名。フィールド名をクリックして、フィールド名またはデータ型を変更します。
  7. 7データ設定アイコン。出力グループとフィールドを設定するために使用します。
  8. 8式。式をクリックして、出力フィールドの式を表示またはカスタマイズします。
  9. 9出力フィールドの追加または削除。出力フィールドを作成または削除する場合に使用します。
ヒント: [受信フィールド]パネルまたは[出力フィールド]パネルのサイズを変更して、情報を見やすくすることができます。

階層プロセッサトランスフォーメーションの設定

リレーショナル出力を生成するように階層プロセッサトランスフォーメーションを設定できます。
    1[リレーショナル]出力形式を選択します。
    2 受信フィールドを出力に追加するか、手動でフィールドを出力に追加して、トランスフォーメーション出力を設定します。
    3必要に応じて、入力グループにキーを生成し、出力グループ間のリレーションを定義します。
    4出力グループとフィールドを設定します。
    1. aデータソースを設定します。
    2. b必要に応じて、出力フィールド式をカスタマイズします。
    3. c必要に応じて、トランスフォーメーションにフィルタを追加します。

一意キーの生成

階層データをリレーショナル出力に変換するマッピングでは、必要に応じて階層入力グループの一意キーを生成できます。
次の図に、[階層プロセッサ]タブで一意のキーを生成するオプションを示します。
階層プロセッサトランスフォーメーションの[階層プロセッサ]タブには、三点のアイコンがあります。このアイコンを使用すると、出力データ形式がリレーショナルのときに一意キーを生成するオプションが表示されます。
一意キーを生成するときは、入力グループのプライマリキーと、入力グループ内の各配列要素のキーを生成します。各キーは、グローバル一意キーと、追加フィールドごとに増加する値を組み合わせたものです。生成されたキーは、他の受信フィールドと同じように出力グループにマッピングできます。
入力親要素から子データセットの出力グループにキーフィールドをマッピングすると、出力データまたは出力グループにプライマリキーと外部キーのリレーションが生じます。このリレーションは、生成されたキーのマッピング方法に基づいて、出力側で生成されます。

リレーショナル出力グループへの受信フィールドの追加

出力には、受信フィールドを個別に追加することや入力グループ全体を追加することができます。受信フィールドは、出力グループ、配列、または構造フィールドに追加できます。必要に応じて、出力フィールドの名前を変更したり削除したりすることができます。
出力フィールドを追加するには、追加する受信フィールドまたは入力グループにカーソルを合わせ、[追加]ボタンをクリックします。
受信フィールドのデータ型と出力タイプに基づいて、次の方法でフィールドを追加できます。
受信フィールドの追加
選択した受信フィールドを、選択した出力グループまたはフィールドに追加します。
プリミティブデータ型の受信フィールドを出力に追加するには、[受信フィールドの追加]を選択します。
入力グループの追加
グループ内のすべての受信フィールドを、選択した出力グループまたはフィールドに追加します。
プリミティブデータ型の受信フィールドを出力に追加するには、[入力グループの追加]を選択します。
単一オカレンスの子の追加
構造の配下にネストされた単一オカレンスの子フィールドを含んだ、フィールドの下にあるすべての単一オカレンスの子を出力に追加します。配列の下にネストされた単一オカレンスの子は追加されません。
[単一オカレンスの子の追加]オプションは、受信構造または配列フィールドを選択した場合に選択することができ、出力はリレーショナルとなります。詳細については、単一オカレンスの子の追加を参照してください。
すべての子孫の追加
フィールドの下にあるすべての子(すべての配列と構造を含む)を出力に追加します。受信フィールドに配列が含まれている場合、データ統合では、配列ごとに個別の出力グループが作成されます。
[すべての子孫の追加]オプションは、受信構造または配列フィールドを選択した場合に選択することができ、出力はリレーショナルとなります。詳細については、すべての子孫の追加を参照してください。

単一オカレンスの子の追加

受信構造および配列フィールドを出力に追加し、出力形式がリレーショナルである場合は、単一オカレンスの子を追加できます。[単一オカレンスの子の追加]オプションを使用すると、構造の配下にネストされた単一オカレンスの子フィールドを含んだ、フィールドの下にあるすべての単一オカレンスの子が出力グループに追加されます。
[単一オカレンスの子の追加]を選択した場合、受信フィールドには子オブジェクトが必要です。
選択したフィールドに配列が含まれている場合、この配列には複数の要素が含まれる可能性があるため、配列とその子は追加されません。

単一オカレンスの子を追加する例

各出力レコードに1人の顧客に関する情報が含まれているCustomer配列から顧客情報を抽出する必要があるとします。
[単一オカレンスの子の追加]オプションを選択して、Customer配列で[追加]を選択します。この操作により、FullAddress構造の下の子を含む、Customerの下のすべての単一オカレンスの子が出力グループにマッピングされます。
Customers構造レベルで単一オカレンスの子を追加できないことに注意してください。これは、最上位の構造の下に単一オカレンスの子が存在しないためです。
次の図に、受信フィールドと出力フィールドを示します。
左型の受信フィールドリストには、最上位の構造であるCustomersがあります。その構造の下は、配列Customerです。Customer配列には、5つの文字列フィールドとFullAddressという構造が含まれています。構造FullAddressには、3つの文字列フィールドが含まれています。[単一オカレンスの子の追加]を適用した後の右側の出力グループには、8つの文字列フィールドが含まれています。

すべての子孫の追加

受信構造および配列フィールドを出力に追加し、出力形式がリレーショナルである場合は、すべての子孫を追加できます。[すべての子孫の追加]オプションにより、すべての配列と構造を含む、フィールドの下のすべての子が出力グループに追加されます。
[すべての子孫の追加]オプションを選択した場合、配列を含む階層データを同じ出力グループにマッピングすることはできません。配列を含む階層データを含んだ受信フィールドを出力グループに追加すると、階層プロセッサトランスフォーメーションによって配列ごとに個別の出力グループが作成されます。

すべての子孫を追加する例

すべての受信フィールドをリレーショナル出力グループに追加する必要があるとします。受信フィールドには、配列CustomerとOrderが含まれています。
親の受信フィールドの横にある[追加]をクリックし、[すべての子孫の追加]オプションを選択します。この操作により、Customer配列のフィールドが最初の出力グループにマッピングされ、Order配列のすべてのフィールドが2番目の出力グループにマッピングされます。
次の図に、入力フィールドと出力フィールドを示します。
左側の受信フィールドのリストには、配列: Customerを含む最上位の構造体: Customersが含まれています。次の構造体はOrdersで、これには配列: Orderが含まれています。[すべての子孫の追加]を適用した後の右側の出力グループは、CustomerとOrderです。

リレーショナル出力グループとフィールドの設定

出力グループと出力フィールドを作成および変更できます。出力形式がリレーショナルの場合は、複数の出力グループを作成できます。
受信フィールドを出力グループに追加した後に、[階層プロセッサ]タブで出力フィールド名をクリックしてフィールドを変更できます。出力フィールドを手動で追加および定義することもできます。
以下の表に、出力フィールドのプロパティを示します。
プロパティ
説明
このフィールドが属する親のフィールドまたはグループ。名前の構造から、グループ、親フィールド、構造名がわかります。例: OUTGROUP.Grandparent.Parent。<struct name>
名前
現在の出力グループまたはフィールドの名前。
タイプ
現在のフィールドのデータ型。プリミティブデータ型を選択できます。
精度
フィールドの合計有効桁数。
スケール
小数点以下の桁数。
配列の要素タイプ
現在の配列要素のデータ型。
配列の要素精度
現在の配列要素の精度。ターゲットデータの作成時に使用されます。
配列の要素スケール
現在の配列要素のスケール。ターゲットデータの作成時に使用されます。
構造名
現在の構造フィールドの構造名。
要素の構造名
構造フィールドの現在の配列における要素の構造名。
説明
フィールドとその用途の説明(オプション)。
注: 表示される出力フィールドプロパティは、データ型によって異なります。

データソースの設定

階層プロセッサトランスフォーメーションでは、データソースは、出力グループまたは出力フィールドのプリミティブ子フィールドにデータを入力する入力グループまたは受信配列を識別します。
出力がリレーショナルの場合、出力グループのデータソースは常に入力グループまたは受信フィールドになります。例えば、出力グループに配列を追加するとします。単一オカレンスの子を追加した場合、出力グループのデータソースは入力グループになります。すべての子孫を追加すると、それぞれの出力グループのデータソースは受信フィールド配列になります。

フィルタ条件の設定

フィルタ条件を定義して、入力データのサブセットを階層プロセッサトランスフォーメーションに投影できます。受信フィールドまたは出力フィールドに基づいてフィルタリングを実行できます。
配列/構造フィールドのデータが出力グループの兄弟フィールドのデータと対応するようにする必要がある場合は、プリミティブフィールドから出力配列/構造フィールドにデータを読み取るようにフィルタ条件を設定します。

フィルタ設定の例

リレーショナルデータをJSONファイルに変換する必要があるとします。受信データは、注文情報を含むリレーショナルテーブルに含まれています。それぞれの注文には複数の製品が含まれるため、注文テーブルには注文ごとに複数の行が含まれます。
受信データは次のようになります。
OrderNumber,ProductName,ProductType,NumberOfItems,PricePerItem
12345,M&Ms Candies Chocolate Peanut Party Size - 38 Oz,Candy,2,14.49
12345,Stella Parm Shredded Cup - 20 Oz,Dairy,1,10.99
12345,AHA Sparkling Water Blueberry Pomegranate - 8-12 Fl. Oz.,Beverages,1,3.33
23456,Weetabix Biscuit Cereal Whole Grain 2 Count - 14 Oz,Breakfast & Cereal,2,4.99
23456,Producers Milk Lowfat 1% - Half Gallon,Dairy,1,2.79
23456,Egglands Best Eggs Cage Free Large Brown - 12 Count,Eggs,1,4.99
製品の詳細を、特定の注文番号に関連付けられている配列に読み込む必要があります。
次の図に、受信フィールドと出力フィールドの構造を示します。
この図は、階層プロセッサトランスフォーメーションの[階層プロセッサ]タブを示しています。[受信フィールド]パネルには、OrderNumber、ProductName、ProductType、NumberOfItems、およびPricePerItemというフィールドを持つ1つの入力グループが含まれています。[出力フィールド]パネルには、OrderNumber(文字列)とProductDetails(配列)というフィールドを持つ1つの出力グループが含まれています。ProductDetals配列には、ProductName、ProductType、NumberOfItems、およびPricePerItemというフィールドが含まれています。
[出力フィールド]パネルで[出力]グループのデータソースをInputに設定し、グループ化フィールドをInput.OrderNumberとして設定して、出力から重複レコードを削除します。ProductDetails配列のデータソースをInputに設定します。
ProductDetails配列の詳細が出力の注文番号に対応するようにするには、配列に次のフィルタ条件を設定します。
:fld.{Input.OrderNumber}= :fld.{Output.OrderNumber}
レコードをさらに絞り込むには、フィルタでAND条件を使用します。例えば、「Candy」という製品タイプのレコードを除外するには、次のフィルタ条件を設定します。
:fld.{Input.OrderNumber}= :fld.{Output.OrderNumber} AND :fld.{Input.ProductType} ! = 'Candy'
出力には注文ごとに1つのレコードが含まれ、「Candy」という製品タイプの受信レコードは除外されます。
出力データには、次のようなレコードが含まれます。
{
"OrderNumber":"12345",
"ProductDetails":[
{
"ProductName":"AHA Sparkling Water Blueberry Pomegranate - 8-12 Fl. Oz.",
"ProductType":"Beverages",
"NumberOfItems":"1",
"PricePerItem":"3.33"
},
{
"ProductName":"Stella Parm Shredded Cup - 20 Oz",
"ProductType":"Dairy",
"NumberOfItems":"1",
"PricePerItem":"10.99"
}
]
}
{
"OrderNumber":"23456",
"ProductDetails":[
{
"ProductName":"Egglands Best Eggs Cage Free Large Brown - 12 Count",
"ProductType":"Eggs",
"NumberOfItems":"1",
"PricePerItem":"4.99"
},
{
"ProductName":"Producers Milk Lowfat 1% - Half Gallon",
"ProductType":"Dairy",
"NumberOfItems":"1",
"PricePerItem":"2.79"
},
{
"ProductName":"Weetabix Biscuit Cereal Whole Grain 2 Count - 14 Oz",
"ProductType":"Breakfast & Cereal",
"NumberOfItems":"2",
"PricePerItem":"4.99"
}
]
}

式の設定

階層プロセッサトランスフォーメーションで式を定義して、カスタマイズされたリレーショナル出力または階層出力を作成できますが、フラット化された出力を作成することはできません。また、式を使用してフィルタ条件を定義します。
階層プロセッサトランスフォーメーションは、さまざまなデータセットからの情報を処理できます。一部のフィールド名は、異なるデータセット間で一意ではない場合があります。その結果、同じフィールド名が別のデータセットまたは同じデータセットの階層内で使用される可能性があるため、フィールドをその名前で単純に参照することはできません。
階層プロセッサトランスフォーメーションの式の構文は、式トランスフォーメーションで使用される構文とは異なります。
階層プロセッサトランスフォーメーションでフィールドを参照するには、次の構文を使用します。
:fld.{input_group_name.field_name}.field_name
次の表に、構文の詳細を示します。
構文部分
説明
.fld.
階層プロセッサトランスフォーメーションの式の構文を示します。
input_group_name
入力グループまたはデータセットの名前。
field_name
最上位のフィールドでない場合は、フルパス名を含むフィールドの名前。
配列タイプのフィールドがある場合は、配列名を含めます。配列がプリミティブで配列名がない場合は、配列名としてelemを使用します。
構造または配列内のフィールドの場合、実際のフィールド名は右中括弧の外側で指定します。
.field_name
構造または配列内のフィールドを参照する場合にのみ、field_nameの部分を含めます。以下のガイドラインに従ってください。
  • - 構造内のフィールドの場合、field_name部分は次の形式を使用します: .structName.fieldname
  • - 配列内のフィールドの場合、field_name部分は次の形式を使用します: .fieldName

式の設定

出力形式がリレーショナルまたは階層の場合は、式を設定できます。フラット化された出力の場合、フィールドを追加すると式がデフォルトの形式に固定され、設定ができなくなります。
階層プロセッサトランスフォーメーションで式を設定するには、次の手順を実行します。
    1次のいずれかのアクションを実行して、出力フィールドを作成します。
    1. a受信フィールドを出力として使用するには、受信フィールドの上にカーソルを合わせると表示される[追加]リンクをクリックします。
    2. b新しいフィールドを作成するには、[出力フィールド]パネルで出力グループ名または配列名の近くにある[新しいフィールド]をクリックします。
    2[出力フィールド]セクションで式をクリックします。
    新しく作成したフィールドで、このリンクは[設定]と表示されます。[フィールド式]ダイアログボックスが表示されます。
    3式エディタで式を入力します。使用するオブジェクトの横にある[追加]リンクをクリックすることで、受信フィールド、関数、および変数を式に追加できます。式を手動で入力することも可能です。
    式には、定数、変数、組み込み関数、およびユーザー定義関数を含めることができます。関数をネストすると、複合式を作成することができます。
    注: いずれかのフィールドへの参照を変更すると、式は失敗します。
    4[検証]をクリックします。
    5エラーがあれば修正します。
    6[OK]をクリックします。
    エディタを閉じて、無効な式のトラブルシューティングを後ほど行うこともできます。

JSONデータを使用したマッピングの実行

JSON形式のデータを含む階層プロセッサトランスフォーメーションを含んだマッピングを実行するには、マッピングタスクを使用する必要があります。

JSON入力の読み取り

JSONデータを読み取る場合、入力ファイルは、複数行のスキーマに基づくものと単一行のスキーマに基づくものがあります。
次のサンプルは、JSONスキーマを1行で示したものです。
{"Name":"Tom","Street":"2100 Seaport Blvd","City":"Redwood City","State":"CA","Country":"USA","Zip":"94063"}
次のサンプルは、複数の行にまたがるJSONスキーマを示しています。
{
"Name": "Tom",
"Surname": "Day",
"City": "Redwood City",
"State": "CA",
"Country": "USA",
"Zip": "94063"
}
デフォルトでは、階層プロセッサトランスフォーメーションは各JSONスキーマを単一行として読み取ります。複数行にまたがる入力を読み取るには、複数行のJSONファイルを読み取るようにソーストランスフォーメーションで形式オプションを設定できます。

JSON出力の書き込み

JSONデータを書き込む場合は、各出力レコードを個別のファイルに書き込むか、すべての出力レコードを1つのファイルに書き込むことができます。
デフォルトでは、各出力レコードは個別のファイルに書き込まれます。出力レコードを1つのJSON形式のファイルに書き込むには、マッピングタスクで次のSparkセッションプロパティを設定します。
セッションプロパティ名
セッションプロパティ値
spark.sql.shuffle.partitions
1

階層型からリレーショナルへの例

顧客注文ファイルに、現在の顧客連絡先情報と顧客の最近の注文が含まれているとします。この注文ファイルは階層JSONファイルであり、会社のクラウドアプリケーションによって生成されています。階層データを処理し、そのデータをターゲットファイルにリレーショナル形式および区切り形式で書き込むことができます。
注文ファイルデータを使用して、マスターデータベースの顧客情報の更新に使用するリレーショナル顧客テーブルを作成するとします。それとは別に、増加中の注文を分析するとします。注文ファイルを使用して、分析用に個別の区切り注文ファイルを作成できます。
データを、階層入力からリレーショナルおよび区切り出力に変換する必要があるとします。
マッピングを作成して実行するには、次のタスクを実行します。
  1. 1S3ソースおよびターゲットオブジェクトを使用するため、Amazon S3 V2コネクタにアクセスできることを確認します。
  2. 2ソースJSONファイルから階層データを読み取るソーストランスフォーメーションを追加します。
  3. 3ソースオブジェクトに、次のプロパティを設定します。
  4. プロパティ
    接続
    Amazon S3 V2
    ソースフォーマット
    JSON
  5. 4階層プロセッサトランスフォーメーションを追加します。次の図は、データフローを示しています。
  6. このマッピングでは、1つのソーストランスフォーメーションが1つの階層プロセッサトランスフォーメーションに接続し、その階層プロセッサトランスフォーメーションが2つのターゲットトランスフォーメーションに接続しています。
  7. 5OutputCustomers出力グループを作成して、リレーショナル顧客データファイルを作成します。
  8. 次の図は、入力フィールドを追加する方法を示しています。入力フィールドを追加すると、出力グループが作成されます。
    [階層プロセッサ]タブには、左側に受信フィールド、右側に出力フィールドというリストがあります。[フィールドの追加]ダイアログボックスを右側に示します。
  9. 6OutputOrdersという出力グループを作成して、区切り注文データファイルを作成します。
  10. 7[階層プロセッサ]タブで、[受信フィールド][出力フィールド]にマッピングします。
  11. フィールドを個別に追加したり、構造および配列のフィールドで次のオプションを使用したりすることができます。
  12. 8ターゲットトランスフォーメーションを追加して、顧客データ出力を書き込みます。
  13. 9ターゲットオブジェクトに対して次のプロパティを設定します。
  14. プロパティ
    接続
    Amazon S3 V2
    形式オプション
    リレーショナル
  15. 10ターゲットトランスフォーメーションを追加して、注文データ出力を書き込みます。
  16. 11ターゲットオブジェクトに対して次のプロパティを設定します。
  17. プロパティ
    接続
    Amazon S3 V2
    形式オプション
    区切りファイル
  18. 12OutputCustomers出力グループをTargetCustomersというターゲットトランスフォーメーションにリンクします。
  19. 13OutputOrders出力グループをTargetOrdersというターゲットトランスフォーメーションにリンクします。
  20. 14マッピングを実行します。