-- DWH layer
with data as (
select * from unnest([
struct(1 as id, "one" as label)
, (2, "two")
, (3, "three")
, (4, "four")
# ...
])
)
select * from data
awesome_datamart.core
-- Datamart Layer
with
_pre as (
select * from `awesome_dataset.dwh`
where mod(id, 2) = 1
)
, _agg as (
select
countif(label is not null) as nonnulls
, countif(distinct id) as uniques
from _pre
)
select * from _agg
Metric Layer
select "Odd Number Uniqueness" as name, uniques as value from `awesome_datamart.core`
-- union all ...
こうするべきでは?
データの前処理含めて、カラムとして追加で定義する
データソースと指標定義が比較できるため、デバッグも容易
フィルタしやすいカラムは提供してても、whereによるフィルタは直接行わない
データマートレイヤは集計操作を行うだけ
awesome_dataset.dwh
-- DWH layer
with data as (
select * from unnest([
struct(1 as id, "one" as label)
, (2, "two")
, (3, "three")
, (4, "four")
# ...
])
)
, metric_columns as (
select
*
, if(mod(id, 2) = 1, id, null) as metric__oddlabel__uniquenss
, if(mod(id, 2) = 1, label is not null, null) as metric__oddlabel_nonnull
from data
)
select * from metric_columns
awesome_datamart.core
select
count(distinct metric__oddlabel_uniquenss)
, countif(metric__oddlabel_nonnull)
from `awesome_dataset.dwh`
データマート層 / DWH層の使い分けは認知負荷が高い
集計データは再利用性が低い: 使いまわすことをあきらめる方が無難
集計テーブルを定義するのではなく、指標定義データソースに書く
データの集計操作は不可逆性の高い操作
https://github.com/takegue/estante/issues/15 で言及はしたが、集計操作は不可逆性の高い操作である。
「計測」は再利用できない
集計データ、とは大なり小なり意思決定のために利用される。 何かを計測するために存在する。
ここで計測とは、何かを触れると
JIS Z 8103:2019
よりとある。 計測における「目的」「用途」「目的達成のための方法・手段」は再利用できない
輝きを失った黄金パターン: データウェアハウスレイヤとデータマート
データレイク/データウェアハウス/データマート の3レイヤでの分割 データウェアハウシングを進めるうえでの「データエンジニア観点」の考え方フレームワークとしてよかったが これは「データ利用のI/Fに適していない」分割で「データ利用者観点」では関心の分離が微妙で分割方法としては誤っている。
データの状態が3層に依存するため、結局そのつながりをすべて認知しないといけない
責任の境界をこの層の間で引いてしまうと運用がかえって難しくなる
「データ利用者」にとってどこに認知負荷がかかりやすいか?
逆に認知負荷が低いのは
万能なファクトテーブル
ただ上記操作では
これがどういう運用になるかというと
これを避けるためにどういうことするかというと
ということになる。 こうなってくると事前計算するコストメリットがかなり薄く、これはデータソースそのものとほぼ一致する スタースキーマは大体のケースにおいて早すぎる最適化の方法にしかならない。
「指標」レイヤのシフトレフト
「指標」定義を再利用するためにはどうするとよいのか?
指標の標準化は大事である一方、指標レイヤは実装するべきではない。 もし定義すべき指標があるなら、DWHレイヤにカラムとして、切り出していくべきである。
例
DWH layer
awesome_dataset.dwh
awesome_datamart.core
Metric Layer
こうするべきでは?
awesome_dataset.dwh
awesome_datamart.core