這個 project 示範如何用 duckdb, dbt, piperider,針對 KKTV x NTHU 的資料,做資料清洗 (cleaning) 轉換 (transformation) 跟分析 (analysis)
下載 dubkcdb CLI。連到 duckdb 下載頁面 https://duckdb.org/docs/installation/ ,選擇 CLI 頁籤並下載。
將比賽的資料放到 data/
目錄
產生 duckdb 檔案,並且把資料匯入
duckdb nthu_kktv.duckdb < ./data/load.sql
觀看產生出的內容
duckdb nthu_kktv.duckdb -c 'select * from train_source_events'
此 repo 本身就是一個 dbt project,且已經定義了一些轉換放在 models/
目錄,每個 sql scripts 就是一次的資料轉換。這邊所說的 model 並不是 ML 中所說的 model,可以把它視作 database 中的一個 table 或是 view 即可。
以下流程示範如何執行 dbt
安裝 dbt,以及 duckdb adapter
pip install dbt-core dbt-duckdb
執行這個 dbt project
dbt run
觀察產生出來的檔案
duckdb nthu_kktv.duckdb -c 'select * from users_filtered'
可以用 dbt docs 的功能來看這個 project 的資訊
dbt docs generate
dbt docs serve
此 repo 本身也是一個 piperider project。主要定義檔案是在 .piperider/
的目錄。其中的 config.yml
有定義直接整合 dbt project。
以下流程示範如何執行 piperider
安裝 piperider,以及 duckdb connector。
pip install 'piperider[duckdb]'
執行 piperider
piperider run
執行完後會輸出 html 報表的位置
*Note: 這邊看不到 stg_events
這個 model 是因為我們把它定義為一個 view
,piperider 只會對 table
做 profile。
修改 models/users.sql
,新增一個 column
select
...
count(distinct date_trunc('day', event_time)) as active_days,
...
再次執行 dbt 來執行轉換。這邊我們透過 dbt node selection 的功能,可以只跑 users
跟他的 children。
dbt run --select users+
再次執行 piperdier。這邊我們用 --dbt-state
這個參數,可以只跑上一次 dbt 有跑到的 tables。
piperider run --dbt-state target/
duckdb ./nthu_kktv.duckdb -csv -c 'select * from users_filtered' > users_filtered.csv
此 project 示範了如何透過 duckdb + dbt + piperider 來做的資料前處理工作。這個組合有以下好處
接下來可以試試看下面的應用
recency
的feature 在 users
model 之上。其定義為該使用最後出現時間離 2022/9/17 的秒數,並且觀察其分布。events
新增 event_timeslot
的欄位,根據比賽的定義把 event_time
分類在這28個 slots 中。