InfuseAI / dbt-nthu-kktv

4 stars 0 forks source link

介紹

這個 project 示範如何用 duckdb, dbt, piperider,針對 KKTV x NTHU 的資料,做資料清洗 (cleaning) 轉換 (transformation) 跟分析 (analysis)

前置需求

步驟1: 把資料存到 duckdb

  1. 下載 dubkcdb CLI。連到 duckdb 下載頁面 https://duckdb.org/docs/installation/ ,選擇 CLI 頁籤並下載。

  2. 將比賽的資料放到 data/ 目錄

  3. 產生 duckdb 檔案,並且把資料匯入

    duckdb nthu_kktv.duckdb < ./data/load.sql 
  4. 觀看產生出的內容

    duckdb nthu_kktv.duckdb -c 'select * from train_source_events'

步驟2: 用 dbt 來做資料轉換

此 repo 本身就是一個 dbt project,且已經定義了一些轉換放在 models/ 目錄,每個 sql scripts 就是一次的資料轉換。這邊所說的 model 並不是 ML 中所說的 model,可以把它視作 database 中的一個 table 或是 view 即可。

以下流程示範如何執行 dbt

  1. 安裝 dbt,以及 duckdb adapter

    pip install dbt-core dbt-duckdb
  2. 執行這個 dbt project

    dbt run
  3. 觀察產生出來的檔案

    duckdb nthu_kktv.duckdb -c 'select * from users_filtered'
  4. 可以用 dbt docs 的功能來看這個 project 的資訊

    dbt docs generate
    dbt docs serve

步驟3: 用 piperider 來觀看資料分布

此 repo 本身也是一個 piperider project。主要定義檔案是在 .piperider/ 的目錄。其中的 config.yml 有定義直接整合 dbt project。

以下流程示範如何執行 piperider

  1. 安裝 piperider,以及 duckdb connector

    pip install 'piperider[duckdb]'
  2. 執行 piperider

    piperider run

    執行完後會輸出 html 報表的位置

    *Note: 這邊看不到 stg_events 這個 model 是因為我們把它定義為一個 view,piperider 只會對 table 做 profile。

步驟4: 修改轉換內容,並且觀察修改後的資料分布

  1. 修改 models/users.sql,新增一個 column

    select
    ...
    count(distinct date_trunc('day', event_time)) as active_days,
    ...
  2. 再次執行 dbt 來執行轉換。這邊我們透過 dbt node selection 的功能,可以只跑 users 跟他的 children。

    dbt run --select users+
  3. 再次執行 piperdier。這邊我們用 --dbt-state 這個參數,可以只跑上一次 dbt 有跑到的 tables。

    piperider run --dbt-state target/

步驟5: 匯出產生出轉換後的 table

duckdb ./nthu_kktv.duckdb -csv -c 'select * from users_filtered' > users_filtered.csv  

結語

此 project 示範了如何透過 duckdb + dbt + piperider 來做的資料前處理工作。這個組合有以下好處

接下來可以試試看下面的應用