階層出力の処理 階層プロセッサトランスフォーメーションにより、次のタイプの階層出力を処理できます。
• リレーショナルから階層。最大5つのリレーショナル入力グループを1つの階層出力グループに変換します。• 階層から階層。1つ以上の階層入力グループを、異なるスキーマを持つ1つの階層出力グループに変換します。階層プロセッサトランスフォーメーションを使用した階層出力の定義 受信フィールドを出力フィールドにマッピングして、階層出力の出力データ構造を設定できます。
出力データ形式が階層の場合は、次のガイドラインを考慮してください。
• 操作を実行する際に従うべき特定の順序があります。• 出力グループの名前を変更または削除できます。• 入力データと出力データの両方を集計できます。次の図に、リレーショナル入力と階層出力を持つ[階層プロセッサ] タブを示します。
1 出力形式。[階層] を選択して、受信フィールドに階層スキーマを構築します。2 入力グループ、受信フィールド。これらのフィールドを使用して出力フィールドにマッピングします。3 出力フィールドこれらのフィールドを使用して複合出力ファイルを作成します。4 出力グループへの受信フィールドの追加。フィールドを出力グループに追加するために使用します。5 出力フィールド名。フィールド名をクリックして、フィールド名またはデータ型を変更します。6 データ設定アイコン。出力グループとフィールドを設定するために使用します。7 式。式をクリックして、出力フィールドの式を表示またはカスタマイズします。8 出力フィールドの追加または削除。出力フィールドを作成または削除する場合に使用します。ヒント: [受信フィールド]パネルまたは[出力フィールド]パネルのサイズを変更して、情報を見やすくすることができます。
階層出力の定義 階層出力を使用して階層プロセッサトランスフォーメーションを定義するには、次のタスクを実行します。
1 [階層] 出力形式を選択します。
2 受信フィールドを出力に追加するか、手動でフィールドを出力に追加して、トランスフォーメーション出力を設定します。
3 出力グループとフィールドを設定します。
a データソースを設定します。 b 必要に応じて、データソースを結合します。 c 必要に応じて、出力フィールド式をカスタマイズします。 d 必要に応じて、トランスフォーメーションにフィルタを追加します。 e 必要に応じて、ソート順フィールドを使用して出力の順序を定義します。 f 必要に応じて、グループ化フィールドを使用して入力データを集計します。 g 必要に応じて、出力データを集計します。 操作の順序 階層出力を操作するときは、特定の順序で操作を実行する必要があります。
出力データ形式が階層の場合は、次の順序で操作を実行します。
1 結合。データソースの結合条件を指定します。2 フィルタ。必要に応じて、ソースデータのサブセットのみを含むようにフィルタ条件を指定します。3 グループ化。必要に応じて、集計式の受信フィールドを指定します。4 ソート順。必要に応じて、ソート済み出力を作成するための受信フィールドを指定します。出力グループの名前変更と削除 出力データの形式が階層である場合は、入力グループの名前変更または削除を行うことができます。
入力グループを変更すると、入力グループを参照している場合は、次の設定も更新されます。
• 入力データソース名• 結合データソース名• ソート順フィールド• グループ化フィールドただし、次の設定は手動で変更する必要があります。
注: 出力データの形式が階層である場合は、入力グループ名を変更できません。
階層出力グループへの受信フィールドの追加 個々の受信フィールドまたは入力グループ内のすべてのフィールドを出力グループに追加でき、受信フィールドを出力グループまたは配列あるいは構造フィールドに追加できます。必要に応じて、出力フィールドの名前を変更したり削除したりすることができます。
追加する受信フィールドまたは入力グループの横にある[階層プロセッサ] タブの[追加] リンクをクリックします。
受信フィールドのデータ型と出力タイプに基づいて、次の方法でフィールドを追加できます。
受信フィールドの追加 選択した受信フィールドを、選択した出力グループまたはフィールドに追加します。
[受信フィールドの追加]オプションは、プリミティブデータ型の受信フィールドを出力に追加した場合に使用できます。
入力グループの追加 グループ内のすべての受信フィールドを、選択した出力グループまたはフィールドに追加します。
[入力グループの追加]オプションは、プリミティブデータ型の受信フィールドを出力に追加した場合に使用できます。
プリミティブ単一オカレンスの子の追加 構造の配下にネストされたプリミティブな単一オカレンスの子フィールドを含んだ、フィールドの下にあるすべてのプリミティブ単一オカレンスの子を出力に追加します。プリミティブ単一オカレンスの子を追加しても、配列の下にネストされた子は追加されません。
プリミティブ単一オカレンスの子は、受信構造または配列フィールドを選択した場合に追加することができ、出力は階層となります。詳細については、
プリミティブ単一オカレンスの子の追加 を参照してください。
受信フィールドの保持 選択したフィールドの階層構造を出力に保持します。例えば、構造の配列を出力グループに追加すると、出力グループには同じ構造を持つ構造の配列が含まれます。
[受信フィールドを保持]オプションは、受信構造または配列フィールドを選択した場合に使用することができ、出力は階層となります。詳細については、
受信フィールドの保持 を参照してください。
選択した配列のフラット化 プリミティブの配列をプリミティブフィールドにフラット化します。配列内の要素ごとに1つの出力レコードを作成します。
[選択した配列をフラット化]オプションは、受信構造または配列フィールドを選択した場合に使用することができ、出力は階層となります。詳細については、
選択した配列のフラット化 を参照してください。
選択した配列を構造として追加 構造の配列を構造フィールドにフラット化します。配列の要素ごとに1つの出力レコードを作成します。
[選択した配列を構造として追加]オプションは、受信構造または配列フィールドを選択した場合に使用することができ、出力は階層となります。詳細については、
選択した配列を構造として追加 を参照してください。
プリミティブ単一オカレンスの子の追加 受信構造および配列フィールドを出力に追加した場合に、プリミティブ単一オカレンスの子を追加できます。受信構造または配列フィールドを階層出力に追加した場合は、[プリミティブ単一オカレンスの子の追加]オプションを使用できます。このオプションにより、構造の配下にネストされたプリミティブな単一オカレンスの子フィールドを含む、フィールドの下にあるすべてのプリミティブ単一オカレンスの子が出力グループに追加されます。
子オブジェクトを持つ受信フィールドに対してのみ、プリミティブ単一オカレンスの子を追加できます。
選択したフィールドに配列が含まれている場合、この配列には複数の要素が含まれる可能性があるため、配列とその子は追加されません。
例 車両レコードの配列から、メーカー、モデル、会社、およびポリシー番号を抽出する必要があるとします。それぞれの出力レコードには、1台の車両に関する情報が含まれている必要があります。
vehicle配列を出力グループに追加し、[プリミティブ単一オカレンスの子の追加] を選択します。
次の図に、受信フィールドと出力フィールドを示します。
日付フィールドは、選択したフィールドの子配列の配下にあり、単一オカレンスではないため、出力グループに追加されないことに注意してください。
受信フィールドの保持 受信構造フィールドと配列フィールドを出力に追加する場合に、受信フィールドを保持することができます。受信フィールドを保持すると、構造を変更せずに受信フィールドが階層出力にコピーされます。
ネストされた配列を追加し、[受信フィールドの保持]を選択した場合、出力グループのデータソース構成によってレコードの作成方法が決まります。
受信フィールドの保持の例 メンテナンスレコードのネストされた配列から説明情報を抽出する必要があるとします。説明情報は文字列の配列に含まれています。出力データも文字列の配列に含める必要があるとします。
説明配列を出力グループに追加し、[受信フィールドの保持] を選択します。
次の図に、受信フィールドと出力フィールドを示します。
データ統合 が出力配列を作成する際に、説明配列のデータソースがInput.vehicle.vehicle.maintenance.maintenance.desc.elem に設定されます。これは、出力配列の情報が入力グループのdesc配列の要素から取得されていることを示します。出力グループのデータソースによって、出力レコードの構造が決まります。
デフォルトでは、
データ統合 では、出力グループのデータソースが
Input に設定されます。マッピングを実行すると、
データ統合 ではすべての説明が1つの出力レコードに照合されます。それぞれの車両の個別のレコードに説明を書き込むには、データソースを
Input.vehicle.vehicle に設定します。メンテナンスレコードごとに個別のレコードに説明を書き込むには、データソースを
Input.vehicle.vehicle.maintenance.maintenance に設定します。データソース構成の詳細については、
データソースの設定 を参照してください。
選択した配列のフラット化 プリミティブの受信配列を出力に追加すると、選択した配列を同じデータ型のフィールドにフラット化できます。
選択した配列をフラット化すると、配列内の要素ごとに1つのレコードが作成されます。
配列のフラット化の例 メンテナンスレコードのネストされた配列から説明情報を抽出する必要があるとします。説明情報は文字列の配列に含まれています。出力を文字列フィールドにフラット化する必要があるとします。
description配列を出力グループに追加し、[選択した配列のフラット化] を選択します。
次の図に、受信フィールドと出力フィールドを示します。
出力には、受信データにdescriptionが現れるたびに1つのレコードが含まれます。
例えば、受信データには次のようなレコードが含まれます。
[ { "vehicle": [ { "make": "Toyota", "model": "Corolla", "insurance": { "company": "Allstate", "policy_num": "AS12876" }, "maintenance": [ { "date": "01/01/2020", "description": ["oil filter1", "oil filter2"] }, { "date": "01/08/2020", "description": ["tire rotation1", "tire rotation2"] } ] }, { "make": "Toyota", "model": "RAV4", "insurance": { "company": "Allstate", "policy_num": "AS2033" }, "maintenance": [ { "date": "01/02/2020", "description": ["air filter replacement1", "air filter replacement2"] }, { "date": "01/08/2020", "description": ["battery replacement1", "battery replacement2"] } ] } ] } ]
データ統合 では、受信データにdescriptionが現れるたびに次のような出力レコードが1つ作成されます。
{"description":"oil filter1"} {"description":"oil filter2"} {"description":"tire rotation1"} {"description":"tire rotation2"} {"description":"air filter replacement1"} {"description":"air filter replacement2"} {"description":"battery replacement1"} {"description":"battery replacement2"}
選択した配列を構造として追加 プリミティブの受信配列を構造として追加すると、配列は構造フィールドにフラット化されますが、子孫配列はフラット化されません。
[選択した配列を構造として追加]オプションにより、選択した配列の要素ごとに1つのレコードが作成されます。
配列を構造として追加する例 メンテナンスレコードの子配列をフラット化せずに、車両レコードの配列を構造にフラット化する必要があるとします。
vehicle配列を出力グループに追加し、[選択した配列を構造として追加] を選択します。
次の図に、受信フィールドと出力フィールドを示します。
出力には、vehicle配列の要素ごとに1つのレコードが含まれます。
例えば、受信データには、2台の車両に関するデータを含む次のレコードが含まれます。
[ { "vehicle": [ { "make": "Toyota", "model": "Corolla", "insurance": { "company": "Allstate", "policy_num": "AS12876" }, "maintenance": [ { "date": "01/01/2020", "description": ["oil filter1", "oil filter2"] }, { "date": "01/08/2020", "description": ["tire rotation1", "tire rotation2"] } ] }, { "make": "Toyota", "model": "RAV4", "insurance": { "company": "Allstate", "policy_num": "AS2033" }, "maintenance": [ { "date": "01/02/2020", "description": ["air filter replacement1", "air filter replacement2"] }, { "date": "01/08/2020", "description": ["battery replacement1", "battery replacement2"] } ] } ] } ]
階層プロセッサトランスフォーメーションにより、車両ごとに1つずつ、次の出力レコードが作成されます。
{ "vehicle":{ "make":"Toyota", "model":"Corolla", "insurance":{ "company":"Allstate", "policy_num":"AS12876" }, "maintenance":[ { "date":"01/08/2020", "description":["tire rotation2","tire rotation1"] }, { "date":"01/01/2020", "description":["oil filter2","oil filter1"] } ] } } { "vehicle":{ "make":"Toyota", "model":"RAV4", "insurance":{ "company":"Allstate", "policy_num":"AS2033" }, "maintenance":[ { "date":"01/08/2020", "description":["battery replacement2","battery replacement1"] }, { "date":"01/02/2020", "description":["air filter replacement2","air filter replacement1"] } ] } }
階層出力グループとフィールドの設定 階層出力の出力グループと出力フィールドを作成および変更できます。
受信フィールドを出力グループに追加した後に、出力フィールド名を選択してフィールドを変更できます。出力フィールドを手動で追加および定義することもできます。
名前とタイプ 以下の表に、階層出力フィールドのプロパティを示します。
プロパティ
説明
子
このフィールドが属する親のフィールドまたはグループ。名前の構造から、グループ、親フィールド、構造名がわかります。例: OUTGROUP.Grandparent.Parent.struct_name
名前
現在の出力グループまたはフィールドの名前。
タイプ
現在のフィールドのデータ型。階層出力の場合は、プリミティブまたは複合データ型を選択できます。
精度
フィールドの合計有効桁数。
スケール
小数点以下の桁数。
配列の要素タイプ
現在の配列要素のデータ型。
配列の要素精度
現在の配列要素の精度。ターゲットデータの作成時に使用されます。
配列の要素スケール
現在の配列要素のスケール。ターゲットデータの作成時に使用されます。
構造名
現在の構造フィールドの構造名。
要素の構造名
構造フィールドの現在の配列における要素の構造名。
説明
フィールドとその用途の説明(オプション)。
注: 表示される出力フィールドプロパティは、データ型によって異なります。
集計オプション 親フィールドを除くすべての出力フィールドには、設定可能な集計オプションがあります。次の表に、集計オプションを示します。
プロパティ
説明
このフィールドを使用して、出力フィールド配列に値を集計します。
このプロパティを選択して、出力データを現在のフィールドに集約します。
出力フィールド
集計する場合は、集計するフィールドを持つ兄弟配列を指定します。配列は、現在の出力フィールドまたはグループの子である必要があります。
出力フィールド配列の値の集計 階層プロセッサトランスフォーメーション出力に配列が含まれている場合は、出力フィールドを追加して配列内の値を集計することをお勧めします。出力フィールドは、配列フィールドの兄弟である必要があります。
例えば、Outputグループに注文情報を含む配列が含まれているとします。Orders配列には、それぞれの注文の価格が格納されたOrderPriceフィールドが含まれています。それぞれの会社の合計注文価格を検索する必要があります。
次の図に、出力フィールドを示します。
合計注文価格を見つけるには、TotalOrderPriceというフィールドを出力グループに追加します。
TotalOrderPriceフィールドを編集します。[このフィールドを使用して、出力フィールド配列に値を集計します] を選択し、値を集計する出力フィールドとして[Orders]配列を選択します。TotalOrderPriceフィールドに次の式を設定します。
SUM(:fld.{Output.Orders.Orders.OrderPrice})
データソースの設定 出力グループと、出力内のすべての配列および構造フィールドのデータソースを設定できます。データソースは、出力グループまたは出力フィールドのプリミティブ子フィールドにデータを入力する入力グループまたは受信配列を識別します。
データソースとしてフィールドを選択すると、次のオブジェクトにアクセスできます。
• すべてのプリミティブな子• すべての祖先のプリミティブな子• 配列の子の個々の要素• 祖先の配列の子の個々の要素出力グループまたは出力フィールドには複数のデータソースを設定できます。この設定を行う場合は、データを結合するための結合条件を設定する必要があります。
特定のレコードを除外するようにフィルタを設定できます。また、データを集計するためのグループ化フィールドと、レコードをソートするためのソート順フィールドを指定することもできます。
階層出力グループおよびフィールドのデータソースは、出力データ構造によって異なります。
親からのデータソースの継承 配列フィールドまたは構造フィールドのデータソースを設定する場合、受信データを使用するか、親のデータソースを継承することで、フィールドの子にデータを入力できます。
受信データを使用する場合、その受信データは配列または構造の子にデータを入力するために使用されます。
親のデータソースを継承すると、親の出力フィールドに変換されたデータが配列または構造の子に入力されます。これにより、親フィールドのデータトランスフォーメーション(結合やフィルタなど)が保持されます。フィールドにフィルタを適用してデータをさらにフィルタリングすることはできますが、データソース、結合、グループ化フィールド、またはソート順フィールドを設定することはできません。
例えば、顧客IDが一意である顧客レコードのリレーショナルテーブルからデータを読み取っているとします。受信データには、次のレコードが含まれています。
CustID,Name,Street,City,State,ZIP 00234,Ravindra Singh,123 6th St. Apt. 5A,Boston,MA,02134 14416,Melissa Clark,11 Winding Way,Watch Hill,RI,02891
顧客の住所フィールドを構造に書き込むとします。
次の図に、受信フィールドと出力フィールドを示します。
[出力フィールド]パネルでOutputグループのデータソースをInput に設定し、Address構造のデータソースをInherit parent's data sources (Output) に設定します。マッピングを実行すると、階層プロセッサトランスフォーメーションにより、入力データにCustIDが現れるたびに1つのレコードが作成され、出力の顧客IDに対応する住所データが構造に生成されます。
{ "CustID":"00234", "Name":"Ravindra Singh", "Address":{ "Street":"123 6th St. Apt. 5A", "City":"Boston", "State":"MA", "ZIP":"02134" } } { "CustID":"14416", "Name":"Melissa Clark", "Address":{ "Street":"11 Winding Way", "City":"Watch Hill", "State":"RI", "ZIP":"02891" } }
Address構造のデータソースを
Input に設定した場合、同じ出力を取得するには、構造に次のフィルタ条件を設定する必要があります:
:fld.{Input.CustID} = :fld.{Output.CustID} AND :fld.{Input.Name} = :fld.{Output.Name} .フィルタ条件の設定に関する詳細については、
フィルタ条件の設定 を参照してください。
出力フィールドが親のデータを継承する配列である場合は、階層プロセッサトランスフォーメーションにより、1つの要素を持つ配列が作成されます。
階層出力でのデータソースの設定の例 ネストされた配列を出力に追加し、受信フィールドを保持した場合、作成されるレコードは、出力グループのデータソースの設定方法によって異なります。
例えば、JSONファイル内のメンテナンスレコードのネストされた配列から説明情報を抽出するとします。説明情報は文字列の配列に含まれています。出力データも文字列の配列に含める必要があるとします。
次のサンプルデータは、受信レコードを示しています。
[ { "vehicle": [ { "make": "Toyota", "model": "Corolla", "insurance": { "company": "Allstate", "policy_num": "AS12876" }, "maintenance": [ { "date": "01/01/2020", "description": ["oil filter1", "oil filter2"] }, { "date": "01/08/2020", "description": ["tire rotation1", "tire rotation2"] } ] }, { "make": "Toyota", "model": "RAV4", "insurance": { "company": "Allstate", "policy_num": "AS2033" }, "maintenance": [ { "date": "01/02/2020", "description": ["air filter replacement1", "air filter replacement2"] }, { "date": "01/08/2020", "description": ["battery replacement1", "battery replacement2"] } ] } ] } ]
階層プロセッサトランスフォーメーションで、description配列を出力グループに追加し、[受信フィールドを保持] を選択します。
次の図に、受信フィールドと出力フィールドを示します。
階層プロセッサトランスフォーメーションが出力配列を作成する際に、説明配列のデータソースがInput.vehicle.vehicle.maintenance.maintenance.desc.elem に設定されます。これは、出力配列の情報が入力グループのdesc配列の要素から取得されていることを示します。デフォルトでは、階層プロセッサトランスフォーメーションによって出力グループのデータソースがInput に設定されます。
出力グループのデータソース設定によって、階層プロセッサトランスフォーメーションが出力レコードを作成する方法が決まります。
すべての説明を1つの出力レコードに組み合わせるには、出力グループのデータソースをInput として保持します。これにより、次のような出力が生成されます。
{"description":["battery replacement2","battery replacement1","air filter replacement2","air filter replacement1","tire rotation2","tire rotation1","oil filter2","oil filter1"]}
受信データにvehicleが現れるたびに1つの出力レコードを作成するには、データソースをInput.vehicle.vehicle に設定します。この場合、出力データにはvehicleごとに1つのレコードが含まれます。
{"description":["tire rotation2","tire rotation1","oil filter2","oil filter1"]} {"description":["battery replacement2","battery replacement1","air filter replacement2","air filter replacement1"]}
受信データにmaintenanceが現れるたびに1つの出力レコードを作成するには、データソースをInput.vehicle.vehicle.maintenance.maintenance に設定します。この場合、出力にはmaintenanceレコードごとに1つのレコードが含まれます。
{"description":["oil filter2","oil filter1"]} {"description":["tire rotation2","tire rotation1"]} {"description":["air filter replacement2","air filter replacement1"]} {"description":["battery replacement2","battery replacement1"]}
データソースの競合 階層データを階層データに変換し、出力にマルチレベル配列を追加する場合は、出力グループまたは出力フィールドのデータソースが競合しないようにする必要があります。受信配列とその子孫配列の1つを同じ出力グループまたは出力フィールドのデータソースとして選択すると、競合が発生します。
データソースの競合がある場合、競合を解決するまでトランスフォーメーションは無効のままとなります。さらに、競合を解決するまで、結合、フィルタ、ソート順フィールド、またはグループ化フィールドを設定することはできません。
データソースの競合の例 次の図で出力グループのデータソースとしてArray1とArray2を選択すると、データソースの競合が発生します。
Field1とField2のデータを提供するデータソースを特定する方法がないため、競合が発生します。この場合、階層プロセッサトランスフォーメーションでは競合するデータソースエラーが表示されます。
競合を解決するには、出力グループからいずれかのデータソースを削除します。
出力グループまたはフィールドのデータソースの変更 出力グループと、出力内のすべての配列および構造フィールドには、データソースが必要です。入力グループまたは受信フィールドを出力に追加すると、通常は、階層プロセッサトランスフォーメーションによってデータソースが設定されます。データソースは手動で追加または編集できます。
出力グループのデータソースを設定する手順
1 出力グループの[データソース] アイコンをクリックします。2 出力グループ用に設定されたデータソースがすでに存在するかどうかを調べます。変更が必要な場合は次の手順を続行し、変更が必要ではない場合はダイアログボックスを終了します。3 新しいデータソースを追加するには、[データソースの追加] アイコンをクリックします。4 省略記号アイコンをクリックして、データソースとして使用する入力グループまたは配列を選択します。5 設定を検証します。6 [保存] をクリックします。ヒント: ごみ箱アイコンをクリックして、正しくないデータソースまたは不要なデータソースを削除します。
構造または配列フィールドのデータソースを設定する手順
1 出力グループの[データソース] アイコンをクリックします。2 構造または配列用に設定されたデータソースがすでに存在するかどうかを調べます。変更が必要な場合は次の手順を続行し、変更が必要ではない場合はダイアログボックスを終了します。3 使用するデータソースのタイプを選択します。- 親のデータソースを継承する: 構造または配列の親と同じデータソースを使用します。- 入力グループまたは受信フィールドを使用する: データソースとして使用する入力グループまたは受信フィールドを選択します。4 設定を検証します。5 [Save](保存) をクリックします。ヒント: ごみ箱アイコンをクリックして、正しくないデータソースまたは不要なデータソースを削除します。
出力データの設定 階層出力の場合、データソースの結合条件とフィルタ条件、およびグループ化フィールドとソート順フィールドを設定できます。入力データと出力データの両方で集計できます。
結合条件の設定 出力データのフォーマットが階層の場合は、データソースに結合条件を定義できます。出力グループまたは出力フィールドに複数のデータソースがある場合は、結合条件を設定する必要があります。入力グループまたは受信フィールドからのデータを結合するための結合条件を設定します。
[階層プロセッサ] タブで出力グループの結合条件を設定します。
1 出力グループの [結合条件] アイコンをクリックします。
2 結合条件を追加します。
3 左側のデータソースを選択します。
4 結合タイプを選択します。
- 内部。結合条件に一致する行が含まれます。結合条件に一致しない行は破棄されます。- 左外部。右辺パイプラインのすべての行および左辺パイプラインの一致する行が含まれます。一致しない左辺パイプラインの行は破棄します。- 右外部。左辺パイプラインのすべての行および右辺パイプラインの一致する行が含まれます。一致しない右辺パイプラインの行は破棄します。- 完全外部。結合条件に一致する行および左辺パイプラインと右辺パイプラインのすべての入力データが含まれます。注: 大規模なデータセットで外部結合を選択する場合は、マッピングタスクでSparkドライバのメモリを増やす必要があることがあります。Sparkセッションプロパティの詳細については、「タスク 」を参照してください。
5 右側のデータソースを選択します。
6 [結合条件の設定] をクリックします。
7 フィールドと組み込み関数を選択して式を作成します。
8 式を検査します。
9 [保存] をクリックします。
フィルタ条件の設定 フィルタ条件を定義して、入力データのサブセットを階層プロセッサトランスフォーメーションに投影できます。受信フィールドまたは出力フィールドに基づいてフィルタリングを実行できます。
配列/構造フィールドのデータが出力グループの兄弟フィールドのデータと対応するようにする必要がある場合は、プリミティブフィールドから出力配列/構造フィールドにデータを読み取るようにフィルタ条件を設定します。
フィルタ設定の例 リレーショナルデータを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
製品の詳細を、特定の注文番号に関連付けられている配列に読み込む必要があります。
次の図に、受信フィールドと出力フィールドの構造を示します。
[出力フィールド]パネルで[出力]グループのデータソースを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" } ] }
グループ化フィールドの設定 階層出力の場合、プリミティブ受信フィールドを集計用にグループ化し、入力データのグループごとに1つの行を生成できます。
集計のためにフィールドをグループ化する手順
1 出力グループまたは配列の [グループ化フィールド] アイコンをクリックします。
2 グループ化がすでに存在するかどうかを調べます。変更が必要な場合は次の手順を続行し、変更が必要ではない場合はダイアログボックスを終了します。
3 [新規グループ化フィールドの追加] アイコンをクリックして、グループ化する新しいフィールドを追加します。
4 省略記号アイコンをクリックして、グループ化に追加するプリミティブフィールドを選択します。
5 設定を検証します。
6 [保存] をクリックします。
ソート順フィールドの設定 出力データ形式が階層の場合、出力のソート順を定義できます。
注: ソート操作が有効になるためには、次の条件を満たす必要があります。
• 階層プロセッサトランスフォーメーションがターゲットトランスフォーメーションに直接接続されている。• すべてのソートフィールドがターゲットトランスフォーメーションに接続されている。• 接続されたソート順フィールドのデータタイプがターゲットフィールドのデータタイプと一致する。[階層プロセッサ] タブでソート順フィールドを設定します。
1 出力グループまたは配列/構造フィールドの [ソート順フィールド] アイコンをクリックします。
2 ソート基準となる受信データを追加し、データを昇順または降順にソートします。
3 フィールドを並べ替えて、ソート順を調整します。
4 設定を検証します。
5 [保存] をクリックします。
式の設定 階層プロセッサトランスフォーメーションで式を定義して、カスタマイズされたリレーショナル出力または階層出力を作成できますが、フラット化された出力を作成することはできません。また、式を使用してフィルタ条件を定義します。
階層プロセッサトランスフォーメーションは、さまざまなデータセットからの情報を処理できます。一部のフィールド名は、異なるデータセット間で一意ではない場合があります。その結果、同じフィールド名が別のデータセットまたは同じデータセットの階層内で使用される可能性があるため、フィールドをその名前で単純に参照することはできません。
階層プロセッサトランスフォーメーションの式の構文は、式トランスフォーメーションで使用される構文とは異なります。
階層プロセッサトランスフォーメーションでフィールドを参照するには、次の構文を使用します。
: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 次のいずれかのアクションを実行して、出力フィールドを作成します。
a 受信フィールドを出力として使用するには、受信フィールドの上にカーソルを合わせると表示される [追加] リンクをクリックします。 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
リレーショナルから階層型への例 2つの発注書テーブルと顧客住所テーブルからの顧客販売データを使用して、階層形式の発注書ファイルを作成する必要があるとします。
階層プロセッサトランスフォーメーションを使用して、階層形式で発注書を作成します。
POHeaderテーブルには、顧客からの注文に関する基本情報が含まれています。
OrderNumber
コメント
OrderDate
ConfirmDate
1
AppD for POD4
2020-10-01 00:00:00.0
2020-10-02 00:00:00.0
2
GoJS for IICS
2020-10-12 00:00:00.0
2020-10-12 00:00:00.0
住所テーブルには、各注文の顧客の住所情報が含まれています。
OrderNumber
AddressType
名前
街路
City
状態
国
Zip
1
ShipTo
Tom
2100 Seaport Blvd
Redwood City
CA
USA
94063
1
BillTo
Tom
2100 Seaport Blvd
Redwood City
CA
USA
94063
2
ShipTo
Bill
1630 S Delaware St
San Mateo
CA
USA
94402
2
BillTo
Bill
PO Box 313
San Mateo
CA
USA
94402
PODetailテーブルには、顧客の発注書に関する詳細が含まれています。
OrderNumber
ItemNum
ProductName
Quantity
Price
コメント
ShipDate
PartNum
1
1
AppD Agent for JVM
60
500
JVMエージェント
2020-10-15 00:00:00.0
1
1
3
ELBエージェント
10
200
ELBエージェント
2020-10-15 00:00:00.0
3
1
2
MySQLエージェント
2
120
MySQLエージェント
2020-10-16 00:00:00.0
2
1
4
MySQLエージェント
2
120
MySQLエージェント
2020-10-01 00:00:00.0
2
1
5
MySQLエージェント
2
120
MySQLエージェント
2020-10-01 00:00:00.0
2
2
1
GOJS OEM版
2
20000
GOJS開発者
2020-10-19 00:00:00.0
101
2
2
GOJSプロフェッショナルサービス
5
5000
GOJS開発者
2020-10-19 00:00:00.0
102
階層形式で注文書を作成するには、次の手順を実行します。
1 手順1.マッピングを設計します。2 手順2.出力グループを作成し、構造を作成します。3 手順3.構造の配列を作成します。4 手順4.出力データを集計します。5 手順5.構造の配列を作成し、データソースを結合します。6 手順6.マッピングを実行します。手順1。マッピングを設計します 最初の手順として、Mapping Designerで、ソースおよびターゲットのトランスフォーメーションを使用して階層プロセッサを設定します。
Mapping Designerで次の手順を実行します。
1 階層プロセッサトランスフォーメーションを追加し、出力データ形式を階層型に変更します。2 [POHeader]、[PODetail]、および[Address]テーブルをソースオブジェクトとして追加します。3 ソースオブジェクトをデータフローの階層プロセッサトランスフォーメーションに接続します。4 階層プロセッサトランスフォーメーションで、[PurchaseOrder]出力グループを追加し、ターゲットオブジェクトをデータフローで接続します。マッピングは次の図のようになります。
手順2。出力グループを作成し、構造を作成します 基本的なマッピングを設定した後に、次は出力グループを作成します。
次の手順を実行して、基本的な発注書データを含む出力グループを作成し、配送先住所を追加します。
1 [POHeader]からのすべての入力フィールドを[PurchaseOrder]出力グループに追加します。2 次のプロパティを持つ新しい出力フィールドを追加します。プロパティ
値
子
PurchaseOrder
名前
shipToAddress
タイプ
struct
構造名
address_struct
3 [Address]からのすべての入力フィールドを出力グループの[shipToAddress]構造に追加します。4 出力グループで不要な次のフィールドを削除します。- PurchaseOrder.shipToAddress.OrderNumber- PurchaseOrder.shipToAddress.AddressType5 PurchaseOrder.shipToAddress構造のフィルタ条件を追加します。:fld.{Address.OrderNumber}=:fld.{PurchaseOrder.OrderNumber} AND :fld.{Address.AddressType}='ShipTo'.
手順3。構造の配列を作成します 構造のitems配列に発注書の詳細を追加して、出力の設定を続けます。項目番号で並べ替え、部品番号でグループ化し、入荷数量と入荷価格を集計するようにデータ処理ストラテジを設定します。
以下の手順を実行します
1 次のプロパティを持つ新しい出力フィールドを追加します。プロパティ
値
子
PurchaseOrder
名前
Items_arr
タイプ
array
配列の要素タイプ
struct
要素の構造名
item_str
2 [PODetail]からのすべての入力フィールドを出力グループの[Items_arr]配列に追加します。3 出力グループで不要な次のフィールドを削除します: PurchaseOrder.Items_arr.OrderNumber。4 [PurchaseOrder.Items_arr]配列のフィルタ条件[:fld.{PODetail.OrderNumber}=:fld.{PurchaseOrder.OrderNumber}] を追加します。5 [PurchaseOrder.Items_arr]配列のグループ化フィールドを次のように設定します: PODetail.PartNum。6 [PurchaseOrder.Items_arr]配列の昇順のソート順フィールドを次のように設定します: PODetail.ItemNum。7 [PurchaseOrder.Items_arr]配列の[PODetail.Quantity]のフィールド式をSUM(:fld.{PODetail.Quantity}) に更新して、数量を集計します。8 [PurchaseOrder.Items_arr]配列の[PODetail.Price]のフィールド式をSUM(:fld.{PODetail.Price}) に更新して、価格を集計します。以下の図は、出力グループの[Items_arr]配列のデータ設定アイコンと式を示しています。
手順4.出力データを集計します 出力データを集計して合計価格を計算します。
次の手順を実行して、特定の発注書のすべての項目を集計します。
1 次のプロパティを持つ新しい出力フィールドを追加します。プロパティ
値
子
PurchaseOrder
名前
TotalPrice
タイプ
bigint
集計オプション: このフィールドには、出力フィールド配列の値が集計されます
有効
出力フィールド
Items_arr
以下の図は、[TotalPrice]出力フィールドの集計オプションを示しています。
2 PurchaseOrder.TotalPriceに次のフィールド式を設定して、合計価格を集計します。SUM(:fld.{PurchaseOrder.Items_arr.item_str.Quantity}*:fld.{PurchaseOrder.Items_arr.item_str.Price})
手順5.構造の配列を作成し、データソースを結合します 構造の[SameDayItems]配列を追加して設定します。フィルタ、結合、およびフィールド式を使用して、同じ日に注文および出荷された項目のみを出力します。
以下の手順を実行します。
1 次のプロパティを持つ新しい出力フィールドを追加します。プロパティ
値
子
PurchaseOrder
名前
SameDayItems
タイプ
array
配列の要素タイプ
struct
要素の構造名
sameday_str
2 [PODetail]からのすべての入力フィールドを、出力グループの[SameDayItems]配列に追加します。3 出力グループで不要な次のフィールドを削除します: PurchaseOrder.SameDayItems.OrderNumber。4 [PurchaseOrder.SameDayItems]配列のデータソースとして[POHeader]を追加します。5 次のプロパティを使用して、[PurchaseOrder.SameDayItems]配列の結合条件を追加します。プロパティ
値
左グループ
POHeader
結合タイプ
内部
右グループ
PODetail
結合条件
:fld.{POHeader.OrderDate}=:fld.{PODetail.ShipDate} AND :fld.{POHeader.OrderNumber}=:fld.{PODetail.OrderNumber}
以下の図は、[SameDayItems]のデータソースと結合条件を示しています。
6 [PurchaseOrder.SameDayItems]配列にフィルタ条件を追加します。:fld.{PODetail.OrderNumber}=:fld.{PurchaseOrder.OrderNumber}
。 手順6.マッピングを実行します 最後の手順として、マッピングタスクを作成して実行し、JSON出力を生成します。
以下の手順を実行します。
1 マッピングタスクを作成します。2 マッピングタスクを実行します。3 出力を確認します。ヒント: マッピングタスクの詳細については、「タスク 」ガイドを参照してください。
次のJSONは、マッピングを実行した後の[PurchaseOrder]ターゲット出力を示しています。
{ "OrderNumber": "1", "Comment": "AppD for POD4", "OrderDate": "2018-10-01 00:00:00.0", "ConfirmDate": "2018-10-02 00:00:00.0", "address_struct": { "Name": "Tom", "Street": "2100 Seaport blvd", "City": "Redwood City", "State": "CA", "Country": "USA", "Zip": "94063" }, "Items_arr": [{ "itemNum": "1", "ProductName": "AppD Agent for JVM", "Quantity": 60, "price": 500, "comment": "JVM agents", "shipDate": "2018-10-15 00:00:00.0", "PartNum": "1" }, { "itemNum": "2", "ProductName": "MySQL agents", "Quantity": 6, "price": 360, "comment": "MySQL agents", "shipDate": "2018-10-15 00:00:00.0", "PartNum": "2" }, { "itemNum": "3", "ProductName": "ELB agents", "Quantity": 10, "price": 200, "comment": "ELB agents", "shipDate": "2018-10-16 00:00:00.0", "PartNum": "3" }], "TotalPrice": 34160 } { "OrderNumber": "2", "Comment": "GoJS for IICS", "OrderDate": "2018-10-12 00:00:00.0", "ConfirmDate": "2018-10-12 00:00:00.0", "address_struct": { "Name": "Bill", "Street": "23rd Ave", "City": "San Mateo", "State": "CA", "Country": "USA", "Zip": "94401" }, "Items_arr": [{ "itemNum": "1", "ProductName": "GOJS OEM Edition", "Quantity": 2, "price": 20000, "comment": "GOJS Dev", "shipDate": "2018-10-19 00:00:00.0", "PartNum": "101" }, { "itemNum": "2", "ProductName": "GOJS Prefessional Service", "Quantity": 5, "price": 5000, "comment": "GOJS Dev", "shipDate": "2018-10-19 00:00:00.0", "PartNum": "102" }], "TotalPrice": 65000 }
階層型から階層型の例 階層データの既存のファイルを使用して、階層形式の顧客注文ファイルを作成するとします。
既存の顧客注文ファイルCompanyOrdersには、注文を行った会社の名前、注文した商品の価格、日付、配送先住所、ID番号といった各注文に関する情報が含まれています。
次の図に、CompanyOrdersファイルの構造を示します。
配送先住所を構造に再構築し、それぞれの会社のすべての注文の合計価格を計算するフィールドを追加するとします。
次の手順を実行して、ターゲットファイルを作成および設定します。
1 手順1.マッピングを設計します。2 手順2.出力グループを設定します。3 手順3.合計価格を集計するための出力フィールドを作成します。4 手順4.注文先住所の出力構造を作成します。5 手順5.マッピングを実行します。手順1。マッピングを設計します 最初の手順として、Mapping Designerで、ソースおよびターゲットのトランスフォーメーションを使用して階層プロセッサを設定します。
Mapping Designerで次の手順を実行します。
1 CompanyOrdersファイルをソースオブジェクトとして追加します。2 階層プロセッサトランスフォーメーションをマッピングに追加し、CompanyOrdersを入力ソースとして接続します。3 階層プロセッサトランスフォーメーションで、出力データ形式を階層型に変更します。これにより、出力グループが作成されます。4 ターゲットトランスフォーメーションをマッピングに追加し、階層プロセッサトランスフォーメーションの出力をこのターゲットオブジェクトに接続します。次の図は、マッピングがどのようになるかを示しています。
手順2。出力グループを設定します 基本的なマッピングを設定した後に、すべての受信フィールドを追加して出力グループを作成します。
階層プロセッサトランスフォーメーションで次の手順を実行します。
1 入力から出力グループにすべての受信フィールドを追加します。[受信フィールドを保持] に[追加] を設定します。次の図に、[フィールドの追加] ダイアログを示します。
2 出力グループのデータソースが[入力] に設定されていることを確認します。手順3。合計価格を集計するための出力フィールドを作成します 各会社のすべての注文の合計価格を計算する階層プロセッサトランスフォーメーションで出力フィールドを作成します。
以下の手順を実行します。
1 次のプロパティを持つ新しい出力フィールドを追加します。プロパティ
値
子
出力
名前
TotalOrdersPrice
タイプ
double
集計オプション
有効
出力フィールド
Orders
以下の図に、[TotalOrdersPrice]出力フィールドの集計オプションを示します。
2 Output.TotalOrdersPriceに次のフィールド式を設定して、会社のすべての注文の合計価格を集計します。SUM(:fld.{Output.Orders.Orders.OrderPrice})
手順4.注文先住所の出力構造を作成します 出力で注文先住所の構造を作成し、不要なフィールドを出力から削除します。
以下の手順を実行します。
1 次のプロパティを持つ新しい出力フィールドを追加します。プロパティ
値
子
Output.Orders.Orders
名前
OrderAddress
タイプ
struct
構造名
住所
2 OrdersからOrderAddressにすべての受信フィールドを追加します。[追加] を[プリミティブ単一オカレンスの子の追加] に設定します。3 OrderAddressのデータソースを[出力を使用] に設定します。4 不要な次のフィールドをOrderAddress構造から削除します。- Output.Orders.Orders.OrderAddress.OrderPrice- Output.Orders.Orders.OrderAddress.OrderDate5 不要な次のフィールドをOrders出力グループから削除します。- Output.Orders.Orders.Street- Output.Orders.Orders.City- Output.Orders.Orders.State- Output.Orders.Orders.Country- Output.Orders.Orders.ZipCode次の図に、OrderAddress構造を示します。
手順5.マッピングを実行します 最後の手順として、マッピングタスクを作成して実行し、JSON出力を生成します。
以下の手順を実行します。
1 マッピングタスクを作成します。2 マッピングタスクを実行します。3 出力を確認します。ヒント: マッピングタスクの詳細については、「タスク 」ガイドを参照してください。