الوصف
Protobuf هو تنسيق Protocol Buffers.
يتطلب هذا التنسيق مخطط تنسيق خارجيًا، ويُخزَّن مؤقتًا بين الاستعلامات.
يدعم ClickHouse ما يلي:
- صياغتي
proto2وproto3. - الحقول
Repeated/optional/required.
_ (الشرطة السفلية) و. (النقطة) على أنهما متساويان.
إذا اختلف نوع العمود عن نوع الحقل في رسالة Protocol Buffers، فسيُطبَّق التحويل اللازم.
الرسائل المتداخلة مدعومة. على سبيل المثال، بالنسبة إلى الحقل z في نوع الرسالة التالي:
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 (تُستخدم لحقل معيَّن غائب من الرسالة):
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:Protobuf:
protobuf_message_from_clickhouse.bin.
قراءة البيانات وكتابتها باستخدام ClickHouse Cloud
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'
format_schema_source='query'
استخدام المخطط المُنشأ تلقائيًا
format_protobuf_use_autogenerated_schema.
على سبيل المثال:
structureToProtobufSchema. ثم سيستخدم هذا المخطط لتسلسل البيانات بتنسيق Protobuf.
يمكنك أيضًا قراءة ملف Protobuf باستخدام المخطط المُنشأ تلقائيًا. في هذه الحالة، يجب أن يكون الملف قد أُنشئ باستخدام المخطط نفسه:
format_protobuf_use_autogenerated_schema مفعّلًا افتراضيًا، ويُطبَّق إذا لم يتم تعيين format_schema.
يمكنك أيضًا حفظ المخطط المُنشأ تلقائيًا في الملف أثناء الإدخال/الإخراج باستخدام الإعداد output_format_schema. على سبيل المثال:
path/to/schema/schema.capnp.
حذف ذاكرة التخزين المؤقت لـ Protobuf
format_schema_path، استخدم تعليمة SYSTEM DROP ... FORMAT CACHE.