เคยพูดถึงเรื่อง Type-2 Slowly Changing Dimension (SCD) คือ? ไปแล้ว เราสามารถที่จะ implement ได้โดยอาจจะเก็บ table หนึ่งไว้ก่อน (ทำ snapshot) แล้วหลังจากนั้นก็เทียบกันระหว่าง table ต้นทางกับ snapshot ดูว่ามีแถวไหนมีอะไรเปลี่ยนแปลงบ้าง ถ้ามีก็ให้เพิ่มแถวที่เปลี่ยนแปลงนั้นลงไปใน snapshot เสร็จแล้วเราก็จะมาตั้ง schedule สั่งให้ทำแบบนี้ไปเรื่อยๆ
ในโพสต์นี้ที่อยากจะมานำเสนอคือ dbt เนี่ย เค้ามีคำสั่ง snapshot
ที่เราประมาณว่าแค่เขียน config ตัว snapshot ไว้ แล้ว dbt เค้าจะสามารถหยิบเอาที่เราเขียนไว้ ไป compile ให้กลายเป็น SQL และรันคำสั่งให้เราเอง
อันนี้เป็นตัวอย่างในการเขียน ให้เก็บไฟล์นี้ไว้ในโฟลเดอร์ 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 จัดการให้
Ref: Snapshots | dbt Docs