Dbt Snapshots ของดีที่ช่วยให้เราทำ Type-2 SCD เพื่อเก็บข้อมูลย้อนหลังได้

เคยพูดถึงเรื่อง Type-2 Slowly Changing Dimension (SCD) คือ? ไปแล้ว เราสามารถที่จะ implement ได้โดยอาจจะเก็บ table หนึ่งไว้ก่อน (ทำ snapshot) แล้วหลังจากนั้นก็เทียบกันระหว่าง table ต้นทางกับ snapshot ดูว่ามีแถวไหนมีอะไรเปลี่ยนแปลงบ้าง ถ้ามีก็ให้เพิ่มแถวที่เปลี่ยนแปลงนั้นลงไปใน snapshot เสร็จแล้วเราก็จะมาตั้ง schedule สั่งให้ทำแบบนี้ไปเรื่อยๆ

ในโพสต์นี้ที่อยากจะมานำเสนอคือ dbt เนี่ย เค้ามีคำสั่ง snapshot ที่เราประมาณว่าแค่เขียน config ตัว snapshot ไว้ แล้ว dbt เค้าจะสามารถหยิบเอาที่เราเขียนไว้ ไป compile ให้กลายเป็น SQL และรันคำสั่งให้เราเอง :star_struck:

อันนี้เป็นตัวอย่างในการเขียน ให้เก็บไฟล์นี้ไว้ในโฟลเดอร์ snapshots ของโปรเจค dbt ของเรานะครับ ซึ่งโดย default แล้ว เวลาที่เราจะสั่ง dbt snapshot ตัว dbt จะมาอ่านที่โฟลเดอร์นี้ (สามารถเปลี่ยนชื่อโฟลเดอร์ได้)

{% snapshot booking_snapshot %}

{{
    config(
        target_schema='snapshots',
        unique_key='booking_no',
        strategy='timestamp',
        updated_at='update_date',
    )
}}

select * from {{ source('main', 'booking') }}

{% endsnapshot %}

เราต้องประกาศไว้ใน block ที่ชื่อ snapshot ก่อน แล้วตั้งชื่อ table ของเราครับ ในที่นี้ชื่อ booking_snapshot หลังจากนั้นก็ configure ได้เลย

  • target_schema จะให้ไปที่ไหน ถ้าเป็น BigQuery ตรงนี้คือชื่อ dataset ครับ
  • unique_key ตัว key ของ table เรา ที่เราเอาไว้ดูความ unique ของข้อมูล ตรงนี้เป็น primary key ได้ครับ
  • strategy ตรงนี้คือเป็นการที่เราจะดูว่าถ้าข้อมูลของแถวๆ นั้นมีการเปลี่ยนแปลง มันจะเปลี่ยงแปลงโดยเวลาเปลี่ยนนะ ซึ่งจะใช้คู่กับ updated_at
  • updated_at เป็นที่ๆ เรากำหนดฟิลด์ที่เราจะ monitor การเปลี่ยนแปลง

ตรง strategy นี่มี 2 แบบนะครับ แบบ timestamp กับแบบ check ซึ่งแบบ check นี่โดย default จะดูข้อมูลทั้งแถวเลย หรือจะเลือกบาง column มาก็ได้ เพื่อดูการเปลี่ยนแปลง

ส่วนสุดท้ายจะเป็นส่วน select ข้อมูลจาก source ครับ ถ้าเราอยากทำ snapshot ของ table ไหน เราก็แค่ select ตัว table นั้นๆ

สุดท้ายเราจะรันแค่ dbt snapshot พอ ที่เหลือ dbt จัดการให้ :sunglasses:

Ref: Snapshots | dbt Docs