0

Pentaho (Spoon / Kettle) を使用して ETL プロセスを実行しています。ここで、XML ファイルを読み取り、要素の値を db に保存します。

これは、「XML からデータを取得」コンポーネントで問題なく機能します...しかし、XML ファイルは非常に大きく、数ギガバイトであり、そのためファイルの読み取りに時間がかかりすぎます。

ペンタホウィキ 言います:

既存の Get Data from XML ステップは使いやすいですが、メモリ処理で必要な DOM パーサーを使用しており、ファイルの一部が非常に大きい場合、ファイルの一部を削除しても十分ではありません。

XML 入力ストリーム (StAX) ステップでは、まったく異なるアプローチを使用して、非常に大きく複雑なデータ構造のユース ケースと、非常に高速なデータ ロードの必要性を解決します...

そのため、私は現在StAXで同じことをしようとしていますが、計画どおりにうまくいかないようです. 要素グループが 1 つしかない XML ファイルでこれをテストしています。ファイルが読み取られ、テーブルにマップ/挿入されます...しかし、すべての値が「未定義」である複数の行と、正しい値を持ついくつかの行をテーブルに取得します。テーブルには 1 行しかないはずなのに、合計で 92 行あります。

フローは次のようになります。

1) StAXで読む

2) 変更された Java Script 値

3) DBへの出力

ステップ 2) では、次のようにしています。

変数 ID;

if ( xml_data_type_description.equals("CHARACTERS") && xml_path.equals("/labels/label/id") ) { id = xml_data_value; } ...

例として、http://forums.pentaho.com/showthread.php?83480-XPath-in-Get-data-from -XML-tool&p=261230#post261230のpositional-staz.zip を使用しています。

XMLファイルを読み取り、要素の値をDBに保存するためにStAXを使用する方法は?

例を探してみましたが、あまり見つかりませんでした。上記の例では、行を挿入する前に "Filter Rows" コンポーネントを使用しています。なぜそれが使用されているのかよくわかりません。必要な値をマップすることはできませんか? Filter Rows コンポーネントを使用していない、または使用方法を知らないために、この問題が発生する可能性があります。

乾杯!

4

1 に答える 1

2

上記のフォーラムに、考えられる StAX ベースのソリューションを投稿しましたが、モデレーターの承認待ちなので、ここに要点を投稿します。

StAX パーサーを使用すると、必要な要素、つまりデータ型が CHARACTERS の要素だけを選択できます。フォーラムの例では、基本的に行を 4 つのセット (EXPR、EXCH、DATE、ASK) で非正規化する必要があります。これを行うには、(シーケンスの追加ステップを使用して) 行番号をストリームに追加し、電卓を使用して「バケット番号」 = INT((rownum-1)/4) を決定します。これにより、Row Denormaliser ステップのグループ化フィールドが提供されます。

投稿が承認されると、StAX と上記の方法を使用する変換へのリンクが表示されます。

これはあなたが探しているものですか?そうでない場合は、私が誤解した場所を教えてください。おそらく私が助けることができます。

于 2012-09-25T17:02:16.167 に答える