データの変換、またはTalent Open Studioでの深化

朝はとても普通で怠け者でした:シャワー、コーヒー、タバコ...それは仕事の準備をする時間です...

オフィスに到着すると、ETLエンジニアとしての新しいプロジェクトへの移行のニュースに迎えられました(その意味はわかりませんが、まあまあです)。 さて、試してみると思います。 私の前では、一人の男がそこで働いていましたが、いつものように、私は仕事についての多くの助けを待ちませんでした。 それでは始めましょう。





ETLとは何ですか? wikiの内容は次のとおりです。

ETL(英語から。抽出、変換、ロード-文字通り「抽出、変換、ロード」)は、データウェアハウスを管理する主なプロセスの1つです。



これにより、多かれ少なかれ明確だと思います。 私のタスクの本質は、特定の.xlsドキュメントからデータを抽出し、タイプごとに変換し(ほとんどのフィールドは文字列として定義されています)、何かを計算し(特定のケースに応じて)、データベースにすべてを書き込むことでした。 スタースキーマをキャストした後、同じwikiでそれが何であるかを読むことができます

など。 タスクを整理しました。 仕事のために、 Talent Open Studioが使用され 、どのように何をすべきかの例を掘り下げました。 そして、私のペーストの非常に長く退屈な仕事が始まりました。



以下は、データを変換してデータベースに書き込むための簡単な例です。





これは、TOSのジョブの簡単な例が視覚的にどのように見えるかです。

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を取ります





タスクを開発するとき、次の問題





最初の問題を解決するために、同じ静的クラスが助けになりました。 3つの1次元配列(3つ、Quarter == Q1のフィールドは常にフィールド「StartsFromJan1」の値「N」を持っているため)を使用して、Int型の特定の変数を作成しました。並んで、次の無効化されたものに進みます。 次に、入力データを変換して配列に書き込むメソッドが作成され、Q4からQ1に切り替えると配列もリセットされます。 最後のメソッドでは、入力パラメーターをカウントする必要があるかどうかを確認するために配列からデータを引き出すのに忙しかったので、メソッドを呼び出して配列に追加し、カウント値または非カウント値(「StartsFromJan1」パラメーターによる)を返しました。

さらに、tMapコンポーネントでは、このメソッドが呼び出され、値「StartsFromJan1」、「Quarter」、「someValue」が渡されました...



空の行の問題...最初はファイルから読み込む行数をカットしましたが、このソリューションは時間の経過とともにデータ量が増加するため一時的なものでした。ソリューションはtFilterRowコンポーネントの形式で提供されました。 = null || Year!= ""、条件を満たすすべての値はtMapで実行されました。



説明された最適化を実行した後、1つのデータセットの開発時間は数桁短縮され、作業量も大幅に減少しましたが、特にコピーアンドペーストに関しては、同じ長期の作業を行うことを非常に嫌がったため、すべてが行われました。



All Articles