فصل سیزدهم این کتاب به معرفی یک قالب ذخیره‌سازی داده به نام Apache Parquet می‌پردازد.

این قالب که یک شیوه ذخیره‌سازی ستونی است، می‌تواند برای داده‌های تو در تو (nested) بسیار مناسب باشد. قالب‌های ستونی به این دلیل که بازدهی بهتری از نظر اندازه فایل و کارآیی query دارند، جذاب هستند. از آنجایی که داده‌های موجود در یک ستون، قالبا از یک جنس هستند، کدگذاری آنها (Encoding) آسان است. برای مثال اگر یک ستون شامل داده‌های زمانی با فواصل مشخص باشد، صرفا ذخیره‌سازی داده اول و بازه‌ی زمانی بین هر دو سطر،  کفایت می‌کند.

از دیگر مزایای این قالب، تعداد ابزارها و زبان‌هایی است که آن را پشتیبانی می‌کنند. مهندسان Twitter و Cloudera که آن را ایجاد کردند، می‌خواستند کارکرد آن آسان باشد و  به راحتی توسط ابزارهای جدید قابل دسترسی باشد. بنابراین آن را در قالب یک “Parquet-format” که دربردانده ویژگی‌های آن مستقل از زبان است، و پیاده‌سازی آن در زبان‌های جاوا و C++  اقدام کردند. اکثر ابزارهای تحلیل داده در این کتاب مثل MapReduce, Pig, Hive, Crunch و Spark، این قالب را پشتیبانی می‌کنند.

قالب Parquet داده‌هایی از جنس‌های ذکر شده در جدول زیر را به صورت پیش فرض می‌پذیرد. اما برای داده‌هایی مثل رشته‌های کاراکتری، مفسرهای منطقی تعریف می‌شود.

قالب یک فایل Parquet به این صورت است که از یک Header که قالب فایل را معرفی می‌کند، چندین Block در بردارنده داده‌ها (مطابق شکل زیر) و سپس یک Footer تشکیل می‌شود که شامل metadata می‌باشد.

هر بلوک شامل گروهی از سطرهاست که آن ها نیز به Column Chunk  ها، یا مجموعه‌ای از ستون‌های دارای اطلاعات مرتبط با سطرهای آن بلوک تقسیم می‌شوند و هر Chunk  نیز به واحدهایی کوچکتر به نام Page تقسیم می‌شود که شامل اطلاعات یک ستون هستند و کاندید بسیار مناسبی برای فشرده‌سازی داده و Encode کردن آن هستند چون همان‌طور که پیشتر ذکر شده، از نظر جنس داده شکل مشابهی دارند. هنگام نوشتن در فایل Parquet، خودش بنا به جنس آن ستون، شکل فشرده‌سازی را مشخص کرده و اجرا می‌کند. اندازه بلوک ها و Pageها و فرمت فشرده‌سازی نیز هنگام نوشتن مشخص می‌شوند.

بیشتر اوقات، پردازش این فایلها توسط ابزارهای سطح بالاتر مثل Pig, Hive, Impala صورت می‌گیرد اما قابلیت دسترسی سطح پایین نیز برای دسترسی‌های داخل حافظه طراحی شده‌اند تا بتواند ارتباط خوبی با سایر ابزارها داشته باشد.

 

پی نوشت:

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