オフィスに到着すると、ETLエンジニアとしての新しいプロジェクトへの移行のニュースに迎えられました(その意味はわかりませんが、まあまあです)。 さて、試してみると思います。 私の前では、一人の男がそこで働いていましたが、いつものように、私は仕事についての多くの助けを待ちませんでした。 それでは始めましょう。
ETLとは何ですか? wikiの内容は次のとおりです。
ETL(英語から。抽出、変換、ロード-文字通り「抽出、変換、ロード」)は、データウェアハウスを管理する主なプロセスの1つです。
- 外部ソースからのデータの抽出。
- ビジネスモデルのニーズを満たすための変換と精製(英語のデータクレンジング)。
- そしてそれらをデータウェアハウスにロードします。
これにより、多かれ少なかれ明確だと思います。 私のタスクの本質は、特定の.xlsドキュメントからデータを抽出し、タイプごとに変換し(ほとんどのフィールドは文字列として定義されています)、何かを計算し(特定のケースに応じて)、データベースにすべてを書き込むことでした。 スタースキーマをキャストした後、同じwikiでそれが何であるかを読むことができます 。
など。 タスクを整理しました。 仕事のために、 Talent Open Studioが使用され 、どのように何をすべきかの例を掘り下げました。 そして、私のペーストの非常に長く退屈な仕事が始まりました。
以下は、データを変換してデータベースに書き込むための簡単な例です。
- プロジェクトが作成されています。
- データソースが追加されます。 (この例では.xmlドック);
- データレシーバーが追加されます(MySQLのテーブル)。
- 新しいジョブを作成します。
- ソースと受信者、およびtMap環境のコンポーネントをそこにスローします。
- その中で、各フィールドのデータ変換を規定しています(たとえば、エンベロープtoInt || toFloat、「%」などの余分な文字を削除します。
- パフォーマンスでジョブをクリックすると、結果がわかります。
これは、TOSのジョブの簡単な例が視覚的にどのように見えるかです。
データの有効性、解析などについて、かなり長いチェックを書かなければならない場合がありました。 このようないくつかのタスクと厄介なコピーと貼り付けの後、このIDEで判明したように、プロセスを最適化するアイデアが成熟し、独自の静的パブリッククラスを作成することができます。 データ変換の最初のクラスは、数分で作成されました。 そして、一度に鉱山からの労働の量は時々減少しました。 たとえば、コピーアンドペーストするたびに:
obj.toString().equals("#") || obj.toString().equals("") || obj==null ? null
Integer.parseInt(StringHandling.EREPLACE(obj.toString().replace(" ", "").substring(0,obj.toString().replace(" ", "").indexOf(".")),"\\xA0", ""))
その後、すべてが1行で行きました
routines.Convert.toInteger(obj)
しかし、彼らが言うように、特にいくつかのデータでいくつかの操作を実行する必要がある場合、さらに以前のミサゴからのデータを操作する必要がある場合は、すべてがそれほど単純ではありません.Talent Open Studioでは、データは配列全体ではなく文字列によって転送され、アクセスを取得します以前のミサゴへの挑戦はそれほど単純ではありませんが、むしろバッファのコンポーネントを使用する以外に方法を見つけませんでした。
より具体的には、次のタスクがあります。「Year」、「Quarter」、「StartsFromJan1」、「SomeValue1」、「SomeValue2」、「SomeValue3」というフィールドを持つ値のセットがあり、StartsFromJan1フィールドは値「Y」(true)を取ることができます「N」(偽)。
「StartsFromJan1」フィールドの値が「Y」(true)の場合、この行はいくつかのルールに従って処理する必要があります。「N」の場合はそのままにしてください。 たとえば、次のように処理を行うことができます:StartsFromJan1 == Nフィールドの値が含まれている場合、もう1つマイナス1行を減算するという事実を考慮して、前の行の対応するセルが現在の行のセルから削除されます(Q4の場合はQ3を減算します) Q1に到達しますが、フィールドStartsFromJan1 == Yが取得された行にある場合、それで停止します。明確にするために、データの例を示します。
年 | 四半期 | StartsFromJan1 | Somevalue | Somevalue |
---|---|---|---|---|
2009 | Q1 | N | 3000 | 4000 |
2009 | Q2 | Y | 3500 | 5000 |
2009 | Q3 | N | 4000 | 6000 |
2009 | Q4 | Y | 5000 | 7000 |
2009 | Q1 | N | 3500 | 4400 |
2009 | Q2 | Y | 3400 | 5600 |
2009 | Q3 | N | 4500 | 6500 |
2009 | Q4 | Y | 5600 | 7800 |
私たちの場合、最初のものは変更されずに残り、最初のものを2番目のものから取り除き、3番目のものには触れず、4番目から3と2を取ります
タスクを開発するとき、次の問題
- 「StartsFromJan1」フィールドが値「Y」をとる場合のデータの計算
- 空白行のふるい分け
- 手作業を最小限に抑える
最初の問題を解決するために、同じ静的クラスが助けになりました。 3つの1次元配列(3つ、Quarter == Q1のフィールドは常にフィールド「StartsFromJan1」の値「N」を持っているため)を使用して、Int型の特定の変数を作成しました。並んで、次の無効化されたものに進みます。 次に、入力データを変換して配列に書き込むメソッドが作成され、Q4からQ1に切り替えると配列もリセットされます。 最後のメソッドでは、入力パラメーターをカウントする必要があるかどうかを確認するために配列からデータを引き出すのに忙しかったので、メソッドを呼び出して配列に追加し、カウント値または非カウント値(「StartsFromJan1」パラメーターによる)を返しました。
さらに、tMapコンポーネントでは、このメソッドが呼び出され、値「StartsFromJan1」、「Quarter」、「someValue」が渡されました...
空の行の問題...最初はファイルから読み込む行数をカットしましたが、このソリューションは時間の経過とともにデータ量が増加するため一時的なものでした。ソリューションはtFilterRowコンポーネントの形式で提供されました。 = null || Year!= ""、条件を満たすすべての値はtMapで実行されました。
説明された最適化を実行した後、1つのデータセットの開発時間は数桁短縮され、作業量も大幅に減少しましたが、特にコピーアンドペーストに関しては、同じ長期の作業を行うことを非常に嫌がったため、すべてが行われました。