เก็บผลของ Test Failures ไว้ตรวจสอบ ตอนที่เราสั่ง dbt test

ในการทดสอบพวก 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 แถมมาให้เราด้วย :star_struck: ซึ่งถ้าเราลองเอา SQL นี้ไปรันดู

เราสามารถรู้ได้เลยว่า… ค่าที่อยู่ใน database ที่ทำให้ test ของผม fail คือค่า “usps” นั่นเอง และมีจำนวน 60 records ทีนี้เราก็สามารถมาดูต่อว่า จริง ๆ แล้วเราเขียน test ผิด หรือว่าข้อมูลใน database เค้าผิดจริง ๆ ได้

ในกรณีนี้ผมเขียน test ผิดครับ :joy: ผมก็กลับไปแก้ 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 นี้ทิ้งครับ :wink:

ลองไปใช้กันดูนะ flag ตัวนี้ช่วยให้ชีวิตการทำ data quality ง่ายขึ้นเยอะ อิอิ ถ้าอยากอ่านรายละเอียดเพิ่มเติม ก็เข้าไปที่ doc หลักของ dbt ได้เลยครับ :point_down: