ใบงานที่ 5: การออกแบบโมเดล dbt
ตั้งค่า materialization, เอนจิน และกลยุทธ์ incremental ให้แต่ละโมเดล dbt พร้อมผลตรวจทันทีในทุกคำตอบ
เวลาที่ใช้โดยประมาณ: 15–20 นาที เอกสารอ้างอิง: dbt บน ClickHouse
แนวคิด
ใบงานที่ 1–4 ผลิต อะไร: เอนจินไหน, ORDER BY แบบไหน, ชนิดข้อมูล ClickHouse ตัวไหน ใบงานนี้ผลิต อย่างไร: การตัดสินใจเหล่านั้นถูกแสดงออกเป็นคอนฟิก dbt อย่างไร ก่อนที่จะเขียน SQL ใด ๆ
โมเดล dbt-clickhouse มีคอนฟิกสามชั้นที่นักพัฒนา Snowflake ไม่จำเป็นต้องคิดถึง:
- Materialization — dbt สร้างอ็อบเจกต์ทางกายภาพแบบไหน (view, table, incremental, ephemeral)?
- คอนฟิกเอนจิน — สำหรับโมเดลแบบ table และ incremental ใช้เอนจิน ClickHouse ตัวไหน และคอลัมน์เวอร์ชันไหน?
- กลยุทธ์ incremental — สำหรับโมเดล incremental dbt จัดการแถวใหม่/แถวที่อัปเดต อย่างไร?
ยังมีข้อกังวลเรื่องความถูกต้องที่มีเฉพาะกับ ReplacingMergeTree ด้วย:
- การวาง FINAL —
FINALควรอยู่ที่จุดใดใน DAG ของ dbt เพื่อรับประกันการอ่านที่ขจัด ข้อมูลซ้ำแล้ว?
ใช้แผนผังการตัดสินใจนี้สำหรับ materialization:
- อ่านแบบเขียนเพิ่มเท่านั้นจาก source โดยไม่มีการเขียนลงในโมเดลเอง? →
view - ตรรกะการ join ล้วน ๆ ไม่ถูกคิวรีโดยตรง? →
ephemeral - สร้างใหม่ทั้งหมดในทุกการรัน dbt ไม่มีการอัปเดตบางส่วน? →
table - ประมวลผลเฉพาะแถวใหม่/แถวที่เปลี่ยนแปลงต่อการรัน? →
incremental
โมเดล staging เป็น view เสมอ — กฎเดียวกับในใบงานที่ 1 stg_trips และ
stg_taxi_zones เป็นการอ่านแบบส่งผ่านที่ไม่มีการเขียนของตัวเอง จึงยังเป็น view
ไม่ว่าข้อมูลต้นทางของมันจะทำงานอย่างไร
แบบฝึกหัดที่ 1: การเลือก Materialization
สำหรับแต่ละโมเดล ให้เลือก materialization ของ dbt ที่ถูกต้อง แล้วตอบว่าทำไมในคำถาม ใต้ตาราง
แบบฝึกหัดที่ 2: การตั้งค่าเอนจิน
มีเพียงโมเดลที่ materialization เป็น table หรือ incremental ที่ต้องมีเอนจิน ClickHouse —
view และโมเดล ephemeral ไม่มี อ้างอิงคำตอบจากใบงานที่ 1 ของคุณ: คอนฟิกเอนจินของ dbt
คือการนำการตัดสินใจเรื่องเอนจินที่คุณทำไว้แล้วที่นั่นไปปฏิบัติ
แบบฝึกหัดที่ 3: การออกแบบกลยุทธ์ incremental
สำหรับแต่ละโมเดล incremental ให้ออกแบบคอนฟิก incremental ทั้งชุด: unique_key,
incremental_strategy และตัวกรอง SQL ที่อยู่ภายในบล็อกป้องกัน is_incremental():
{% if is_incremental() %}
WHERE <your filter here>
{% endif %}แบบฝึกหัดที่ 4: การวาง FINAL
การขจัดข้อมูลซ้ำของ ReplacingMergeTree เป็นแบบอะซิงโครนัส FINAL บังคับให้เกิดขึ้นตอน
อ่าน — แต่การวาง FINAL ในโมเดลที่ผิดมีผลต่อความถูกต้องหรือประสิทธิภาพ สำหรับแต่ละ
โมเดลด้านล่าง ให้ตอบว่า FINAL ควรอยู่ใน clause FROM ของโมเดลนั้นเองหรือไม่
Loading worksheet...
ถ่ายลงใน migration-plan.md
เมื่อทำใบงานนี้เสร็จแล้ว ให้กรอกส่วนที่ 10 ของ migration-plan.md ด้วยคำตอบของคุณ
และติ๊กช่อง:
- [ ] dbt model design: completedใบงานที่ 4: แผนระลอกการย้ายระบบ
จัดลำดับอ็อบเจกต์ NYC Taxi สิบรายการเป็นระลอกการย้ายระบบ และให้เกรดความซับซ้อนของแต่ละรายการ พร้อมผลตรวจทันทีในทุกคำตอบ
03 จัดเตรียมและย้ายข้อมูล
จัดเตรียม ClickHouse Cloud ด้วย Terraform, สร้างตารางเป้าหมายจากแผนของคุณ และย้าย 50 ล้านแถวด้วยสคริปต์ย้ายข้อมูล Python ที่ทำงานต่อจากจุดเดิมได้