يدعم 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 │ │ │ │ │ │
└───────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘في بيئة 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 MsgPackProtocol 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 العديد من التنسيقات، النصية والثنائية، لتلبية مختلف السيناريوهات والمنصات. اطّلع على المزيد من التنسيقات وطرق العمل معها في المقالات التالية:
- تنسيقات CSV وTSV
- Parquet
- تنسيقات JSON
- Regex وTemplate
- تنسيقات Native والثنائية
- تنسيقات SQL
واطّلع أيضًا على clickhouse-local — وهي أداة محمولة متكاملة الميزات للعمل على الملفات المحلية/البعيدة دون تشغيل ClickHouse server.