يحتوي هذا المستودع على مواصفات تعريفات Apache Parquet وApache Thrift لقراءة البيانات التعريفية لـ Parquet وكتابتها.
Apache Parquet هو تنسيق ملف بيانات مفتوح المصدر وموجه نحو الأعمدة مصمم لتخزين البيانات واسترجاعها بكفاءة. فهو يوفر أنظمة ضغط وترميز عالية الأداء للتعامل مع البيانات المعقدة بكميات كبيرة، كما أنه مدعوم في العديد من أدوات لغات البرمجة والتحليلات.
لقد أنشأنا Parquet لجعل مزايا تمثيل البيانات العمودية المضغوطة والفعالة متاحة لأي مشروع في نظام Hadoop البيئي.
تم إنشاء Parquet من الألف إلى الياء مع وضع هياكل البيانات المتداخلة المعقدة في الاعتبار، وتستخدم خوارزمية تمزيق وتجميع السجلات الموضحة في بحث Dremel. نعتقد أن هذا الأسلوب يتفوق على التسوية البسيطة لمساحات الأسماء المتداخلة.
تم تصميم الباركيه لدعم أنظمة الضغط والتشفير الفعالة للغاية. لقد أظهرت مشاريع متعددة تأثير الأداء لتطبيق نظام الضغط والتشفير الصحيح على البيانات. يسمح الباركيه بتحديد مخططات الضغط على مستوى كل عمود، كما أنه مقاوم للمستقبل للسماح بإضافة المزيد من الترميزات عند اختراعها وتنفيذها.
تم تصميم الباركيه ليستخدمه أي شخص. نظام Hadoop البيئي غني بأطر معالجة البيانات، ونحن لسنا مهتمين باللعب بالمفضلات. نحن نؤمن بأن ركيزة التخزين العمودي الفعالة والمنفذة بشكل جيد يجب أن تكون مفيدة لجميع الأطر دون تكلفة التبعيات واسعة النطاق وصعبة الإعداد.
يحتوي مشروع parquet-format
على مواصفات التنسيق وتعريفات التوفير للبيانات الوصفية المطلوبة لقراءة ملفات الباركيه بشكل صحيح.
يحتوي مشروع parquet-java
على وحدات فرعية متعددة، والتي تنفذ المكونات الأساسية لقراءة وكتابة دفق بيانات متداخل وموجه نحو الأعمدة، وتعيين هذا النواة على تنسيق الباركيه، وتوفير تنسيقات الإدخال/الإخراج Hadoop، ومحملات الخنازير، وغيرها المرافق القائمة على جافا للتفاعل مع الباركيه.
يحتوي مشروع parquet-compatibility
على اختبارات التوافق التي يمكن استخدامها للتحقق من أن التطبيقات بلغات مختلفة يمكنها قراءة وكتابة ملفات بعضها البعض.
يمكن إنشاء موارد Java باستخدام mvn package
. يجب أن يكون الإصدار الثابت الحالي متاحًا دائمًا من Maven Central.
يمكن إنشاء موارد توفير C++ عبر make.
يمكن أيضًا إنشاء كود التوفير في أي لغة أخرى تدعم التوفير.
كتلة (كتلة HDFS): هذا يعني كتلة في HDFS ولا يتغير المعنى لوصف تنسيق الملف هذا. تم تصميم تنسيق الملف للعمل بشكل جيد أعلى HDFS.
الملف: ملف HDFS يجب أن يتضمن البيانات التعريفية للملف. لا يحتاج إلى احتواء البيانات فعليًا.
مجموعة الصفوف: تقسيم أفقي منطقي للبيانات إلى صفوف. لا يوجد أي هيكل مادي مضمون لمجموعة الصف. تتكون مجموعة الصفوف من قطعة عمود لكل عمود في مجموعة البيانات.
قطعة العمود: قطعة من البيانات لعمود معين. إنهم يعيشون في مجموعة صفوف معينة ويضمنون أن يكونوا متجاورين في الملف.
الصفحة: يتم تقسيم أجزاء الأعمدة إلى صفحات. تعتبر الصفحة من الناحية النظرية وحدة غير قابلة للتجزئة (من حيث الضغط والتشفير). يمكن أن يكون هناك أنواع صفحات متعددة متداخلة في قطعة عمود.
بشكل هرمي، يتكون الملف من مجموعة صفوف واحدة أو أكثر. تحتوي مجموعة الصفوف على قطعة عمود واحدة بالضبط لكل عمود. تحتوي قطع الأعمدة على صفحة واحدة أو أكثر.
يجب قراءة هذا الملف وتعريف التوفير معًا لفهم التنسيق.
4-byte magic number "PAR1"
<Column 1 Chunk 1>
<Column 2 Chunk 1>
...
<Column N Chunk 1>
<Column 1 Chunk 2>
<Column 2 Chunk 2>
...
<Column N Chunk 2>
...
<Column 1 Chunk M>
<Column 2 Chunk M>
...
<Column N Chunk M>
File Metadata
4-byte length in bytes of file metadata (little endian)
4-byte magic number "PAR1"
في المثال أعلاه، يوجد N أعمدة في هذا الجدول، مقسمة إلى مجموعات صفوف M. تحتوي البيانات التعريفية للملف على مواقع جميع مواقع بدء مجموعة الأعمدة. يمكن العثور على مزيد من التفاصيل حول ما تحتويه البيانات التعريفية في تعريف التوفير.
تتم كتابة البيانات التعريفية للملف بعد البيانات للسماح بكتابة مسار واحد.
من المتوقع أن يقوم القراء أولاً بقراءة البيانات التعريفية للملف للعثور على جميع مجموعات الأعمدة التي يهتمون بها. ويجب بعد ذلك قراءة مجموعات الأعمدة بشكل تسلسلي.
هناك نوعان من البيانات التعريفية: البيانات التعريفية للملف والبيانات التعريفية لرأس الصفحة. يتم إجراء تسلسل لجميع هياكل التوفير باستخدام TCompactProtocol.
تهدف الأنواع التي يدعمها تنسيق الملف إلى أن تكون في أدنى حد ممكن، مع التركيز على كيفية تأثير الأنواع على تخزين القرص. على سبيل المثال، لا يتم دعم ints 16 بت بشكل صريح في تنسيق التخزين نظرًا لأنها مغطاة بـ ints 32 بت مع تشفير فعال. وهذا يقلل من تعقيد تنفيذ القراء والكتاب للتنسيق. الأنواع هي:
تُستخدم الأنواع المنطقية لتوسيع الأنواع التي يمكن استخدام الباركيه لتخزينها، وذلك من خلال تحديد كيفية تفسير الأنواع البدائية. يؤدي هذا إلى تقليل مجموعة الأنواع البدائية إلى الحد الأدنى وإعادة استخدام ترميزات الباركيه الفعالة. على سبيل المثال، يتم تخزين السلاسل بالنوع البدائي BYTE_ARRAY مع تعليق توضيحي STRING. تحدد هذه التعليقات التوضيحية كيفية فك تشفير البيانات وتفسيرها. يتم تخزين التعليقات التوضيحية كحقول LogicalType
في بيانات تعريف الملف ويتم توثيقها في LogicalTypes.md.
يقوم الباركيه بتخزين إحصائيات الحد الأدنى/الحد الأقصى على عدة مستويات (مثل قطعة العمود وفهرس العمود وصفحة البيانات). تخضع المقارنة لقيم النوع للقواعد التالية:
كل نوع منطقي له ترتيب مقارنة محدد. إذا كان هناك تعليق توضيحي لعمود بنوع منطقي غير معروف، فقد لا يتم استخدام الإحصائيات لتنقيح البيانات. تم توثيق ترتيب الفرز للأنواع المنطقية في صفحة LogicalTypes.md.
بالنسبة للأنواع البدائية، تنطبق القواعد التالية:
منطقية - خطأ، صحيح
INT32، INT64 - مقارنة موقعة.
FLOAT، DOUBLE - مقارنة موقعة مع معالجة خاصة لـ NaNs والأصفار الموقعة. تم توثيق التفاصيل في تعريف التوفير في اتحاد ColumnOrder
. تم تلخيصها هنا ولكن تعريف التوفير يعتبر موثوقًا:
+0.0
في حقل إحصائيات الحد الأقصى.-0.0
في حقل إحصائيات الحد الأدنى.للتوافق مع الإصدارات السابقة عند قراءة الملفات:
BYTE_ARRAY وFIXED_LEN_BYTE_ARRAY - مقارنة البايت المعجمية غير الموقعة.
لتشفير الأعمدة المتداخلة، يستخدم Parquet ترميز Dremel مع مستويات التعريف والتكرار. تحدد مستويات التعريف عدد الحقول الاختيارية التي تم تعريفها في مسار العمود. تحدد مستويات التكرار في أي حقل متكرر في المسار له قيمة متكررة. يمكن حساب الحد الأقصى لمستويات التعريف والتكرار من المخطط (أي مقدار التداخل الموجود). يحدد هذا الحد الأقصى لعدد البتات المطلوبة لتخزين المستويات (يتم تحديد المستويات لجميع القيم الموجودة في العمود).
يتم دعم ترميزين للمستويات BIT_PACKED وRLE. يتم الآن استخدام RLE فقط لأنه يحل محل BIT_PACKED.
يتم ترميز العدم في مستويات التعريف (التي يتم ترميزها بطول التشغيل). لا يتم ترميز القيم الخالية في البيانات. على سبيل المثال، في مخطط غير متداخل، سيتم ترميز العمود الذي يحتوي على 1000 قيمة فارغة بتشفير طول التشغيل (0، 1000 مرة) لمستويات التعريف ولا شيء آخر.
بالنسبة لصفحات البيانات، يتم ترميز الأجزاء الثلاثة من المعلومات من الخلف إلى الخلف، بعد رأس الصفحة. لا يسمح بالحشو في صفحة البيانات. بالترتيب لدينا:
قيمة uncompressed_page_size
المحددة في الرأس هي لجميع القطع الثلاث مجتمعة.
القيم المشفرة لصفحة البيانات مطلوبة دائمًا. تعتبر مستويات التعريف والتكرار اختيارية، بناءً على تعريف المخطط. إذا لم يكن العمود متداخلاً (أي أن المسار إلى العمود بطول 1)، فلن نقوم بتشفير مستويات التكرار (سيكون له دائمًا القيمة 1). بالنسبة للبيانات المطلوبة، يتم تخطي مستويات التعريف (إذا تم تشفيرها، فستحتوي دائمًا على قيمة الحد الأقصى لمستوى التعريف).
على سبيل المثال، في حالة كون العمود غير متداخل ومطلوب، فإن البيانات الموجودة في الصفحة هي القيم المشفرة فقط.
يتم وصف الترميزات المدعومة في Encodings.md
تم توضيح برامج ترميز الضغط المدعومة في Compression.md
تتكون أجزاء الأعمدة من صفحات مكتوبة من الخلف إلى الخلف. تشترك الصفحات في رأس مشترك ويمكن للقراء تخطي الصفحات التي لا يهتمون بها. تتبع بيانات الصفحة الرأس ويمكن ضغطها و/أو تشفيرها. يتم تحديد الضغط والتشفير في البيانات التعريفية للصفحة.
قد تكون قطعة العمود مشفرة جزئيًا أو كليًا بالقاموس. وهذا يعني أنه يتم حفظ فهارس القاموس في صفحات البيانات بدلاً من القيم الفعلية. يتم تخزين القيم الفعلية في صفحة القاموس. انظر التفاصيل في Encodings.md. يجب وضع صفحة القاموس في الموضع الأول من قطعة العمود. يمكن وضع صفحة قاموس واحدة على الأكثر في مجموعة عمود.
بالإضافة إلى ذلك، يمكن أن تحتوي الملفات على فهرس عمود اختياري للسماح للقراء بتخطي الصفحات بشكل أكثر كفاءة. راجع PageIndex.md للحصول على التفاصيل والسبب وراء إضافتها إلى التنسيق.
يمكن جمع الصفحات بجميع أنواعها بشكل فردي. يسمح هذا بتعطيل المجاميع الاختبارية على مستوى ملف HDFS، لدعم عمليات البحث في صف واحد بشكل أفضل. يتم حساب المجاميع الاختبارية باستخدام خوارزمية CRC32 القياسية - كما هي مستخدمة في GZip على سبيل المثال - على التمثيل الثنائي المتسلسل للصفحة (لا يشمل رأس الصفحة نفسها).
إذا كانت بيانات تعريف الملف تالفة، فسيتم فقدان الملف. إذا كانت بيانات تعريف العمود تالفة، فسيتم فقدان مقطع العمود هذا (ولكن لا بأس بمجموعات الأعمدة لهذا العمود في مجموعات الصفوف الأخرى). إذا كان رأس الصفحة تالفًا، فسيتم فقدان الصفحات المتبقية في هذا الجزء. إذا كانت البيانات الموجودة في الصفحة تالفة، فسيتم فقدان تلك الصفحة. سيكون الملف أكثر مقاومة للفساد مع مجموعات الصفوف الأصغر.
الامتداد المحتمل: مع مجموعات الصفوف الأصغر، تكون المشكلة الأكبر هي وضع البيانات التعريفية للملف في النهاية. إذا حدث خطأ أثناء كتابة البيانات التعريفية للملف، فستكون جميع البيانات المكتوبة غير قابلة للقراءة. يمكن إصلاح ذلك عن طريق كتابة البيانات التعريفية للملف في كل مجموعة صف N. ستكون بيانات تعريف كل ملف تراكمية وستتضمن جميع مجموعات الصفوف المكتوبة حتى الآن. وبدمج ذلك مع الإستراتيجية المستخدمة لملفات rc أو avro باستخدام علامات المزامنة، يمكن للقارئ استرداد الملفات المكتوبة جزئيًا.
تم تصميم التنسيق بشكل صريح لفصل بيانات التعريف عن البيانات. يسمح ذلك بتقسيم الأعمدة إلى ملفات متعددة، بالإضافة إلى وجود ملف بيانات وصفية واحد يشير إلى ملفات باركيه متعددة.
هناك العديد من الأماكن في التنسيق للإضافات المتوافقة:
تحتفظ Parquet Thrift IDL بمعرف الحقل 32767
لكل بنية Thrift للتمديدات. ويكون نوع (التوفير) لهذا الحقل binary
دائمًا.
يحتوي اختبار Apache/parquet على مجموعة من ملفات Parquet لأغراض الاختبار.
قم بالتعليق على المشكلة و/أو اتصل بالقائمة البريدية لـ parquet-dev لطرح أسئلتك وأفكارك. يتم اقتراح التغييرات على تعريف التنسيق الأساسي هذا ومناقشتها بعمق في القائمة البريدية. قد تكون مهتمًا أيضًا بالمساهمة في مشروع Parquet-Java الفرعي، والذي يحتوي على كافة تطبيقات جانب Java وواجهات برمجة التطبيقات. راجع قسم "كيفية المساهمة" في مشروع Parquet-Java
نحن نلزم أنفسنا ومجتمع مطوري Parquet بمدونة قواعد السلوك كما هو موضح في Twitter OSS: https://github.com/twitter/code-of-conduct/blob/master/code-of-conduct.md.
حقوق الطبع والنشر لعام 2013 محفوظة لـ Twitter وCloudera والمساهمين الآخرين.
مرخص بموجب ترخيص Apache، الإصدار 2.0: http://www.apache.org/licenses/LICENSE-2.0