الانتقال إلى المحتوى الرئيسي
يدعم ClickHouse عدة تنسيقات ثنائية، ما يوفّر أداءً أفضل وكفاءة أعلى في استهلاك المساحة. كما أن التنسيقات الثنائية آمنة أيضًا من حيث ترميز المحارف، لأن البيانات تُحفَظ في هيئة ثنائية. سنستخدم جدول some_data table وملف data للتوضيح، ويمكنك إعادة تطبيق ذلك على مثيل ClickHouse لديك.

التصدير بتنسيق Native الخاص بـ ClickHouse

أكثر تنسيقات البيانات كفاءةً لتصدير البيانات واستيرادها بين عُقد ClickHouse هو تنسيق Native. ويُجرى التصدير باستخدام العبارة INTO OUTFILE:
SELECT * FROM some_data
INTO OUTFILE 'data.clickhouse' FORMAT Native
سيؤدي هذا إلى إنشاء ملف data.clickhouse بتنسيق Native.

الاستيراد من تنسيق Native

لاستيراد البيانات، يمكن استخدام file() مع الملفات الأصغر أو لأغراض الاستكشاف:
DESCRIBE file('data.clickhouse', Native);
┌─name──┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path  │ String │              │                    │         │                  │                │
│ month │ Date   │              │                    │         │                  │                │
│ hits  │ UInt32 │              │                    │         │                  │                │
└───────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
عند استخدام الدالة file() مع ClickHouse Cloud، ستحتاج إلى تشغيل الأوامر في clickhouse client على الجهاز الموجود عليه الملف. ويمكنك أيضًا استخدام clickhouse-local لاستكشاف الملفات محليًا.
في بيئة production، نستخدم FROM INFILE لاستيراد البيانات:
INSERT INTO sometable
FROM INFILE 'data.clickhouse'
FORMAT Native

ضغط تنسيق Native

يمكننا أيضًا تفعيل الضغط عند تصدير البيانات إلى تنسيق Native (وكذلك معظم التنسيقات الأخرى) باستخدام بند COMPRESSION:
SELECT * FROM some_data
INTO OUTFILE 'data.clickhouse'
COMPRESSION 'lz4'
FORMAT Native
استخدمنا ضغط LZ4 للتصدير. وسنحتاج إلى تحديد ذلك عند استيراد البيانات:
INSERT INTO sometable
FROM INFILE 'data.clickhouse'
COMPRESSION 'lz4'
FORMAT Native

التصدير إلى RowBinary

من بين التنسيقات الثنائية المدعومة أيضًا RowBinary، والذي يتيح استيراد البيانات وتصديرها في صورة صفوف ممثلة ثنائيًا:
SELECT * FROM some_data
INTO OUTFILE 'data.binary' FORMAT RowBinary
سيؤدي ذلك إلى إنشاء ملف data.binary بتنسيق ثنائي للصفوف.

استكشاف ملفات RowBinary

لا يدعم هذا التنسيق استنتاج المخطط تلقائيًا، لذا يجب تحديد المخطط صراحةً للاستكشاف قبل التحميل:
SELECT *
FROM file('data.binary', RowBinary, 'path String, month Date, hits UInt32')
LIMIT 5
┌─path───────────────────────────┬──────month─┬─hits─┐
│ Bangor_City_Forest             │ 2015-07-01 │   34 │
│ Alireza_Afzal                  │ 2017-02-01 │   24 │
│ Akhaura-Laksam-Chittagong_Line │ 2015-09-01 │   30 │
│ 1973_National_500              │ 2017-10-01 │   80 │
│ Attachment                     │ 2017-09-01 │ 1356 │
└────────────────────────────────┴────────────┴──────┘
يمكنك استخدام RowBinaryWithNames، إذ يضيف أيضًا صف عنوان يتضمن قائمة بأسماء الأعمدة. كما يضيف RowBinaryWithNamesAndTypes صف عنوان إضافيًا يتضمن أنواع الأعمدة.

الاستيراد من ملفات RowBinary

لتحميل البيانات من ملف RowBinary، يمكن استخدام بند FROM INFILE:
INSERT INTO sometable
FROM INFILE 'data.binary'
FORMAT RowBinary

استيراد قيمة ثنائية واحدة باستخدام RawBLOB

لنفترض أننا نريد قراءة ملف ثنائي بالكامل وحفظه في حقل ضمن جدول. وهذه هي الحالة التي يمكن فيها استخدام تنسيق RawBLOB. ولا يمكن استخدام هذا التنسيق مباشرةً إلا مع جدول ذي عمود واحد فقط:
CREATE TABLE images(data String) ENGINE = Memory
لنحفظ ملف صورة في الجدول images:
cat image.jpg | clickhouse-client -q "INSERT INTO images FORMAT RawBLOB"
يمكننا التحقق من طول حقل data، إذ سيكون مساويًا لحجم الملف الأصلي:
SELECT length(data) FROM images
┌─length(data)─┐
│         6121 │
└──────────────┘

تصدير بيانات RawBLOB

يمكن أيضًا استخدام هذا التنسيق لتصدير البيانات باستخدام عبارة INTO OUTFILE:
SELECT * FROM images LIMIT 1
INTO OUTFILE 'out.jpg'
FORMAT RawBLOB
لاحظ أننا اضطررنا إلى استخدام LIMIT 1، لأن تصدير أكثر من قيمة واحدة سيؤدي إلى إنشاء ملف تالف.

MessagePack

يدعم ClickHouse الاستيراد من MessagePack والتصدير إليه باستخدام MsgPack. للتصدير بتنسيق MessagePack:
SELECT *
FROM some_data
INTO OUTFILE 'data.msgpk'
FORMAT MsgPack
لاستيراد البيانات من ملف بتنسيق MessagePack:
INSERT INTO sometable
FROM INFILE 'data.msgpk'
FORMAT MsgPack

Protocol Buffers

للعمل مع Protocol Buffers، نحتاج أولًا إلى تعريف ملف المخطط:
syntax = "proto3";

message MessageType {
  string path = 1;
  date month = 2;
  uint32 hits = 3;
};
يُضبط مسار ملف المخطط هذا (schema.proto في حالتنا) عبر خيار الإعداد format_schema الخاص بتنسيق Protobuf:
SELECT * FROM some_data
INTO OUTFILE 'proto.bin'
FORMAT Protobuf
SETTINGS format_schema = 'schema:MessageType'
يحفظ هذا البيانات في ملف proto.bin. ويدعم ClickHouse أيضًا استيراد بيانات Protobuf، بالإضافة إلى الرسائل المتداخلة. يُستحسن استخدام ProtobufSingle للعمل مع رسالة Protocol Buffer واحدة (لن تُضمَّن محددات الطول في هذه الحالة).

Cap’n Proto

من تنسيقات التسلسل الثنائي الشائعة الأخرى التي يدعمها ClickHouse تنسيق Cap’n Proto. وكما هو الحال مع تنسيق Protobuf، علينا تعريف ملف المخطط (schema.capnp) في مثالنا:
@0xec8ff1a10aa10dbe;

struct PathStats {
  path @0 :Text;
  month @1 :UInt32;
  hits @2 :UInt32;
}
يمكننا الآن الاستيراد والتصدير باستخدام تنسيق CapnProto والمخطط التالي:
SELECT
    path,
    CAST(month, 'UInt32') AS month,
    hits
FROM some_data
INTO OUTFILE 'capnp.bin'
FORMAT CapnProto
SETTINGS format_schema = 'schema:PathStats'
لاحظ أننا اضطررنا إلى تحويل نوع العمود Date إلى UInt32 من أجل مطابقة الأنواع المقابلة.

تنسيقات أخرى

يدعم ClickHouse العديد من التنسيقات، النصية والثنائية، لتلبية مختلف السيناريوهات والمنصات. اطّلع على المزيد من التنسيقات وطرق العمل معها في المقالات التالية: واطّلع أيضًا على clickhouse-local — وهي أداة محمولة متكاملة الميزات للعمل على الملفات المحلية/البعيدة دون تشغيل ClickHouse server.
آخر تعديل في ٢٥ يونيو ٢٠٢٦