Case3. 複数の canonical_id をマージした canonical_id を生成する#

canonical_ids: 内の各 canonical_id の設定で、merge_by_canonical_ids: を使用することで、他の canonical_id をマージした canonical_id を生成することができる。

canonical_ids:
  - name: brand_id_ax
    merge_by_keys: [td_client_id, td_global_id]    
    source_tables: ['site_aaa','site_xxx']
    merge_iterations: 5

  - name: brand_id_yz
    merge_by_keys: [td_client_id, td_global_id]
    source_tables: ['site_yyy','site_zzz']
    merge_iterations: 5

  - name: unified_brand_id
    merge_by_keys: []
    merge_by_canonical_ids: [brand_id_ax, brand_id_yz]
    merge_iterations: 5

この設定では、unified_brand_id を、brand_id_ax と brand_id_yz をマージして生成するような設定となっている。

unified_brand_id は、master_table の canonical_id として設定されているため、全てのソーステーブルをカバーしていないといけない。そのため、brand_id_ax と brand_id_yz を合わせた source_tables: が、全てのテーブルをカバーしている必要があることに注意しよう。

unified_brand_id の merge_by_keys: が空となっているのは、従来であればエラーとなるが、今回は merge_by_canonical_ids が設定されていることによって動作することになる。

また、この設定の上で実行される Unification Algorithm は、まず brand_id_ax と brand_id_yz が並列に実行され、それが完了すると unified_brand_id の Unification Algorithm が実行される。

merge_by_canonical_ids: 設定下における Unification Algorithm#

merge_by_canonical_ids: 設定下では、Unification Algorithm の初期 graph が全く異なるものになる。

merge_by_keys: に設定された key 以外に merge_by_canonical_ids: で設定された canonical_id に設定されている方の merge_by_keys: の key 、そして canonical_id 自身も key として加わることになる。

unified_brand_id の設定を見ながら説明していく。

  - name: unified_brand_id
    merge_by_keys: []
    merge_by_canonical_ids: [brand_id_ax, brand_id_yz]
    merge_iterations: 5

unified_brand_id_graph_unify_loop_0#

この設定の元では、graph_unify_loop_0 は以下のようになる。

_images/graph_unify_loop_03.png

Fig. 45 unified_brand_id_graph_unify_loop_0#

merge_by_keys: が空であるのにも関わらず、全てのデータソースの全ての key 、さらに canonical_id までが登場しているのがわかる。

graph_unify_loop_0 の作成ルール#

以下の graph を結合した graph をスタートとするため、多くの縫い合わせが完了している状態から始まることになる。

  1. brand_id_ax の最終 graph

  2. brand_id_yz の最終 graph

  3. brand_id_ax と brand_id_yz のソーステーブルを併せたテーブル群から生成した初期 graph

merge_by_keys: の決定ルール#

また、適用される merge_by_keys: の設定は以下のルールに基づく。

  • merge_by_canonical_ids: に設定された canonical_id の canonical_id 自身が縫い合わせ key として登場する。

  • その上で、 merge_by_keys: は以下の順序で決定される:

  1. unified_brand_id の merge_by_keys: の中の key が (この順番で) 優先順位が最も高く設定される。

  2. merge_by_canonical_ids: に指定された brand_id_ax, brand_id_yz に登場する canonical_id の値が(列挙された順で)次の優先度となる。

  3. merge_by_canonical_ids: に指定された brand_id_ax, brand_id_yz の merge_by_keys: の設定 ( unified_brand_id に使われている key を除いたもの) が最後の優先度となる。

今回の例であてはめると、

merge_by_keys: [canonical_id (brand_id_ax), canonical_id (brand_id_yz), td_client_id, td_global_id]

と設定されたことになる。graph_unify_loop_0 に対して、この優先度で Unification Algorithm が実行される。

unified_brand_id_graph#

_images/unified_brand_id_graph.png

Fig. 46 unified_brand_id_graph#

key

canonical_id

04zahkB6hA9G

wONJPFlQsJyj

この設定では、canonical_id (brand_id_ax) をベースにして canonical_id が生成されることになる。ただ、他の canonical_id をベースに canonical_id を生成するということは、元の canonical_id のベースとなった key の変更に伴い、こちらの canonical_id も変わってしまうことになり、少々複雑となる。これを嫌うならば、

  - name: unified_brand_id
    merge_by_keys: [td_global_id]
    merge_by_canonical_ids: [brand_id_ax, brand_id_yz]
    merge_iterations: 5

のように、unified_brand_id の merge_by_keys: に key を設定しておくようにする。この時、 canonical_id の merge_by_keys: の真の優先度は、

:merge_by_keys: [td_global_id, canonical_id (brand_id_ax), canonical_id (brand_id_yz), td_client_id]

となる。この設定における初期 graph は同じだが、収束した graph は td_global_id を leader にする graph となる。