takegue / estante

0 stars 0 forks source link

指標レイヤのシフトレフト: 指標定義はデータソースに記述する #27

Open takegue opened 2 years ago

takegue commented 2 years ago

データの集計操作は不可逆性の高い操作

https://github.com/takegue/estante/issues/15 で言及はしたが、集計操作は不可逆性の高い操作である。

「計測」は再利用できない

集計データ、とは大なり小なり意思決定のために利用される。 何かを計測するために存在する。

ここで計測とは、何かを触れると JIS Z 8103:2019 より

特定の目的をもって,測定の方法及び手段を考究し,実施し,その結果を用 いて所期の目的を達成させること。

とある。 計測における「目的」「用途」「目的達成のための方法・手段」は再利用できない

輝きを失った黄金パターン: データウェアハウスレイヤとデータマート

データレイク/データウェアハウス/データマート の3レイヤでの分割 データウェアハウシングを進めるうえでの「データエンジニア観点」の考え方フレームワークとしてよかったが これは「データ利用のI/Fに適していない」分割で「データ利用者観点」では関心の分離が微妙で分割方法としては誤っている。

「データ利用者」にとってどこに認知負荷がかかりやすいか?

逆に認知負荷が低いのは

万能なファクトテーブル

ただ上記操作では

これがどういう運用になるかというと

これを避けるためにどういうことするかというと

ということになる。 こうなってくると事前計算するコストメリットがかなり薄く、これはデータソースそのものとほぼ一致する スタースキーマは大体のケースにおいて早すぎる最適化の方法にしかならない。

「指標」レイヤのシフトレフト

「指標」定義を再利用するためにはどうするとよいのか?

指標の標準化は大事である一方、指標レイヤは実装するべきではない。 もし定義すべき指標があるなら、DWHレイヤにカラムとして、切り出していくべきである。

DWH layer

awesome_dataset.dwh

-- 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 ...

こうするべきでは?

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`