yml ファイルの記述方法#
次に yml ファイル (先ほどの dig ファイルの記述例で言えば unification_ex1.yml
) について、以下の例を参考に記述方法を紹介していく。
name: production
keys:
- name: td_client_id
valid_regexp: "[0-9a-fA-F]{8}-..."
invalid_texts: ['']
- name: td_global_id
valid_regexp: "[0-9a-fA-F]{8}-..."
invalid_texts: ['', '0000000000-...']
- name: email
valid_regexp: ".*@.*"
tables:
- database: prod
table: pageviews
incremental_columns: [updated_at, id]
key_columns:
- {column: td_client_id, key: td_client_id}
- database: brand2
table: pageviews
as: brand2_pageviews
key_columns:
- {column: td_client_id, key: td_client_id}
- {column: td_global_id, key: td_global_id}
- {column: email, key: email}
- database: prod
table: contacts
key_columns:
- {column: email, key: email}
canonical_ids:
- name: browser_id
merge_by_keys: [td_client_id, td_global_id]
master_tables:
- name: marketing_master
canonical_id: browser_id
attributes:
- name: browser_id
source_canonical_id: browser_id
- name: email
source_columns:
- {table: contacts, column: email}
name:#
この Unification の名前を指定する。この名前は ID Unification のアウトプットを格納するデータベース名 (cdp_unification_${name}
)として入ることになる。上記の例では cdp_unification_production
データベースが作成され、アウトプットが格納される。
keys:#
keys:
- name: td_client_id
valid_regexp: "[0-9a-fA-F]{8}-..."
invalid_texts: ['']
- name: td_global_id
valid_regexp: "[0-9a-fA-F]{8}-..."
invalid_texts: ['', '0000000000-...']
- name: email
valid_regexp: ".*@.*"
使用する全てのテーブルを通じて、ID の縫い合わせに利用する識別子を key として全て列挙する。
keys: のオプション#
Option Name |
Required? |
Value |
Description |
---|---|---|---|
|
Required |
String |
各 key の名前を指定する。基本的にはカラム名となるが、email / mail_address など、テーブルによってカラム名が異なる場合にはその中でどれか1つの名前を指定する。また長い名前の key の場合には、代わりにシンプルを設定しても良い。つまり、key の名前はテーブルのカラム名と一致しなくても構わない。テーブルごとに key がそのテーブルのどのカラム名に対応するのかを明示する記述を行うことになるので。 |
|
Optional |
Regular expression |
記述した正規表現にマッチする key のみを有効とみなしたい場合に設定する。 |
|
Optional |
Array(String) |
|
(参考) td_client_id / td_global_id に用いるべき正規表現#
td_client_id や td_global_id は
307423ab-9cbc-4bca-9cae-05c3700cc8f2
fc6422e1-48bb-4396-b7aa-bdd2075c000d
のような値を持つが、これは正規表現として
"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}[0-9a-fA-F]{4}[0-9a-fA-F]{4}[0-9a-fA-F]{12}"
と一律に表現することができる。これらを key として使い場合は valid_regexp:
にて上記の設定をしておくことをおすめめする。
tables:#
tables:
- database: prod
table: pageviews
incremental_columns: [updated_at, id]
key_columns:
- {column: td_client_id, key: td_client_id}
- database: brand2
table: pageviews
as: brand2_pageviews
key_columns:
- {column: td_client_id, key: td_client_id}
- {column: td_global_id, key: td_global_id}
- {column: email, key: email}
- database: prod
table: contacts
key_columns:
- {column: email, key: email}
tables: のオプション#
Option Name |
Required? |
Value |
Description |
---|---|---|---|
|
Required |
String |
database 名を指定 |
|
Required |
String |
table 名を指定 |
|
Required |
Array(Map) |
指定したテーブルごとに、その中で縫い合わせに使用される key を |
|
Optional |
String |
オリジナルのテーブル名とは異なる名前でアウトプットしたい場合、このオプションで名前を設定する。 |
|
Optinal |
Array(String) |
incremental_update を行う場合に設定する。 |
(参考) key_columns: において、column: と key: が異なる場合#
多くの場合、 column:
と key:
の値は一致するかもしれないが、例えばあるテーブルの中では cookie_id というカラム名で記録されている識別子が、他のテーブルの td_client_id カラム (かつ keys:
には td_client_id で登録されている) と縫い合わせられる場合、
- {column: cookie_id, key: td_client_id}
と記述することになる。
as: を使用すべきケース#
このオプションが必要となるのは、今回の例のように異なるデータベースで pageviews
などの同じテーブル名を持っていて、そのどちらもソーステーブルとて使用する場合である。アウトプット先のデータベース内でエンリッチされたテーブルを作成する際に、同じ名前となってしまうため、衝突を避けるために as:
を利用する。
canonical_ids:#
ID Unification を実行するための設定と、実行後、統一されたユーザーに新たに識別子を割り当てる設定を行う。
canonical_ids:
- name: browser_id
merge_by_keys: [td_client_id, td_global_id, td_ssc_id]
- name: marketing_id
merge_by_canonical_ids: [browser_id]
merge_by_keys: [email]
source_tables: [pageviews, contacts]
- name: contact_id
merge_by_canonical_ids: [browser_id]
merge_by_keys: [membership_id, email]
merge_iterations: 3
incremental_merge_iterations: 2
canonical_ids: のオプション#
Option Name |
Required? |
Value |
Description |
---|---|---|---|
|
Required |
String |
canonical_id の名前を設定する。 |
|
Required |
String |
どの key 群を使って縫い合わせ (Unification Algorithm) を実行するかの設定になる。設定する key のバリエーションだけでなく、設定する順番 (優先度) が非常に重要になってくる。 |
|
Optional |
Integer |
Unification Algorithm はループ処理となるため、何回ループさせるかの設定となる。ループの回数は問題 (データ) に依存するが、ループが不十分であることは実行結果から確認できる。回数を多く設定しても、アルゴリズムが収束した時点で処理を打ち切ってくれるので、まずは 5 や 10 あたりを指定して実行すると良い。デフォルト値は |
|
Optional |
Integer |
incremental_update が実行される際に使われるループの回数の設定。デフォルト値は |
|
Optional |
Array(String) |
|
|
Optional |
Array(String) |
(参考) canonical_id の name の考え方#
canonical_id の命名については、命名については、何が統合されてできた ID なのかがわかるようなものにしよう。かつこの canonical_id の名前は出力するテーブル名にも入ってくることを意識して長過ぎないものにしよう。 例えば
browser_id, unified_cookie_id
td_client_id, td_global_id, td_ssc_id, cookie_id をメインに統合する場合
person_id, customer_id, cust_id, member_id
email や member_id などの個人情報を含む key で統合する場合
master_tables:#
master_tables:
- name: marketing_master
canonical_id: marketing_id
attributes:
- name: browser_id
source_canonical_id: browser_id
- name: firstname
source_columns:
- {table: pageviews}
- {table: form_submits, column: first_name}
- name: birthdate
valid_regexp: "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}"
invalid_texts: ['']
source_columns:
- {table: contacts, priority: 1}
- {table: pageviews, priority: 2}
- {table: form_submits, priority: 3}
- name: all_emails
array_elements: 5
source_columns:
- {table: contacts, order: last, order_by: time, priority: 1}
- {table: pageviews, order: first, order_by: time, priority: 2}
- {table: form_submits, order: first, order_by: time, priority: 2}
master_tables: のオプション#
Option Name |
Required? |
Value |
Description |
---|---|---|---|
|
Required |
String |
|
|
Required |
String |
master_table のベースとなる canonical_id を指定する。master_table の行数はこの canonical_id のユニーク数となる。指定した canonical_id における |
|
Optional |
(Deep Nests) |
ソーステーブルの canonical_id 以外のカラムを |
attributes: のオプション#
Option Name |
Required? |
Value |
Description |
---|---|---|---|
|
Required |
String |
アトリビュート名を指定し、これが master_table 内のカラム名となる。 |
|
Optional |
Array(String) |
指定するカラムの値が、1つの canonical_id に対して複数の値が存在することが多々ある (例えば |
|
Required |
(Deep Nests) |
指定したアトリビュートは基本的に複数のテーブルおよび (1つのテーブルであっても) 複数のレコードにまたがるため、どのテーブルのどのレコードの値を優先的に取得するのかのプライオリティの設定が必要となる場合がある。あるテーブル内で |
|
Optional |
Regular expression |
|
|
Optional |
Array(String) |
|
source_columns: のオプション#
Option Name |
Required? |
Value |
Description |
---|---|---|---|
|
Required |
String |
アトリビュートとして使用したい table 名 (データベース名は不要) |
|
Optional |
String |
テーブルの中に |
|
Optional |
Integer |
複数の table を指定した際、値を採用するための優先度を指定できる。優先度は同じ値のものがあっても構わない。その優先度の上で、テーブル内のレコードをどの順番で優先的に取得するかを |
|
Optional |
String |
レコードを |
|
Optional |
String |
|
priority: を同じにした場合の注意点#
priotity:
を同じにした table 群は必ず同じ並び替えでないといけない (異なるものがある場合はエラー)。
同順位のテーブル群は一律に指定された並び替えが適用され、上から順に選ばれることになる。