Chuyển đến nội dung chính
Quay lại danh sách bài viết

DuckDB: วิเคราะห์ไฟล์ CSV และ Parquet ด้วย SQL บนเครื่องเดียว

เริ่มวิเคราะห์ข้อมูลด้วย DuckDB โดยอ่าน CSV และ Parquet ตรงจากไฟล์ ใช้ SQL ตรวจคุณภาพข้อมูล และส่งผลลัพธ์กลับเป็น Parquet

DuckDB: วิเคราะห์ไฟล์ CSV และ Parquet ด้วย SQL บนเครื่องเดียว

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 และตัวกรองที่ใช้ ไม่ควรสรุปความเร็วจากตัวอย่างเล็กเพียงไฟล์เดียว

ขั้นตอนทดลองกับข้อมูลจริง

  1. ตรวจ schema ก่อนด้วย DESCRIBE SELECT * FROM read_csv('orders.csv'); และดูตัวอย่าง 10 แถวเพื่อเช็กวันที่ จำนวนเงิน และค่า null
  2. ทำ query นับแถวและจำนวน order_id ที่ไม่ซ้ำ เพื่อหาแถวซ้ำก่อนรวมยอด
  3. เขียนเงื่อนไขธุรกิจให้ชัด เช่น ตัดรายการยกเลิกหรือคืนเงิน แทนการใช้ amount > 0 โดยไม่มีเหตุผล
  4. เปรียบเทียบยอดรวมกับรายงานจากระบบต้นทาง ถ้าคลาดเคลื่อนให้ตรวจชนิดข้อมูล ตัวคั่น CSV เขตเวลา และการแปลงทศนิยม
  5. เมื่อ 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

Chia sẻ bài viết:
Xem thêm bài viết