Javaを用いたピボットデータの変換


Javaの変換は非常に有益です.しかし、Java変換についてのウェブ上の例はあまりありません.ほとんどのマッピングではJava変換を必要としないからです.しかし、いくつかのケースでは、Javaの変換を使用してマッピングを簡単かつ簡単になります.このブログでは、Java変換をピボットデータに使用する例を示します.
次のようなソースデータを持っているとします
ソース
偏見
名称
主題
スコア
1001
アリス
数学
100
1001
アリス
英語
85
1002
ボブ
数学
98
1002
ボブ
英語
95
1002
ボブ
科学
90
1003
クリス
数学
95
1003
クリス
科学
90
1003
クリス
英語
80
次のようにしてください.
偏見
名称
数学
英語
科学
1001
アリス
100
85
0
1002
ボブ
98
95
90
1003
クリス
95
80
90
通常、あなたは、これを達成するために式、ソーターとアグリゲータ変換を使わなければならないでしょう.このようにウェブ上で多くの議論を見つけることができます.それは動作しますが、特にターゲットが多くの列と多くの異なる集約を持っているとき、それは退屈で、unmaintainableです.
Java変換を使用してソースデータをピボットする手順を示します
Step 1 -ソース"PhystCount TestCone - src "とターゲット"PhystCount TestCount Tgt "を持つマッピングを作成する

ステップ2 - Create Transformationウィンドウで、リストからJavaを選択し、変換の名前を入力します

次にアクティブ型を選択します.アクティブ型では、入力行の数は出力行の数と異なる場合があります.

手順3 - Java変換にすべてのソース修飾子列をドラッグ&ドロップする

Step 4 - JavaRange FromtRange srcをダブルクリックし、「ポート」タブを選択します.ポート名をstudentid , outtle studentname , outscore MathScore , outtle EnglishScore ,および出力ポートとして出力します.

あなたの仕事を保存します.マッピングは次のようになります.

Step 5 - JavaRangeピボットテーブルのsrcをダブルクリックし、「Javaコード」タブを選択します.デフォルトでは、下の「入力行」タブにあります.

他のタブ“インポートパッケージ”、“ヘルパーコード”、“データの終わりに”など、自己説明です.
この例では、Java HashMapを使用して、学生名、件名、およびそのスコアを保存します.キーは名前、数学、英語、および科学(ターゲットの列名)と値です.
                             Name ->  student_name
                             Math ->  math_score
                          English -> English_score
                          Science -> science_score
HashMapは他のHashmap ( AllRecords )に埋め込まれます.ここでkeyは学生IDです.
                            |-->  Name ->  student_name
               Student_id-> |-->  Math ->   math_score
                            |--> English ->  English_score
                            |-->  Science-> science_score
このアイデアに基づいて、次の2行を「インポートパッケージ」タブに入れます.
import java.util.HashMap;
import java.util.Map;
「ヘルパーコード」を選択し、Javaコードで必要な変数を宣言します.
private HashMap<String, HashMap<String, Object>> allRecords= new HashMap<String, HashMap<String, Object>>();
static int inputRows=0;
static int outputRows=0;
「入力行に」タブを選択し、次のコードを書き込みます.
             HashMap<String, Object> subjectSore;
             if (!isNull("STUDENTID")) {
                inputRows += 1;
                if (allRecords.containsKey(STUDENTID)) {
                    subjectSore = allRecords.get(STUDENTID);
                    subjectSore.put(SUBJECT, SCORE);
                } else { //build new key value pair
                    subjectSore = new HashMap<String, Object>();
                    subjectSore.put("Name", NAME);
                    subjectSore.put("Math", null);
                    subjectSore.put("English", null);
                    subjectSore.put("Science", null);
                    subjectSore.put(SUBJECT, SCORE);
                    //add subjectSore to hashmap
                    allRecords.put(STUDENTID, subjectSore);
                }
              }
タブで次のコードを出力します.
HashMap<String, Object> outsubjectSoreMap;
for (Map.Entry<String, HashMap<String, Object>> entry : allRecords.entrySet()) {
                outsubjectSoreMap = entry.getValue();
                out_studentId = entry.getKey(); //get("STUDENTID");
                out_studentName = (String) outsubjectSoreMap.get("Name");


                if (outsubjectSoreMap.get("Math") == null) {
                    out_mathSore = "";
                } else {
                    out_mathSore = (String) outsubjectSoreMap.get("Math");
                }

                if (outsubjectSoreMap.get("English") == null) {
                    out_englishSore = "";
                } else {
                    out_englishSore = (String) outsubjectSoreMap.get("English");
                }

                if (outsubjectSoreMap.get("Science") == null) {
                    out_scienceScore = "";
                } else {
                    out_scienceScore = (String) outsubjectSoreMap.get("Science");
                }

               generateRow();
               outputRows +=1;
            } // end for loop: output records  
            allRecords.clear();  //release memory
            logInfo("The total number of records generated is: " +  outputRows);

            inputRows=0; 
            outputRows=0; 
generateRow() は、定義された出力ポート値に従って行を生成するPowerCenter Java APIです.
入力レコードがあまりにも多くのhashmapに保持する場合は、使用することができますgenerateRow() タブでいくつかの出力ポートの値を生成し、メモリを解放します.あなたがこれを望むならば、あなたはJava変換の前に入力レコードをソートするためにソート式を必要とします、さもなければ、あなたは出力記録で学生IDを複製するかもしれません.
             HashMap<String, Object> subjectSore;
             if (!isNull("STUDENTID")) {
                inputRows += 1;
                if (allRecords.containsKey(STUDENTID)) {
                    subjectSore = allRecords.get(STUDENTID);
                    subjectSore.put(SUBJECT, SCORE);
                } else { //build new key value pair
                      if (inputRows >=1000) {  // output records when processed 1000 rows  to release memory
                          HashMap<String, Object> outsubjectSoreMap;
                        for (Map.Entry<String, HashMap<String, Object>> entry : allRecords.entrySet()) {
                outsubjectSoreMap = entry.getValue();
                out_studentId = entry.getKey(); //get("STUDENTID");
                out_studentName = (String) outsubjectSoreMap.get("Name");


                if (outsubjectSoreMap.get("Math") == null) {
                    out_mathSore = "";
                } else {
                    out_mathSore = (String) outsubjectSoreMap.get("Math");
                }

                if (outsubjectSoreMap.get("English") == null) {
                    out_englishSore = "";
                } else {
                    out_englishSore = (String) outsubjectSoreMap.get("English");
                }

                if (outsubjectSoreMap.get("Science") == null) {
                    out_scienceScore = "";
                } else {
                    out_scienceScore = (String) outsubjectSoreMap.get("Science");
                }

               generateRow();
               outputRows +=1;
            } // end for loop: output records  
            allRecords.clear();  //release memory
                        }  //end if countRows >= 1000 

                    subjectSore = new HashMap<String, Object>();
                    subjectSore.put("Name", NAME);
                    subjectSore.put("Math", null);
                    subjectSore.put("English", null);
                    subjectSore.put("Science", null);
                    subjectSore.put(SUBJECT, SCORE);
                    //add subjectSore to hashmap
                    allRecords.put(STUDENTID, subjectSore);
                }
              }
Javaコードの内部では、Javaを使用できますSystem.out.println() またはPowerCenter Java APIlogInfo() セッションログで見つかるデバッグ情報をログ出力するには.
文字列を整数に変換し、ターゲットのデータ型にマッチする式変換を追加しました.

それです.
Javaコードが例外になった場合は、セッションログを開き、エラーメッセージを見つけました.例えば、以下のエラーがありました.
JAVA PLUGIN_1762    [ERROR] java.lang.NullPointerException
JAVA PLUGIN_1762    [ERROR]     at com.informatica.powercenter.server.jtx.JTXPartitionDriverImplGen.execute(JTXPartitionDriverImplGen.java:382)
この「JTXPartitionDriverIngengen . java : 382」は、どの行がエラーを起こしたかを正確に示しました.Java変換を開き、「完全なコード」リンクをクリックし、完全なJavaコードでウィンドウをポップアップします.お好みのエディターにJavaコードとペーストをコピーし、エラー行(この例では行番号は382)を行って、エラーが発生した理由を分析します.
上記の例から分かるように、Java変換を使用して日付をピボットする方法は簡単です.Javaの変換は、データを圧縮したり、データを暗号化/復号化するために使用することができますいくつかのフィールドを結合、特別なフィールドを集約し、はるかに.この例では、コードのマイナーな変更を簡単に行うことができます.