ETL操作 - プライマリキーを返します
-
22-09-2019 - |
質問
私はTalendを使用してデータウェアハウスを設定しています。私の仕事は、顧客データをディメンションテーブルに書き込み、ファクトテーブルにトランザクションデータを書き込むことです。ファクトテーブルのサロゲートキー(P_KEY)は自動インクリメントです。新しい顧客を挿入するとき、関連する顧客のIDを反映するために私のファクトテーブルが必要です。
私が言ったように、私のp_keyはauto auto_incrementingであるため、p_keyに任意の値を挿入することはできません。
寸法テーブルに行を挿入し、事実記録で参照する主要なキーを取得する方法についての考えはありますか?
より詳しい情報:
着信データが正規化されていない場合はどうなりますか?たとえば、次のデータを含むCSVがあります。
order # date total customer# first_name last_name
111 1/2/2010 500 101 John Smith
222 1/3/2010 600 101 John Smith
明らかに、顧客情報をDimensionテーブルに表示し、Factテーブルにトランザクションデータを表示したいと思います。
dimension
101 john smith
fact
111 1/3/2010
222 1/3/2010
あなたが言ったように、ディメンションテーブルのキーは自動増加です。ファクトテーブルは、このキーを参照する必要があります。挿入後にサロゲートキーが返されるように、ETLジョブをどのように設計しますか?
また、顧客データが(上記のように)布告されている場合、キーをどのように処理しますか?
解決
しかし、私はあなたの問題を誤解しているかもしれませんが、:
ファクトテーブルには、自動インクリメントPKがある場合とそうでない場合があります。通常、ファクトテーブルのPKは、次元テーブルを参照するいくつかのFKの複合です。
ディメンションテーブルには、自動インクリメントPKが必要です。
新しい顧客は、トランザクションファクトがDW(または少なくともファクトテーブル)に到達する前に、顧客ディメンションテーブルに「着陸」する必要があります。
ディメンションテーブルには、電子メール、フルネーム +ピンなどの顧客を独自に識別するBusinessKeyが必要です。
着信トランザクションの行には、顧客BusinessKeyフィールドも必要です。これが顧客の識別方法です。
ビジネスキーを使用して、トランザクションをファクトテーブルに挿入する前に、顧客ディメンションテーブルから顧客プライマリキーを検索します。
編集
新しい顧客データがトランザクションにバンドルされている場合は、顧客データを抽出し、トランザクションの前にDWにルーティングする方法を見つけます。
アップデート:
最初にdimcustomerをロードし、businesskeyを決定します - 次の寸法は次のようになります。
CustomerKey = 12345 (auto-incremented)
CustomerBusinessKey = john_smith_101 (must uniquely identify the John Smith)
CustomerFirstName = John
CustomerLastName = Smith
寸法の読み込みプロセス中に、2つのストリーム、既存および新規顧客の入力行を分離する必要があります。 「既存の顧客」ストリームからの行は、DIMテーブル(タイプ1 SCD)を更新し、「新しい顧客」ストリームからの行が挿入されます。挿入されている行のストリームに重複はありません。これを、それらをステージングテーブルに挿入し、ディメンションテーブルに最終挿入する直前に複製を削除することで達成できます。また、複製を抽出し、それらをロードプロセスに戻して顧客レコードを更新することもできます。更新された電話番号などのように、新しいデータが含まれている場合があります。
顧客が入ったら、事実を読み込みます。
ファクトテーブルは次のように見えるはずです:
DateKey (PK)
CustomerKey
OrderNumber (PK)
Total
DateKeyとOrderNumberのCompositeプライマリキーを使用して、注文番号シーケンスを時々リセットできるようにしました。
読み込みプロセス中に、ファクトレコードを変更して次のように見えます。
DateKey CustomerBusinessKey OrderNumber Total
20100201 john_smith_101 111 500
20100301 john_smith_101 222 600
この時点で、ルックアップを使用して、DimensionテーブルのCustomerBusinessKeyをDimension TableのcustomerKeyに置き換える必要があります。したがって、検索後、ストリームは次のようになります。
DateKey CustomerKey OrderNumber Total
20100201 12345 111 500
20100301 12345 222 600
これをファクトテーブルに挿入できます。
私も少しcheしました - 薄暗いから日付キーを検索せず、ファクトテーブルの既存の行を探しませんでした。ファクトテーブルを読み込むときは、ロードする前に既存の(dateKey、OrderNumer)組み合わせを探すことができます。または、再び複製を保護するためにプライマリキーに任せることができます。いずれにせよ、同じデータをFactテーブルに再ロードしようとする試みが失敗することを確認してください。