Skip to main content

الوصف

تنسيق Protobuf هو تنسيق Protocol Buffers. يتطلب هذا التنسيق مخطط تنسيق خارجيًا، ويُخزَّن مؤقتًا بين الاستعلامات. يدعم ClickHouse ما يلي:
  • صياغتي proto2 وproto3.
  • الحقول Repeated/optional/required.
للعثور على المطابقة بين أعمدة الجدول وحقول نوع رسالة Protocol Buffers، يقارن ClickHouse بين أسمائها. وهذه المقارنة غير حساسة لحالة الأحرف، ويُتعامل مع المحرفين _ (الشرطة السفلية) و. (النقطة) على أنهما متساويان. إذا اختلف نوع العمود عن نوع الحقل في رسالة Protocol Buffers، فسيُطبَّق التحويل اللازم. الرسائل المتداخلة مدعومة. على سبيل المثال، بالنسبة إلى الحقل z في نوع الرسالة التالي:
يحاول ClickHouse العثور على عمود باسم x.y.z (أو x_y_z أو X.y_Z وما إلى ذلك). تُعد الرسائل المتداخلة مناسبة للإدخال إلى بُنى البيانات المتداخلة أو للإخراج منها. بالنسبة إلى الحقول المعيَّنة المفقودة في تنسيق النقل:
  • تستخدم الأعمدة المعيَّنة العادية غير القابلة لـ NULL القيمة الافتراضية لحقل مخطط protobuf (proto2[default = …]، وإلا فالقيمة الافتراضية للنوع) أثناء التحليل، وليس تعبير الجدول DEFAULT.
  • تأخذ الأعمدة المعيَّنة Nullable(...) القيمة NULL عند غياب الحقل (ولا تستخدم القيمة الافتراضية لحقل protobuf أو نوعه).
  • عند تمكين input_format_protobuf_flatten_google_wrappers لوحدات التغليف google.protobuf.*Value:
    • تُعامل وحدة التغليف الغائبة في عمود Nullable(...) كحقل خارجي مفقود وتصبح NULL؛
    • تحتفظ وحدة التغليف الموجودة لكنها فارغة (str {}) بالقيمة الافتراضية العددية المتداخلة ('' / 0
    • يحصل العمود غير القابل لـ NULL المعيَّن إلى وحدة تغليف غائبة على القيمة الافتراضية العددية المتداخلة بدلًا من NULL.
تنطبق DEFAULT الخاصة بالجدول (وتعبيرات القيمة الافتراضية) على أعمدة الجدول التي ليس لها حقل مطابق في نوع الرسالة عند تمكين input_format_defaults_for_omitted_fields (وهو الإعداد الافتراضي). إذا كان هذا الإعداد 0، تحتفظ الأعمدة غير المعيَّنة بالقيمة الافتراضية لنوع البيانات المُدرجة أثناء التحليل بدلًا من تعبير الجدول DEFAULT. مثال على قيمة افتراضية لحقل في مخطط proto2 (تُستخدم لحقل معيَّن غائب من الرسالة):
إذا كانت الرسالة تحتوي على oneof وكان input_format_protobuf_oneof_presence مضبوطًا، فإن ClickHouse يملأ العمود الذي يحدّد أيّ حقل ضمن oneof تم العثور عليه.
يجب أن يكون اسم العمود الذي يشير إلى الوجود هو نفسه اسم oneof. الرسائل المتداخلة مدعومة (انظر basic-examples). كما أن الرسائل الفارغة مدعومة أيضًا. الأنواع المسموح بها هي Int8 وUInt8 وInt16 وUInt16 وInt32 وUInt32 وInt64 وUInt64 وEnum وEnum8 أو Enum16. يجب أن يحتوي Enum (وكذلك Enum8 أو Enum16) على 0 للإشارة إلى الغياب، وعلى وسم كل حالة من oneof لها عمود مطابق في الجدول الهدف، ولا تهم التمثيلات النصية. بالنسبة إلى أعضاء رسالة oneof الذين ليس لديهم أعمدة جدول مطابقة، يُسمح أيضًا بوسوم Enum المفقودة. إذا كان مثل هذا الفرع موجودًا في الإدخال، يعامل ClickHouse وجود oneof على أنه محذوف ويكتب 0 في عمود الوجود. يكون الإعداد input_format_protobuf_oneof_presence معطّلًا افتراضيًا يستقبل ClickHouse رسائل protobuf ويُخرجها بتنسيق محدد بالطول. وهذا يعني أنه يجب كتابة طول كل رسالة قبلها على هيئة عدد صحيح بعرض متغير (varint).

مثال للاستخدام

قراءة البيانات وكتابتها

ملفات Exampleالملفات المستخدمة في هذا المثال متاحة في مستودع الأمثلة
في هذا المثال، سنقرأ بعض البيانات من الملف protobuf_message.bin إلى ClickHouse جدول. ثم سنكتبها مجددًا إلى ملف باسم protobuf_message_from_clickhouse.bin باستخدام format ‏Protobuf. بالنظر إلى الملف schemafile.proto:
إذا كنت تعرف بالفعل كيفية تسلسل البيانات وفك تسلسلها بتنسيق Protobuf، فيمكنك تخطي هذه الخطوة.سنستخدم بايثون لتسلسل بعض البيانات إلى protobuf_message.bin ثم قراءتها في ClickHouse. إذا كنت تريد استخدام لغة أخرى، فراجع أيضًا: “كيفية قراءة/كتابة رسائل Protobuf المحددة بالطول في اللغات الشائعة”.شغّل الأمر التالي لإنشاء ملف بايثون باسم schemafile_pb2.py في الدليل نفسه الذي يحتوي على schemafile.proto. يحتوي هذا الملف على فئات بايثون التي تمثل رسالة UserData من نوع Protobuf:
الآن، أنشئ ملف بايثون جديدًا باسم generate_protobuf_data.py، في الدليل نفسه الذي يحتوي على schemafile_pb2.py. الصق فيه الشيفرة التالية:
الآن شغّل السكربت من سطر الأوامر. يُوصى بتشغيله من بيئة بايثون افتراضية، على سبيل المثال باستخدام uv:
ستحتاج إلى تثبيت مكتبات بايثون التالية:
شغّل السكربت لإنشاء الملف الثنائي:
أنشئ جدول ClickHouse يطابق المخطط:
أدرِج البيانات في الجدول من سطر الأوامر:
يمكنك أيضًا كتابة البيانات مرة أخرى في ملف ثنائي باستخدام تنسيق Protobuf:
باستخدام مخطط Protobuf الخاص بك، يمكنك الآن فك تسلسل البيانات التي كتبها ClickHouse إلى الملف protobuf_message_from_clickhouse.bin.

قراءة البيانات وكتابتها باستخدام ClickHouse Cloud

في ClickHouse Cloud، لا يمكنك تحميل ملف مخطط Protobuf. ومع ذلك، يمكنك استخدام الإعداد format_protobuf_schema لتحديد المخطَّط داخل الاستعلام. في هذا المثال، نوضّح كيفية قراءة البيانات المُسلسلة من جهازك المحلي وإدراجها في جدول في ClickHouse Cloud. كما في المثال السابق، أنشئ الجدول وفقًا لمخطط Protobuf الخاص بك في ClickHouse Cloud:
يحدّد الإعداد format_schema_source مصدر الإعداد format_schema القيم المحتملة:
  • ‘file’ (الافتراضي): غير مدعوم في Cloud
  • ‘string’: يكون format_schema هو المحتوى الحرفي للمخطط.
  • ‘query’: يكون format_schema استعلامًا لاسترجاع المخطط.

format_schema_source='string'

لإدراج البيانات في ClickHouse Cloud مع تحديد المخطط على هيئة سلسلة نصية، شغّل:
اعرض البيانات التي أُدرجت في الجدول:

format_schema_source='query'

يمكنك أيضًا تخزين مخطط Protobuf في جدول. أنشئ جدولًا على ClickHouse Cloud لإدراج البيانات فيه:
أدرِج البيانات في ClickHouse Cloud، مع تحديد المخطّط في استعلام لتشغيله:
اعرض البيانات المُدخلة في الجدول:

استخدام المخطط المُنشأ تلقائيًا

إذا لم يكن لديك مخطط Protobuf خارجي لبياناتك، فلا يزال بإمكانك إخراج البيانات أو إدخالها بتنسيق Protobuf باستخدام مخطط مُنشأ تلقائيًا. ولهذا الغرض، استخدم الإعداد format_protobuf_use_autogenerated_schema. على سبيل المثال:
في هذه الحالة، سينشئ ClickHouse مخطط Protobuf تلقائيًا استنادًا إلى بنية الجدول باستخدام الدالة structureToProtobufSchema. ثم سيستخدم هذا المخطط لتسلسل البيانات بتنسيق Protobuf. يمكنك أيضًا قراءة ملف Protobuf باستخدام المخطط المُنشأ تلقائيًا. في هذه الحالة، يجب أن يكون الملف قد أُنشئ باستخدام المخطط نفسه:
يكون الإعداد format_protobuf_use_autogenerated_schema مفعّلًا افتراضيًا، ويُطبَّق إذا لم يتم تعيين format_schema. يمكنك أيضًا حفظ المخطط المُنشأ تلقائيًا في الملف أثناء الإدخال/الإخراج باستخدام الإعداد output_format_schema. على سبيل المثال:
في هذه الحالة، سيُحفَظ مخطط Protobuf المُنشأ تلقائيًا في الملف path/to/schema/schema.capnp.

حذف ذاكرة التخزين المؤقت لـ Protobuf

لإعادة تحميل مخطط Protobuf الذي تم تحميله من format_schema_path، استخدم تعليمة SYSTEM DROP ... FORMAT CACHE.
آخر تعديل في ١٤ أغسطس ٢٠٢٦