ในการทดสอบพวก data quality เราสามารถใช้คำสั่ง dbt test
ได้ แต่เราก็จะเห็นแค่ว่า test ของเรา fail เฉย ๆ เอง ซึ่งจะดีมาก ๆ เลยถ้าเราสามารถรู้ได้ว่าข้อมูลไหนนะ ที่ทำให้ test ของเรา fail
สมมุติว่าผมมีการทดสอบ accepted values แบบนี้ที่ฟิลด์ shipping_service
- name: shipping_service
description: Company that was used for shipping
tests:
- accepted_values:
values: ['fedex', 'dhl', 'ups', 'usp']
แต่จริง ๆ แล้วในข้อมูลที่ผิดอยู่ใน database ของเรา ตอนที่เรารันคำสั่ง dbt test
เฉย ๆ เนี่ย เราจะได้ผลประมาณนี้
ซึ่งมันก็จะไม่ได้บอกอะไรมากว่าสรุปแล้วเนี่ย มันผิดที่ข้อมูลไหน แล้วค่าอะไรที่ทำให้ test ของเรา fail
ทีนี้ก็เลยมี flag ในคำสั่ง dbt test
ที่ dbt ทำมาให้เราครับ นั่นก็คือ --store-failures
นั่นเอง ถ้าเราใส่ flag นี้ไป dbt จะเก็บผลลัพธ์ของสิ่งที่ fail ไว้ใน database ของเรา ซึ่งเราสามารถที่จะดึงข้อมูลตรงนั้นออกมาดูได้
จากกรณีด้านบน ผมลองรันด้วยคำสั่ง dbt test --store-failures
แทน ผลที่ได้จะเป็นประมาณนี้
จะเห็นว่ามี SQL แถมมาให้เราด้วย ซึ่งถ้าเราลองเอา SQL นี้ไปรันดู
เราสามารถรู้ได้เลยว่า… ค่าที่อยู่ใน database ที่ทำให้ test ของผม fail คือค่า “usps” นั่นเอง และมีจำนวน 60 records ทีนี้เราก็สามารถมาดูต่อว่า จริง ๆ แล้วเราเขียน test ผิด หรือว่าข้อมูลใน database เค้าผิดจริง ๆ ได้
ในกรณีนี้ผมเขียน test ผิดครับ ผมก็กลับไปแก้ accepted values จาก “usp” เป็น “usps” แค่นี้ test ผมก็ผ่านหมดเรียบร้อย
ลองสังเกตเพิ่มเติมครับ ความดีงามของ dbt คือ แทนที่เค้าจะสร้าง table ที่เอาไว้เก็บพวก test failure ไว้ใน schema (หรือ dataset) เดียวกันกับ schema ที่เราทำงานอยู่ dbt จะไปสร้าง schema ใหม่แยกให้เลย ในรูปด้านบนคือ dbt_kan_o_dbt_test__audit
แล้วก็ table ก็จะเป็น table ที่เก็บผลลัพธ์ของ test นั้น ๆ ที่ fail ดังนั้นถ้าเราอยาก clear ทุกอย่างออก เปลืองเนื้อที่ database เรา เราก็แค่ลบ schema นี้ทิ้งครับ
ลองไปใช้กันดูนะ flag ตัวนี้ช่วยให้ชีวิตการทำ data quality ง่ายขึ้นเยอะ อิอิ ถ้าอยากอ่านรายละเอียดเพิ่มเติม ก็เข้าไปที่ doc หลักของ dbt ได้เลยครับ