DuckDB؛ از Columnar Storage تا query مستقیم روی فایل‌ها

چرا مهم است

اگر با فایل‌های داده کار می‌کنی، DuckDB اجازه می‌دهد بدون واردکردن اولیه داده‌ها روی آن‌ها query اجرا کنی. هم توضیح می‌دهد چرا انتخاب ستون‌های کمتر، مقدار کار لازم را کاهش می‌دهد.

قبل از خواندن، این‌ها را بدان۴ مفهوم
Columnar Storage

شیوه‌ای از ذخیره‌سازی که مقادیر هر ستون را جدا نگه می‌دارد؛ در نتیجه برای خواندن چند ستون، نیازی به خواندن همه ستون‌های هر ردیف نیست.

بیشتر: Columnar Storage

CSV

قالب متنی داده‌های جدولی که در آن مقدارهای هر ردیف معمولاً با ویرگول از هم جدا می‌شوند.

بیشتر: CSV

Aggregation

محاسبه نتیجه‌ای خلاصه از چند ردیف داده، مانند تعداد، مجموع یا میانگین، برای کل داده یا هر گروه.

بیشتر: Aggregation

zonemap

اطلاعاتی مانند کمینه و بیشینه مقادیر یک بخش از داده که به موتور کمک می‌کند بخش‌های ناسازگار با شرط query را نخواند.

در حال نگارش: zonemap

مطلب «Ducks in a Column» با یک مجموعه داده نمونه درباره ۴۰۰ اردک، شیوه کار DuckDB با ستون‌ها و فایل‌ها را توضیح می‌دهد. نقطه شروع، Columnar Storage است: هر ستون جدا ذخیره می‌شود، نه اینکه هر ردیف یک رکورد یکپارچه باشد. بنابراین queryای که از میان ۵۰ ستون فقط سه ستون را لازم دارد، همان سه ستون را می‌خواند. یکسان‌بودن نوع مقادیر هر ستون و تکرار آن‌ها نیز به فشرده‌سازی کمک می‌کند. موتور DuckDB هر بار دسته‌ای شامل ۲٬۰۴۸ مقدار از هر ستون را پردازش می‌کند.

برای اجرای query روی فایل، لازم نیست ابتدا داده‌ها وارد جدول شوند. DuckDB مسیر فایل را مانند جدول می‌پذیرد و نام و نوع ستون‌ها را تشخیص می‌دهد؛ برای نمونه، SELECT * FROM 'ponds.csv' مستقیماً فایل CSV را می‌خواند. الگوی مسیر می‌تواند چند فایل Parquet را پوشش دهد و گزینه filename = true نام فایل را هم به نتیجه اضافه می‌کند. خواندن فایل‌های دوردست از طریق HTTPS یا S3 نیز ممکن است و در این حالت، extension با نام httpfs خودکار بارگذاری می‌شود.

Parquet هم داده را به تفکیک ستون ذخیره می‌کند. DuckDB فقط ستون‌های موردنیاز query را می‌خواند و با استفاده از zonemap،؜ بخش‌هایی را که کمینه و بیشینه مقادیرشان با شرط query سازگار نیست کنار می‌گذارد. در مسیرهایی مثل year=2026/pond=north/ نیز نام پوشه‌ها می‌تواند به ستون تبدیل شود؛ شرط روی این ستون‌ها امکان کنارگذاشتن کامل پوشه‌ها را فراهم می‌کند.

بخش دیگری از مطلب به کار گروهی روی ستون‌ها اختصاص دارد. EXCLUDE ستون‌ها را از انتخاب حذف می‌کند و REPLACE مقدار آن‌ها را در خروجی تغییر می‌دهد. COLUMNS() ستون‌ها را با الگو، فهرست نام‌ها یا lambda انتخاب می‌کند؛ مثلاً برای محاسبه بیشترین دما یا جایگزینی مقدارهای NULL با صفر. GROUP BY ALL نیز در Aggregation،؜ ستون‌های انتخاب‌شده‌ای را که محاسبه تجمیعی ندارند مبنای گروه‌بندی قرار می‌دهد.

نکته عملی مطلب، بررسی تشخیص خودکار نوع‌هاست. با DESCRIBE می‌توان نوع تشخیص‌داده‌شده برای CSV را دید و با گزینه types آن را صریح تعیین کرد. در مثال مقاله، شناسه برکه متن باقی می‌ماند تا صفرهای ابتدایی حفظ شوند. دستور SUMMARIZE هم برای هر ستون اطلاعاتی مانند نوع، کمینه، بیشینه و درصد مقدارهای NULL ارائه می‌دهد.

نکته کلیدی

وقتی را می‌خوانی، تشخیص خودکار نوع‌ها را بررسی کن و در صورت نیاز نوع را صریح تعیین کن. در مثال مطلب، متنی‌ماندن شناسه باعث می‌شود صفرهای ابتدای آن حفظ شوند؛ پس نوع تشخیص‌داده‌شده را با معنای داده بسنج.

خواندن مقاله اصلی (در زبانه‌ی جدید باز می‌شود)
برچسب‌ها (۴)