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 وما إلى ذلك). تُعد الرسائل المتداخلة مناسبة للإدخال إلى بُنى البيانات المتداخلة أو للإخراج منها. لا تُطبَّق القيم الافتراضية المعرَّفة في مخطط Protobuf مثل المخطط الوارد أدناه، بل تُستخدم القيم الافتراضية للجدول بدلًا منها:
إذا كانت الرسالة تحتوي على 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) على جميع الوسوم المحتملة لـ oneof’، بالإضافة إلى 0 للإشارة إلى الغياب، ولا تهم التمثيلات النصية. يكون الإعداد input_format_protobuf_oneof_presence معطّلًا افتراضيًا يستقبل ClickHouse رسائل protobuf ويُخرجها بتنسيق length-delimited. وهذا يعني أنه يجب كتابة طول كل رسالة قبلها على هيئة عدد صحيح بعرض متغير (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.
آخر تعديل في ٢٣ يوليو ٢٠٢٦