ملفات QVD - ما بداخلها ، الجزء 2

في المقالة الأولى حول بنية ملف QVD ، وصفت الهيكل العام وأركز على البيانات الوصفية بتفاصيل كافية. في هذه المقالة ، سوف أصف تنسيق تخزين المعلومات حول الأعمدة ، وتبادل تجربتي في تفسير هذه البيانات.


لذا (تذكر) يتوافق ملف QVD مع جدول علائقي ، والذي ، كما تعلم ، يتكون من صفوف. يتألف كل صف من الجدول ، بدوره ، من أعمدة (أو حقول) ، وللصفوف نفس البنية ، والتي يمكن وصفها ، على سبيل المثال ، بواسطة مشغل SQL (إنشاء جدول).


في ملف QVD ، يتم تخزين جدول كأجزاء ذات صلة غير مباشرة:


تحتوي جداول الأحرف (الفصل الدراسي) على قيم فريدة لكل عمود في الجدول المصدر. عنهم سنناقش أدناه.


يحتوي جدول الصفوف على صفوف الجدول المصدر ، ويقوم كل صف بتخزين مؤشرات قيم العمود (الحقل) للصف في جدول الرموز المقابل. سأناقش جدول الصف في مزيد من التفاصيل في الجزء الثالث من هذه السلسلة.


على سبيل المثال لوحة لدينا (تذكر - من الجزء الأول)


SET NULLINTERPRET =<sym>; tab1: LOAD * INLINE [ ID, NAME 123.12,"Pete" 124,12/31/2018 -2,"Vasya" 1,"John" <sym>,"None" ]; 

في هذه اللوحة:


  • 5 خطوط
  • يحتوي حقل "الهوية" على 4 قيم فريدة (لا تعتبر القيمة الفارغة (NULL) قيمة ، بمزيد من التفاصيل عنها في الجزء الثالث)
  • يحتوي الحقل "NAME" على 5 قيم فريدة
  • سيحتوي الصف الأول في جدول الصفوف على الفهارس 0 و 0 ، المقابلة للقيم 123.12 و "Pete" ، على التوالي

مناسبات خاصة


كقاعدة عامة ، يتم إنشاء جداول الرموز لجميع حقول الجدول في ملف QVD. ولكن هناك فروق دقيقة.


إذا كان الحقل يحتوي على قيمة واحدة ، فعادةً ما يتم تخزين هذه القيمة في جدول الرموز (في هذه الحالة ، سيحتوي جدول الرموز على سجل واحد). وفي جدول الصفوف ، سيكون الحقل غائبًا (لأنه من الواضح ما يجب أن تكون قيمة هذا الحقل في كل صف ...)


إذا كان الحقل لا يحتوي على قيم على الإطلاق (يحتوي دائمًا على NULL) ، فلن يتم إنشاء جدول رموز عليه.


سيتم وصف هذه الحالات الخاصة في الجزء الثالث ، عندما نصل إلى الخطوط والخوارزمية لاستجمامهم.


تخزين جداول الأحرف في ملف


يتم تخزين كل جدول رمز في ملف QVD ككتلة ثنائية ، والإزاحة الخاصة به (نسبة إلى بداية الكتلة الثنائية) موجودة في حقل الإزاحة في قسم البيانات الأولية لهذا الحقل ، ويكون الطول (بالبايت) في حقل الطول للبيانات الوصفية.


وبالتالي ، فإن الجدول الحرف الأول سيكون دائما إزاحة 0.


تتبع جداول الرموز واحدة تلو الأخرى ولا يتم فصلها عن بعضها البعض بأي طريقة.


طابع جدول الهيكل


يحتوي جدول الرموز على قيم الحقول التي تتبع بعضها البعض دون فواصل ، ويتم تمثيل كل قيمة على النحو التالي:


  • بايت واحد يشفر نوع الحقل (سأذكر أدناه)
  • ثم تأتي القيمة الثنائية الاختيارية (تعتمد على نوع الحقل)
  • متبوعة بقيمة سلسلة اختيارية (يعتمد على نوع الحقل)

يتم تخزين السلاسل "كما هي" (في الترميز المحدد في البيانات التعريفية) ، تنتهي السلسلة بـ صفر بايت. يمكن أن يكون طول السلسلة صفرًا ، أي تتكون من صفر بايت فقط.


يتم تخزين القيم الثنائية وفقًا لقواعد الهيكل حيث تم إنشاء ملف QVD (من تجربتي ، يمكنك ببساطة قراءتها كقيم ثنائية مع العين إلى "endian").


أنواع الحقول


مجموعة كاملة من أنواع البيانات QVD جلبت جنبا إلى جنب مع ثلاثة الأساسية


  • (1) عدد صحيح (4 بايت)
  • (2) النقطة العائمة (8 بايت)
  • (4) خط ينتهي بصفر

هناك أيضا أنواع مجتمعة


  • (5) عدد صحيح متبوعًا بتمثيل السلسلة (4 بايت زائد سلسلة ذات صفر بايت)
  • (6) رقم الفاصلة العائمة متبوعًا بتمثيل السلسلة (8 بايت زائد سلسلة ذات صفر بايت)

في الأقواس ، أعطيت القيم العددية لـ "الأنواع" (البايت الأول من قيمة الحقل في جدول الرموز).


سوف يسأل العقل المستفسر "أين الثلاثة؟" هذا ليس بالنسبة لي ، لدي أيضًا العديد من الأسئلة ، من التعليقات هنا ، كما قال بطل خابنسكي في الفيلم الشهير "سأمتنع عن ...".


بشكل عام ، هذا كل شيء ، هذا ليس بالأمر الصعب - أليس كذلك؟


اثنين من الملاحظات العملية ليست ممتعة جدا


يمكن أن يحتوي الحقل نفسه على قيم لأنواع مختلفة في جدول الرموز (عدد صحيح ، عائم ، وسلاسل). أنا شخصياً لم أصدق ذلك حتى أجريت سلسلة من التجارب ... الشيء الوحيد الذي يمكن "ضمانه" (مع التحذير من الجزء الأول - لا يمكن ضمان أي شيء) - لا يمكن أن يكون هناك مزيج من "الرقم" و "الرقم مع سلسلة" (إما واحد أو الآخر ). من المهم أن يفهم العقل المستفسر :-).


يجب قراءة قيم الحقول غير الرقمية (وليس النوعين 1 و 2 في الترميز أعلاه) في صف واحد - من المستحيل وضع نفسه على رقم الحقل N ... إنه مفهوم ، لكنه غير فعال (من حيث المعالجة).


النظر مرة أخرى في التصنيف أعلاه ، سيبدو جدول أحرف حقل المعرف كما يلي (أكتب البايت / الحرف):


  • رقم 6 (نوع) + 8 بايت (قيمة عائمة 123.12) + 7 بايت (سلسلة "123.12" مع صفر بايت)
  • رقم 5 (النوع) + 4 بايت (قيمة عدد صحيح 124) + 4 بايت (السلسلة "124" مع صفر بايت)
  • رقم 5 (النوع) + 4 بايت (عدد صحيح -2) + 3 بايت (السلسلة "-2" مع صفر بايت)
  • رقم 5 (النوع) + 4 بايت (عدد صحيح 1) + 2 بايت (السلسلة "1" مع صفر بايت)

ما مجموعه 40 بايت (انظر الجزء السابق - بيانات التعريف ، قيمة سمة الطول لحقل المعرف).


من الممارسة


كانت المهمة العملية (واحدة من) ، كما كتبت بالفعل ، بالنسبة لي هي إعادة إنشاء الجدول باستخدام ملف QVD. مما يلي (على الأقل - يجب أن يتبع ، لقد حاولت :-)) أنه من وصف العمود (البيانات الوصفية بالإضافة إلى البيانات) يستحيل تحديد نوع الحقل بشكل لا لبس فيه (حقل ، على سبيل المثال ، يكتب في "إنشاء جدول ...") .


كما ذكرت في الجزء الأول - 90٪ من الحقول بها نوع UNKNOWN في البيانات الأولية ، كما أن العلامات لا تسمح لك بتعيين نوع الحقل بشكل فريد (لن أقوم بتحميل القارئ بالتفاصيل - صدقوني) ...


كيف تكون


في عملي ، ذهبت في المسار الإحصائي - أقوم بتحليل نسبة مئوية معينة من قيم الأعمدة ، واستناداً إلى النتائج ، استنتج - ما هو نوع الواجب تعيينه إليه. الدقة مرضية تمامًا ، المشكلة هي أنك تحتاج إلى تحليل (في الحالة العامة) جميع البيانات ... في ممارستي ، حصرت نفسي في أول 5-10٪ من قيم الحقل.


إذا انتهى بنا الأمر بشأن أنواع البيانات ، فسوف يسأل العقل المستفسر سؤالًا معقولًا - يشير "جدول الإنشاء" المذكور إلى المزيد من أنواع البيانات ...


سأقول هذا: في الملفات التي تمت معالجتها لم يتم العثور على أنواع بيانات أخرى غير تلك المذكورة أعلاه. تتوافق الملفات مع جداول حقيقية جدًا لقواعد البيانات الحقيقية وتتضمن مجموعة كاملة من أنواع البيانات (على سبيل المثال ، حتى أنني حصلت على نقاط ... لماذا هم في QVD ؟؟ سيكون من الأفضل كتابة التعليقات).


ربما ، لاستكمال الصورة مع أنواع البيانات ، تحتاج إلى شرح حول التواريخ والطوابع الزمنية (أنواع أخرى هي مسألة طول).


يتم تقديم التواريخ في QVD كعدد صحيح - عدد الأيام من بداية العصر (عصر النقر). سوف يخبرك خبراء QlikView / QlikSense بسهولة متى بدأت (على الرغم من أنه كان في 30 ديسمبر 1899 ، لا تسأل عن السبب).


يتم تمثيل الطوابع الزمنية في QVD برقم الفاصلة العائمة الذي يحتوي على التاريخ كما هو موضح أعلاه ، والوقت في الجزء الكسري (حيث يتوافق .0 مع الوقت "00:00:00" و .999999 يتوافق مع الوقت "23:59:59" - راجع بمزيد من التفاصيل ، على سبيل المثال ، هنا ).


لم أتعمق في هذا الاتجاه حتى الآن - تحتوي جداولي المعاد إنشاؤها من QVD على عدد صحيح وأنواع عائمة لحقول مثل "التاريخ" و "تاريخ الوقت". بدلاً من ذلك ، يمكنك استخدام تمثيل السلسلة - بالنسبة للحقول من هذا النوع ، يتم استخدام تمثيل مشترك دائمًا (النوعان 5 و 6).


الأخير (حول التدريب العملي) - عند قراءة الملفات الكبيرة ، من المنطقي إنشاء فهارس لحقول السلسلة ، وهو ما قمت به. هذا يقلل بشكل كبير من وقت المعالجة في الحالات التي يكون فيها حجم جدول الرموز أقل بكثير من عدد الصفوف (أي ، تحدث قيمة واحدة أكثر من مرة في حقل الجدول الأصلي).


لتلخيص


في هذه المقالة ، درسنا تخزين القيم الفريدة للحقول (الأعمدة) ، ورأينا أن الأعمدة يتم تخزينها كسلسلة من القيم الفريدة ، وأدركنا أن أنواع البيانات مختلطة وأن هناك ثلاثة أنواع فقط (عدد صحيح ، عائم ، صف).


بعد ذلك ، نحتاج إلى التعرف على كيفية تخزين السلاسل - سيتم تخصيص الجزء الثالث والأخير من سلسلة من المقالات حول بنية QVD لهذا الغرض.

Source: https://habr.com/ru/post/ar455940/


All Articles