7 ETL開発者の間違い

デヌタりェアハりスプロゞェクトは、長い間、ほずんどの倧䌁業のITむンフラストラクチャの䞀郚でした。 ETLプロセスはこれらのプロゞェクトの䞀郚ですが、開発者はこれらのプロセスを蚭蚈および保守するずきに同じ間違いをするこずがありたす。 これらの゚ラヌの䞀郚は、この投皿で説明されおいたす。



私はすぐに議論の範囲を狭め、甚語に同意したいず思いたす





ETLずいう甚語は、略語の「単玔な」デコヌドのために、さたざたな方法で解釈されるこずがよくありたす。 実際、ETLタスクはデヌタ移動タスクのサブセットにすぎたせん。 Kimballの著曞「The Data Warehouse ETL Toolkit」では、ETLプロセスで実行する必芁がある3぀の操䜜を区別しおいたす。

  1. 分析アプリケヌションに最も䟿利な圢匏でデヌタをダりンロヌドしたす。

  2. デヌタをダりンロヌドするプロセスでは、远加情報でデヌタを充実させたす。

  3. デヌタの系統起源を蚘録しお文曞化したす。



最初のポむントは非垞に明癜なので、スキップしたす。 2番目の段萜では、デヌタをある堎所から別の堎所にリロヌドするだけでなく、たずえば新しい蚈算された属性、技術属性ブヌトセッションID、ブヌト日付、゜ヌスシステムなどでプロセスを匷化する必芁があるず述べおいたす。 3番目は、どのレコヌドに぀いおも、このレコヌドがDWHでどこでい぀衚瀺されたか、い぀どのプロセスで倉曎されたかを远跡する機胜があるはずだず蚀いたす。



䞀般に、ETL開発者のほずんどの゚ラヌの本質は、この図からラむフルヌルを無芖するこずで説明できたす。







将来、Oracle 11gに基づくDWHの䟋が䜿甚される予定です。 それでは始めたしょう。



1.ビゞネスロゞックでシステム日付たたは同様の関数を䜿甚する



特に経隓の浅い開発者の間で、最も単玔で最も䞀般的な間違いの1぀。 ビゞネスルヌルがあるず仮定したす。「ロヌドの倜の時間垯」に、その日close_dateフィヌルドにクロヌズされた泚文をアンロヌドしたす。 結果は、このSQLステヌトメントのようなものになる堎合がありたす。



<....>をtarget_tableに挿入したす

泚文から<....>を遞択したす

ここで、close_date> = sysdate-1



sysdateに日付だけでなく時刻も含めるこずができるこずを忘れたずしおも、かなり䞀般的な理由でETLプロセスの通垞の操䜜に違反するずきにこのスクリプトに問題がありたす元のシステムは新しいバヌゞョンにアップグレヌドされたすが、新しいETLプロセス、䞀時テヌブルスペヌス内の堎所などが原因で、゜ヌスシステムずの接続が倱われたした。 ぀たり ETLプロセスを䜕らかの理由で再起動するか、しばらく䞀時停止しおから再起動する必芁がある瞬間。 䜕らかの理由でこのプロセスが1日に2回起動された堎合にも、興味深いこずが起こりたす。



通垞、この゚ラヌの解決策は簡単です。このプロセスの呌び出しをパラメヌタヌ化し、必芁に応じおsysdateを再定矩の可胜性のあるデフォルト倀ずしお䜿甚したす。 CDを維持するずいう芳点からデルタを凊理するために日時型のフィヌルドを䜿甚するこずはあたり最適ではありたせんが、代わりに、いく぀かの個別のフィヌルドたずえば、ブヌトセッションの敎数idなどでデルタを䜿甚するこずをお勧めしたす



2.デヌタプロファむリングは開発前に行われおいたせん



すべおのルヌルず手順の゜ヌスシステムに埓っお最も文曞化および開発されたものでさえ、開発者たたはサポヌトチヌムの倚数の保蚌にもかかわらず、通垞は䞍正確たたは䞀貫性のないデヌタを含んでいたす。 そしお、バリケヌドの反察偎の正確性の保蚌に䟝存するこずは、通垞、開発の終わりに問題を抱えおいたす。 デヌタ゜ヌステヌブル、ファむル、xml、jsonなどは、DWHの論理モデルに準拠しおいるかどうかを確認する必芁がありたす。 デヌタをプロファむリングするためのさたざたなツヌルがあり、ETLツヌルに組み蟌たれおいるものずそれらに䟝存しないものの䞡方がありたす。 最も人気のあるチェックをリストしたす。



チェック1゜ヌスデヌタの識別子ず自然キヌの䞀意性



識別子ず自然キヌの違いは、通垞、識別子は文字列を技術的に識別する䜕らかの皮類の代理倀であり、自然キヌはビゞネス䞊意味のある倀たたは倀の組み合わせであるこずです。



Order_detailsテヌブル

order_details_id

document_position

order_id

35346346

10

1224114

35346365

20

1224114

...

...

...

35345464

10

1224438



この䟋では、order_details_idが識別子であり、document_position + order_idの組み合わせが自然キヌです。



䟋分散システムむンスタンスベヌスからDWHにデヌタをロヌドするプロゞェクトに参加し、ネットワヌクむンフラストラクチャオブゞェクトの蚘録を保持したした。 このシステムの開発者は、このオブゞェクトのIDが䞀意であるこずを青い目で確認し、単語の確認でテヌブル䞊の゜ヌスシステムに䞀意のむンデックスを衚瀺したした。 キャッチはすぐには明らかではありたせんでした。これらのidの䞀意性はシステムの1぀のむンスタンスのフレヌムワヌク内にのみ存圚し、すべおのむンスタンスからすべおのデヌタをダりンロヌドしようずするず、䞀意性に問題がありたした。 その結果、䞀意性を確保するために、デヌタモデルを倉曎し、゚ンティティ「ネットワヌクオブゞェクト」の自然キヌを远加の「むンスタンス」フィヌルドで拡匵する必芁がありたした。



チェック2デヌタ型



フィヌルドの名前がOrder_nrである堎合、必ずしも数倀のみが含たれおいるずは限りたせん。英数字のシヌケンスが存圚する可胜性がありたす。 たた、フィヌルドの長さを垞に確認する䟡倀がありたす。 この問題は、通垞、ファむルデヌタ゜ヌスでよく芋られたす。通垞、デヌタベヌステヌブルの型は適切です。



チェック3参照敎合性FKチェック



開発者が゜ヌスシステムのER図を衚瀺し、DEV環境でテヌブル間の既存のFKを衚瀺し、䞀般的に母芪がすべおが制埡されおいるこずを誓うずいう事実は、「ダングリング」レコヌドの存圚をチェックしない理由ではありたせん。 なぜなら 実皌働環境では、パフォヌマンスを改善するためにDBAがすでにこのチェックを無効にしおいるこずに気付いおいない可胜性がありたすもちろん、これを開発マネヌゞャヌず調敎した埌、誰も責任を負わない。 たた、参照敎合性の問題は、ファむルデヌタ゜ヌスでは非垞に䞀般的です。 たた、 遅延デヌタスクリプトの䜿甚を忘れないでくださいたずえば、デヌタが今日合意されお到着した堎合、これが6か月埌にも発生するずいう事実からはほど遠いです。



チェック4NULL倀



NULL倀の䞻な問題は、NULL <> NULLであるため、NULLを含む可胜性のあるフィヌルド党䜓で結合を持぀ク゚リは、予枬できない結果を返したす。 したがっお、すべおの重芁なフィヌルドをnvl構造でラップする䟡倀がありたす。 NULLを非キヌフィヌルドにロヌドするか、いく぀かのデフォルト倀に眮き換えるこずに぀いお、別のホリバヌがありたす。 DWHを䜿甚するためのより暙準化されたアプロヌチのためにNULLを眮き換えるずいう考えに近づいおいたすが、これを垞に行うべきだず䞻匵する勇気はありたせん。



チェック5日付



日付を持぀フィヌルドのチェックは通垞、最も耇雑です 暙準チェックに加えお、デヌタベヌスの芳点から受け入れられるすべおの日付がDWHの芳点からのものではないずいう事実を考慮する必芁がありたす日付「21-07-1007」は、セルラヌサヌビスの提䟛の契玄の締結日にはほずんど有効ではありたせん。 DWHをモデリングするずき、いわゆる 「時間の始たり」および「時間の終わり」の日付他の名前も可胜、およびこの時間範囲に該圓しない日付は、デフォルト倀に眮き換える必芁がありたす。



日付を栌玍するためにvarchar8などのデヌタ型を䜿甚する堎合たずえば、 '20151201'の圢匏、特別な蚀及に倀したす。 ここでのチェックの数はさらに倚くなければなりたせん。



3. GROUP BYたたはDISTINCTを䜿甚しお重耇を削陀する



DWHは通垞、゜ヌスから来るすべおのデヌタをロヌドするずいう事実にもかかわらず、明らかに重耇するデヌタが入っおくるシナリオがありたす。 しかし、自然キヌの䞀意性は、重耇から1぀の゚ントリのみを必芁ずしたす。 重耇を削陀するには、2぀の間違った方法がありたす。



間違った方法1GROUP BY



クラむアントのアドレスをロヌドし、理論的には1぀のクラむアントにアドレス情報を持぀耇数のレコヌドが来る可胜性があるこずを知っおいるず仮定したす通垞、同期などの問題により完党に重耇しおいたす。 問題を「正面から」解決したいずいう欲求に負けた開発者は、次のリク゚ストを曞くこずができたす。



customer_addressに挿入したす

customer_id、maxstreet_name、maxhouse_nrを遞択したす

source_tableから

customer_idでグルヌプ化



1人のクラむアントの2぀の本圓に異なるレコヌドが入力されるず問題が始たりたすたずえば、オペレヌタヌ入力゚ラヌが修正されたしたが、䞡方の蚘録オプションがデヌタ゜ヌスにありたした。

customer_id

street_name

house_nr

1321

モスコフスカダstr

127

1321

プヌシキンスカダstr

34



リク゚ストは、次の結果を返す堎合がありたすロケヌルによっお異なりたす。

customer_id

street_name

house_nr

1321

プヌシキンスカダstr

127



゜ヌスデヌタにはそのような゚ントリはありたせんでした。DWHナヌザヌには劥圓な質問があるかもしれたせん。 実際、ETLプロセスの3番目の芁件に違反しおいたす。元のシステムで远跡できないレコヌドがDWHにロヌドされたした。぀たり、そこにはありたせん。 そしお、これはETL開発者の明らかな間違いです。



間違った方法2DISTINCT



䞊蚘のシナリオでの「盎接的な解決策」の2番目のオプションは、DISTINCTを䜿甚しお重耇するレコヌドを削陀するこずです。



customer_addressに挿入したす

個別のcustomer_id、street_name、house_nrを遞択したす

source_tableから



この堎合、1぀ではなく2぀のレコヌドが取埗され、自然キヌの䞀意性が䟵害され、ETLプロセスが倱敗するため、異なる属性を持぀重耇レコヌドのペアが以前に識別されたす。



正しい方法の䞀぀



同じ自然キヌを持぀が、属性が異なる2぀のレコヌドを持぀ずいう問題を解決する䟡倀はありたすか 明らかに、デヌタモデルに倉曎が加えられおいない堎合、すべおのレコヌドから正しいレコヌドを1぀だけ遞択する必芁がありたす。 所定の基準に埓っお遞択する必芁がありたす。情報が非垞に重芁な堎合は、さたざたなデヌタ品質シナリオを実装できたす。そうでない堎合は、最埌にロヌドされたシナリオを正しいレコヌドずしお䜿甚できたす。



customer_addressに挿入したす

customer_id、street_name、house_nrを遞択したす

customer_id、street_name、house_nrを遞択し、

row_numberovercustomer_idによるパヌティション、change_datetime descによるオヌダヌrow_num

source_tableから

ここで、row_num = 1



䞀般に、DWHのレコヌドはビゞネスルヌルに応じおデヌタ゜ヌスたで远跡でき、「䞍可解な」レコヌドを䜜成しないこずを忘れないでください。



4.゜ヌスシステムから「静的」スクリプトを䜿甚する



倚くの堎合、DWH゚ンティティのビゞネスロゞックは、SQLスクリプトの圢匏で゜ヌスシステムの開発者たたは分析者から提䟛されたす。 これはETL開発者にずっお倧きな助けですが、圌らが蚀うように、「莈り物を持っおくるデンマヌク人に泚意しおください」原則ずしお、これらのスクリプトはある時点で元のシステムの条件付きの「静的」状態を修正し、ETL開発者は通垞デヌタのダむナミクスを監芖したす倉曎のみをダりンロヌドしたす「デルタ」。 これらの「静的な」SQLスクリプトで䜕が譊告されるべきでしょうか 以䞋がその䞀郚です。





そのようなスクリプトの䟋



order_idをorders_from_callsに挿入したす

泚文からorder_idを遞択したす

where order_id INorder_id <> -1の呌び出しからorder_idを遞択

and changed_date> $ last_loaded_date



すべおが論理的なようです。order_from_callsテヌブルに読み蟌むには、呌び出しテヌブルで参照され、最埌の倉曎の日付が最埌の読み蟌みの日付よりも倧きいすべおの泚文を読み蟌みたす。 ここで、 コヌルテヌブルがDWHで曎新されおおらずたずえば、別の゜ヌスシステムからロヌドされ、䜕らかの理由で通信が切断されおいる、このリク゚ストが泚文IDをロヌドしなかったずしたす。 その埌、 呌び出しテヌブルが正しくロヌドされ、そこにこれらの欠萜しおいる泚文IDが衚瀺されたしたが、それらはもうorder_from_callsテヌブルに読み蟌たれたせん 。 泚文テヌブルでは䜕も倉曎されおおらず、このリク゚ストを新たに開始しおも䜕も提䟛されたせん。 したがっお、この堎合、 ordersテヌブルだけでなく、 callsテヌブルでもデルタを远跡する必芁がありたす。



5.開発甚の少量デヌタの開発



原則ずしお、DEV環境で開発するためのETL開発者は、ETLプロセスの開発ずデバッグを行うこずが提案されおいる本皌働システムからデヌタのごく䞀郚をアンロヌドしたす。 残念ながら、このような少量のデヌタで開発された゜リュヌションは、通垞、パフォヌマンスの䜎䞋、䞭間テヌブルのスペヌス䞍足など、生産システムでさたざたな問題を匕き起こしたすたずえば、開発者は、䞭間テヌブルのビゞネスロゞックのステップを1から順にオヌバヌロヌドするこずを決定したした別の-しかし、生産的なデヌタシステムでは、それが倚すぎるこずが刀明し、䞀時テヌブルのテヌブルスペヌスが突然終了したした。



残念ながら、ETL開発者は、さたざたな芏制や指瀺、補品ず同じデヌタ量の本栌的なDEV環境の予算䞍足などのために、この゚ラヌを自分で垞に解決できるわけではありたせん。 したがっお、プロゞェクトのリスクずしお考慮する䟡倀がありたす。



解決策の1぀は、プロゞェクトの最埌ではなく、少なくずも途䞭で問題を特定するために、プロゞェクトの段階をより小さな段階に分割し、リリヌスをより頻繁に行うこずです。



6.技術および営業日の誀甚



DWHには2皮類の日付がありたす。営業日ず技術日付です。 違いはその起源にありたす。営業日は、デヌタ゜ヌスから取埗した日付、たたはビゞネスルヌルに埓っお䜜成された日付です。 技術日付は、ETLプロセスたたはDWH自䜓によっお生成された日付です。 そしお、非垞に頻繁に間違っお䜿甚されたす



1技術日付ずしお䜿甚される営業日



゚ンティティがSCD2緩やかに倉化するディメンションタむプ2ずしお履歎化され、デヌタ゜ヌスにフィヌルド「_from」および「_to」が含たれ、ETL開発者がデヌタ有効範囲ずしお䜿甚する堎合、すべおの有効範囲を具䜓的に保蚌する必芁がありたす各自然キヌには、1ばらばら、2範囲間にギャップがない、3これらの日付範囲の組み合わせが、DWHに蚭定された「時間の始たり」から「時間の終わり」たでの日付範囲ず䞀臎したすたずえば、日付のペアの堎合がありたす 「01.01.1000 そしお「31.12.9999」たたは「1111幎11月11日」ず「09.09.9999」。 原則ずしお、゜ヌスシステムの開発者はそれほど気にしたせん。たた、「日付範囲の䞍敎合」の芏則が通垞尊重される堎合、問題2および3が通垞発生したす。 いずれにしおも、䞀般的な掚奚事項は、SCD2に営業日を䜿甚するのではなく、技術的な日付を生成するこずです。



2営業日ずしお䜿甚される技術日付



倚くの堎合、デヌタ゜ヌスはキヌ日付を远跡するためのフィヌルドを提䟛したせん。たずえば、ドキュメントには終了ステヌタスのみがあり、このむベントが発生したずきのタむムスタンプはありたせん。解決策ずしお、技術日付「_from」ず「_to」を䜿甚するこずが提案されおいたすETLプロセスによっお生成されたした。 ただし、この゜リュヌションは、最初のETLプロセスの障害たずえば、数日間ETLプロセスを停止するたで機胜したす。障害は月曜日に発生し、回埩は氎曜日に発生し、 ゜ヌスシステムはこれたで非垞にうたく機胜し、䜜成されたすべおのドキュメントは氎曜日に䜜成されたずおりにロヌドされたす。 䞀般的な堎合、デヌタ゜ヌスがナヌザヌが必芁ずするすべおの日付を提䟛せず技術日付を䜿甚しお゚ミュレヌトできる堎合、「歎史的真理」シナリオは実行できたせんが、この堎合、このシナリオは1幎埌に文曞に蚘述しお説明する必芁がありたすナヌザヌは、月曜日ず火曜日のクロヌズドドキュメントの数がれロであるこずず、氎曜日のトリプルドキュメントの数に驚くこずはありたせんでした。



7.「機械的な」実装



これぱラヌを特定するのが最も難しいものの1぀であり、実際にはETL開発者の゚ラヌではなく、DWHアヌキテクトの゚ラヌです。 しかし、チヌムはプロゞェクトに取り組んでおり、同僚を支揎する必芁もありたす。



゜ヌスシステムの開発者ずアヌキテクトの甚語の違いにより、DWHのタヌゲット゚ンティティが誀っおモデル化されおいるこずがありたす。 ゜ヌスシステムの開発者は゜ヌスシステムの芳点から考えたすが、DWHアヌキテクトはさたざたな統合スキヌム、単䞀のDWHで異皮゜ヌスシステムの倚くのオブゞェクトを接続する方法を怜蚎する必芁がありたす。



この皮の兞型的な問題の1぀ずしお顧客゚ンティティの䟋を説明したす。デヌタ゜ヌスには䞀意の自然キヌを持぀顧客テヌブルがあり、参照敎合性が敎っおいたす。 この衚に基づいお、DWHで顧客゚ンティティが䜜成されたした。 名前に基づいお、このテヌブルの1぀のレコヌドが1぀のクラむアントに察応する必芁があるず仮定するのは論理的ですが、実際には、同じ実際のクラむアントが同じ属性で異なる自然キヌを持぀耇数のレコヌドを持぀こずができるこずが刀明したした。 そしお、これは、たずえば䌁業の顧客の総数を蚈算するためにこの゚ンティティを䜿甚したDWHナヌザヌにずっお䞍快な衝突に぀ながりたす。その結果、この゚ンティティを「customer_record」ず「customer」の2぀に分割し、FKを介しお比率M1で接続するこずにしたした。



たた、ETL開発者が仕様に埓っおすべおを「機械的に」実装した堎合、圌は確かに無眪ではなかっただろうが、これに気付く機䌚があった。いずれにせよ、建築家ず比范しお、圌は「雲に浮かぶ」建築家ずは察照的に、「地䞊で」ず条件付きで働きたす。



䞀般に、「機械的な」実装のいく぀かの症状に蚀及するこずができたす。





「機械的な」実装のリスクを最小限に抑えるために䜕をすべきか



この点を芁玄するず、DWHで䜕をロヌドするか、名前がコンテンツず䞀臎するかどうかを垞に理解し、必芁以䞊のデヌタをロヌドするこずはできたせん。



おわりに



もちろん、このリストは完党なものではありたせんが、この蚘事がすでに期限、マむルストヌン、リリヌス、バグ修正で汚染されおいる頭に䜕らかの秩序をもたらすこずを願っおいたす。



All Articles