DuckDB: วิเคราะห์ไฟล์ CSV และ Parquet ด้วย SQL บนเครื่องเดียว
เริ่มวิเคราะห์ข้อมูลด้วย DuckDB โดยอ่าน CSV และ Parquet ตรงจากไฟล์ ใช้ SQL ตรวจคุณภาพข้อมูล และส่งผลลัพธ์กลับเป็น Parquet
DuckDB เป็นฐานข้อมูลเชิงวิเคราะห์แบบฝังในโปรแกรม เหมาะกับงานที่ข้อมูลอยู่ในไฟล์และต้องการใช้ SQL สำรวจอย่างรวดเร็ว เช่น ตรวจยอดขายจาก CSV หลายเดือนหรือรวมไฟล์ Parquet จากระบบรายวัน จุดเริ่มต้นที่ดีคือแยกคำถามให้ชัดก่อนว่าอยากรู้ผลรวม ความผิดปกติ หรือแถวที่ต้องแก้ แล้วทดลองบนไฟล์ตัวอย่างที่ไม่ใช่ข้อมูลจริงทั้งชุด
อ่านไฟล์โดยไม่ต้องนำเข้าตาราง
DuckDB อ่าน CSV, JSON และ Parquet ผ่าน SQL ได้โดยตรง เอกสารทางการแสดงทั้งการอ้างชื่อไฟล์ใน FROM และฟังก์ชัน read_csv/read_parquet ตัวอย่างด้านล่างสมมติไฟล์ orders.csv มีคอลัมน์ order_id, country, amount:
SELECT country, count(*) AS orders, sum(amount) AS revenue
FROM read_csv('orders.csv')
GROUP BY country
ORDER BY revenue DESC;
การอ่าน Parquet ใช้แนวทางเดียวกัน:
SELECT country, sum(amount) AS revenue
FROM read_parquet('daily/*.parquet')
WHERE amount > 0
GROUP BY country;
Parquet เก็บข้อมูลแบบคอลัมน์ DuckDB สามารถอ่านเฉพาะคอลัมน์ที่ใช้และผลักเงื่อนไขบางส่วนลงไปถึงขั้นอ่านไฟล์ได้ จึงเหมาะกับการสแกนชุดข้อมูลใหญ่ แต่ผลจริงขึ้นกับขนาดไฟล์ รูปแบบ row group และตัวกรองที่ใช้ ไม่ควรสรุปความเร็วจากตัวอย่างเล็กเพียงไฟล์เดียว
ขั้นตอนทดลองกับข้อมูลจริง
- ตรวจ schema ก่อนด้วย
DESCRIBE SELECT * FROM read_csv('orders.csv');และดูตัวอย่าง 10 แถวเพื่อเช็กวันที่ จำนวนเงิน และค่า null - ทำ query นับแถวและจำนวน
order_idที่ไม่ซ้ำ เพื่อหาแถวซ้ำก่อนรวมยอด - เขียนเงื่อนไขธุรกิจให้ชัด เช่น ตัดรายการยกเลิกหรือคืนเงิน แทนการใช้
amount > 0โดยไม่มีเหตุผล - เปรียบเทียบยอดรวมกับรายงานจากระบบต้นทาง ถ้าคลาดเคลื่อนให้ตรวจชนิดข้อมูล ตัวคั่น CSV เขตเวลา และการแปลงทศนิยม
- เมื่อ query เสถียร จึงส่งผลลัพธ์ออกเป็น Parquet ด้วย
COPY (SELECT ... ) TO 'summary.parquet' (FORMAT parquet);
ถ้าต้องการเก็บตารางถาวร ให้สร้างไฟล์ฐานข้อมูล DuckDB แล้วใช้ CREATE TABLE ... AS SELECT จากไฟล์ต้นทาง แยกชื่อไฟล์ผลลัพธ์กับข้อมูลดิบ เพื่อย้อนกลับไปตรวจต้นทางได้
เหมาะกับงานแบบไหนและข้อจำกัด
DuckDB เหมาะกับการวิเคราะห์เฉพาะกิจ งาน notebook และ pipeline ที่อ่านไฟล์บนเครื่องเดียว ไม่ควรถือว่าเป็นตัวแทนของฐานข้อมูลบริการที่มีผู้ใช้จำนวนมากเขียนข้อมูลพร้อมกัน งานที่ต้องการ API online ตลอดเวลา การแบ่งสิทธิ์ละเอียด หรือการขยายหลายโหนด ต้องออกแบบระบบบริการและการเก็บข้อมูลเพิ่ม
ระวังข้อมูลที่มี schema เปลี่ยนระหว่างไฟล์ โดยเฉพาะ CSV ที่เดาชนิดคอลัมน์จากข้อมูลตัวอย่าง การใช้ read_csv พร้อมระบุชนิดคอลัมน์ที่สำคัญช่วยลดผลผิดแบบเงียบ ๆ และควรทดสอบกับไฟล์ที่มีค่าว่าง ตัวเลขใหญ่ และวันที่ผิดรูปแบบด้วย ปริมาณข้อมูลที่มากกว่า RAM ใช้ได้ในบางงาน แต่ยังต้องดูพื้นที่ดิสก์ชั่วคราวและขนาดผลลัพธ์
อ่านเพิ่มเติม: การนำเข้าข้อมูลของ DuckDB, คู่มือ Parquet, Python API