يُعد Parquet تنسيق ملفات فعّالًا لتخزين البيانات بصيغة عمودية. يوفّر ClickHouse دعمًا لقراءة ملفات Parquet وكتابتها.
الاستيراد من Parquet
قبل تحميل البيانات، يمكننا استخدام الدالة file() لاستعراض بنية ملف Parquet تجريبي:
DESCRIBE TABLE file('data.parquet', Parquet);لقد استخدمنا Parquet كوسيطةٍ ثانية لكي يعرف ClickHouse تنسيق الملف. سيطبع هذا الأعمدة مع أنواعها:
┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path │ Nullable(String) │ │ │ │ │ │
│ date │ Nullable(String) │ │ │ │ │ │
│ hits │ Nullable(Int64) │ │ │ │ │ │
└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘يمكننا أيضًا استكشاف الملفات قبل استيراد البيانات فعليًا، باستخدام إمكانات SQL الكاملة:
SELECT *
FROM file('data.parquet', Parquet)
LIMIT 3;┌─path──────────────────────┬─date───────┬─hits─┐
│ Akiba_Hebrew_Academy │ 2017-08-01 │ 241 │
│ Aegithina_tiphia │ 2018-02-01 │ 34 │
│ 1971-72_Utah_Stars_season │ 2016-10-01 │ 1 │
└───────────────────────────┴────────────┴──────┘الاستيراد إلى جدول موجود
فلننشئ جدولًا سنستورد إليه بيانات Parquet:
CREATE TABLE sometable
(
`path` String,
`date` Date,
`hits` UInt32
)
ENGINE = MergeTree
ORDER BY (date, path);يمكننا الآن استيراد البيانات باستخدام الجملة FROM INFILE:
INSERT INTO sometable
FROM INFILE 'data.parquet' FORMAT Parquet;
SELECT *
FROM sometable
LIMIT 5;┌─path──────────────────────────┬───────date─┬─hits─┐
│ 1988_in_philosophy │ 2015-05-01 │ 70 │
│ 2004_Green_Bay_Packers_season │ 2015-05-01 │ 970 │
│ 24_hours_of_lemans │ 2015-05-01 │ 37 │
│ 25604_Karlin │ 2015-05-01 │ 20 │
│ ASCII_ART │ 2015-05-01 │ 9 │
└───────────────────────────────┴────────────┴──────┘لاحظ كيف حوّل ClickHouse تلقائيًا السلاسل النصية في Parquet (في العمود date) إلى النوع Date. ويعود ذلك إلى أن ClickHouse يُجري تحويلًا تلقائيًا للنوع استنادًا إلى الأنواع الموجودة في الجدول الهدف.
إدراج ملف محلي في خادم بعيد
إذا كنت تريد إدراج ملف Parquet محلي في خادم ClickHouse بعيد، فيمكنك القيام بذلك بتمرير محتويات الملف إلى clickhouse-client، كما هو موضح أدناه:
clickhouse client -q "INSERT INTO sometable FORMAT Parquet" < data.parquetإنشاء جداول جديدة من ملفات Parquet
بما أن ClickHouse يقرأ مخطط ملف Parquet، يمكننا إنشاء الجداول مباشرةً:
CREATE TABLE imported_from_parquet
ENGINE = MergeTree
ORDER BY tuple() AS
SELECT *
FROM file('data.parquet', Parquet)سيؤدي ذلك تلقائيًا إلى إنشاء جدول وملئه من ملف Parquet معيّن:
DESCRIBE TABLE imported_from_parquet;┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path │ Nullable(String) │ │ │ │ │ │
│ date │ Nullable(String) │ │ │ │ │ │
│ hits │ Nullable(Int64) │ │ │ │ │ │
└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘افتراضيًا، يتعامل ClickHouse بصرامة مع أسماء الأعمدة والأنواع والقيم. لكن في بعض الحالات، يمكن تخطي الأعمدة غير الموجودة أو القيم غير المدعومة أثناء الاستيراد. ويمكن التحكم في ذلك باستخدام إعدادات Parquet.
التصدير إلى تنسيق Parquet
لتصدير أي جدول أو نتيجة استعلام إلى ملف Parquet، يمكن استخدام عبارة INTO OUTFILE:
SELECT *
FROM sometable
INTO OUTFILE 'export.parquet'
FORMAT Parquetسينشئ ذلك الملف export.parquet في دليل العمل.
أنواع البيانات في ClickHouse وParquet
تتطابق أنواع البيانات في ClickHouse وParquet إلى حدٍّ كبير، لكنها تختلف قليلًا. على سبيل المثال، يصدِّر ClickHouse النوع DateTime بصيغة int64 في Parquet. وإذا استوردنا هذا مجددًا إلى ClickHouse، فسنرى أرقامًا (ملف time.parquet):
SELECT * FROM file('time.parquet', Parquet);┌─n─┬───────time─┐
│ 0 │ 1673622611 │
│ 1 │ 1673622610 │
│ 2 │ 1673622609 │
│ 3 │ 1673622608 │
│ 4 │ 1673622607 │
└───┴────────────┘في هذه الحالة، يمكن استخدام تحويل الأنواع:
SELECT
n,
toDateTime(time) <--- int to time
FROM file('time.parquet', Parquet);┌─n─┬────toDateTime(time)─┐
│ 0 │ 2023-01-13 15:10:11 │
│ 1 │ 2023-01-13 15:10:10 │
│ 2 │ 2023-01-13 15:10:09 │
│ 3 │ 2023-01-13 15:10:08 │
│ 4 │ 2023-01-13 15:10:07 │
└───┴─────────────────────┘للمزيد من القراءة
يوفّر ClickHouse دعمًا للعديد من التنسيقات، النصية والثنائية على حدّ سواء، لتلبية مختلف السيناريوهات والمنصات. اطّلع على المزيد من التنسيقات وطرق العمل معها في المقالات التالية:
واطّلع أيضًا على clickhouse-local - وهي أداة محمولة متكاملة الميزات للعمل على الملفات المحلية/البعيدة دون الحاجة إلى خادم ClickHouse.