2016-10-13 8 views
0

私はPentahoで新しく、私は助けが必要です。Pentaho:列名を自動的に読み込み、変数に保存する方法は?

私はデータベーステーブルからデータを取得しています。そして、これらのテーブルのカラム数を数え、その名前を変数に保存する必要があります。誰かがこれを作る方法を知っていますか?または、Java Scriptのステップで列名を読み取る方法は?ご協力ありがとうございました。

+0

:あなたは次のような出力が表示されますログに

// get instance of RowMetaInterface, which represents metadata of your input row: var rowMetaInterface = getInputRowMeta(); // get List of ValueMetaInterface objects, which represent each of your input fields: var valueMetaList = rowMetaInterface.getValueMetaList(); // get this object to be able to iterate over the list: var iterator = valueMetaList.iterator(); // I am going to save all results into this JS object, then convert it to JSON string and pass into a variable var allFields = []; while (iterator.hasNext()) { // get current ValueMetaInterface object: var valueMetaInterface = iterator.next(); // The name of current field: var fieldName = valueMetaInterface.getName(); // getType() returns just an internal integer number of the type: var typeIndex = valueMetaInterface.getType(); // typeName will hold the actual String name of the type: var typeName = org.pentaho.di.core.row.ValueMetaInterface.typeCodes[typeIndex]; // You proabably don't need the following part. It is here just for illustration purpose: // Prepare data to be converted to JSON: var field = {}; // wrap Java String into a JavaScript String object to be able to convert them into Json field.fieldName = String(fieldName); field.fieldType = String(typeName); allFields.push(field) } var allFieldsJson = JSON.stringify(allFields); /* scope of the variable: "s": System scope "r": root "p": parent "g": grandparent*/ var variableScope = "r"; setVariable("inputFields", allFieldsJson, variableScope); writeToLog("b", "JSON string:"); writeToLog("b", allFieldsJson); // In other job/transformation you'll be able to parse json object into a javascript object back: var fields = JSON.parse(allFieldsJson); for (var i = 0; i < fields.length; i++) { fieldName = fields[i].fieldName; fieldType = fields[i].fieldType; writeToLog("b", "Field number " + i + ":"); writeToLog("b", fieldName); writeToLog("b", fieldType); } 

変数を変数に格納することは、奇妙ではありませんが、不可能ではありません。なぜあなたはこれをしたいのですか?どのように変数の名前を付ける予定ですか? – matthiash

答えて

2

まず、あなたが設定/変更した同じ変換では、変数値が表示されないことに注意してください。基本的には、変換のための変数値が初期化時に読み込まれます。したがって、親/祖父母ジョブの変数値は変更できますが、同じ変換は変更できません。

オプション1(ストリームステップのメタデータ構造):

  • ポジション:ポジションを

    1つのオプションは、http://wiki.pentaho.com/display/EAI/Metadata+Structure+of+Stream ステップは、あなたの次のフィールドを与えるストリームステップのメタデータ構造を使用することですインバウンドデータストリームのフィールド名

  • フィールド名:インバウンドデータストリーム内のフィールド名
  • コメント:未入力
  • 型:文字列、整数、数など
  • 長さ:フィールド長
  • 精度: 整数、番号の適用-1ならない適用(例えば文字列)
  • 原点:メタデータが派生したステップ。

その後、このステップの出力を使用して変数値を設定できます。

オプション2(Javascriptを):

JavaスクリプトステップはRowMetaInterfaceオブジェクトを返すgetInputRowMeta()機能 を持っています。

さらにのリストを返すgetValueMetaList()メソッドを呼び出すことができます。次に、リスト内のすべての項目を繰り返し処理し、オブジェクトごとにgetName()を呼び出して、各入力フィールドの名前を取得できます。

例(ここでは、コードのほとんどは、単に出力を説明するために実際にある):あなたが数を知らないので

2016/10/13 15:33:09 - Modified Java Script Value.0 - Optimization level set to 9. 
2016/10/13 15:33:09 - Modified Java Script Value.0 - JSON string: 
2016/10/13 15:33:09 - Modified Java Script Value.0 - [{"fieldName":"test","fieldType":"String"},{"fieldName":"test 2","fieldType":"Integer"},{"fieldName":"another field","fieldType":"BigNumber"}] 
2016/10/13 15:33:09 - Modified Java Script Value.0 - Field number 0: 
2016/10/13 15:33:09 - Modified Java Script Value.0 - test 
2016/10/13 15:33:09 - Modified Java Script Value.0 - String 
2016/10/13 15:33:09 - Modified Java Script Value.0 - Field number 1: 
2016/10/13 15:33:09 - Modified Java Script Value.0 - test 2 
2016/10/13 15:33:09 - Modified Java Script Value.0 - Integer 
2016/10/13 15:33:09 - Modified Java Script Value.0 - Field number 2: 
2016/10/13 15:33:09 - Modified Java Script Value.0 - another field 
2016/10/13 15:33:09 - Modified Java Script Value.0 - BigNumber 
2016/10/13 15:33:09 - Modified Java Script Value.0 - Finished processing (I=0, O=0, R=1, W=1, U=0, E=0) 
関連する問題