يدعم ClickHouse استيراد البيانات من CSV وتصديرها إليه. ونظرًا إلى أن ملفات CSV قد تختلف في تفاصيل التنسيق، بما في ذلك صفوف العناوين والفواصل المخصصة ورموز الإفلات، فإن ClickHouse يوفّر تنسيقات وإعدادات للتعامل مع كل حالة بكفاءة.
استيراد البيانات من ملف CSV
قبل استيراد البيانات، لنُنشئ جدولًا ذا بنية مناسبة:
لاستيراد البيانات من ملف CSV إلى الجدول sometable، يمكننا توجيه ملفنا مباشرةً إلى clickhouse-client:
لاحظ أننا نستخدم FORMAT CSV لإبلاغ ClickHouse بأننا نُدخِل بيانات بتنسيق CSV. وبدلًا من ذلك، يمكننا تحميل البيانات من ملف محلي باستخدام عبارة FROM INFILE:
هنا، نستخدم العبارة FORMAT CSV لكي يتعرّف ClickHouse على تنسيق الملف. ويمكننا أيضًا تحميل البيانات مباشرةً من عناوين URL باستخدام الدالة url()، أو من ملفات S3 باستخدام الدالة s3().
يمكننا أيضًا تجاوز تحديد التنسيق صراحةً في file() وINFILE/OUTFILE.
وفي هذه الحالة، سيتعرّف ClickHouse تلقائيًا على التنسيق استنادًا إلى امتداد الملف.
لنفترض أن ملف CSV يتضمن صف العناوين:
لاستيراد البيانات من هذا الملف، يمكن استخدام تنسيق CSVWithNames:
في هذه الحالة، يتخطّى ClickHouse الصف الأول عند استيراد البيانات من الملف.
بدءًا من الإصدار 23.1، سيكتشف ClickHouse تلقائيًا صفوف العناوين في ملفات CSV عند استخدام التنسيق CSV، لذا لا حاجة إلى استخدام CSVWithNames أو CSVWithNamesAndTypes.
ملفات CSV ذات محددات مخصصة
إذا كان ملف CSV يستخدم محددًا غير الفاصلة، فيمكننا استخدام الخيار format_csv_delimiter لتحديد الرمز المناسب:
الآن، عند الاستيراد من ملف CSV، سيُستخدم الرمز ; كفاصل بدلًا من الفاصلة.
أحيانًا، قد نحتاج إلى تخطي عدد معيّن من الأسطر أثناء استيراد البيانات من ملف CSV. ويمكن إجراء ذلك باستخدام الخيار input_format_csv_skip_first_lines:
في هذه الحالة، سنتجاوز الأسطر العشرة الأولى من ملف CSV:
يحتوي الملف على 1k صف، لكن ClickHouse حمّل 990 صفًا فقط لأننا طلبنا تخطي أول 10 صفوف.
عند استخدام الدالة file() في ClickHouse Cloud، ستحتاج إلى تشغيل الأوامر في clickhouse client على الجهاز الذي يوجد عليه الملف. وخيار آخر هو استخدام clickhouse-local لاستكشاف الملفات محليًا.
التعامل مع قيم NULL في ملفات CSV
يمكن تمثيل قيم NULL بطرق مختلفة بحسب التطبيق الذي أنشأ الملف. وبشكل افتراضي، يستخدم ClickHouse القيمة \N لتمثيل NULL في CSV. لكن يمكننا تغيير ذلك باستخدام الخيار format_csv_null_representation.
لنفترض أن لدينا ملف CSV التالي:
إذا قمنا بتحميل البيانات من هذا الملف، فسيتعامل ClickHouse مع Nothing باعتباره String (وهذا صحيح):
إذا أردنا أن يتعامل ClickHouse مع Nothing باعتباره NULL، فيمكننا ضبط ذلك باستخدام الخيار التالي:
الآن أصبح لدينا NULL في الموضع الذي نتوقعه فيه:
ملفات TSV (مفصولة بعلامات الجدولة)
يُستخدم تنسيق البيانات المفصول بعلامات الجدولة على نطاق واسع كتنسيق لتبادل البيانات. لتحميل البيانات من ملف TSV إلى ClickHouse، يُستخدم التنسيق TabSeparated:
هناك أيضًا صيغة TabSeparatedWithNames تتيح العمل مع ملفات TSV التي تحتوي على صف عناوين. وكما في CSV، يمكننا تخطي أول X أسطر باستخدام الخيار input_format_tsv_skip_first_lines.
أحيانًا تُحفَظ ملفات TSV من دون إفلات علامات الجدولة وفواصل الأسطر. لذا ينبغي استخدام TabSeparatedRaw للتعامل مع هذه الملفات.
يمكن أيضًا استخدام أي تنسيق ورد في الأمثلة السابقة لتصدير البيانات. ولتصدير البيانات من جدول (أو من استعلام) بتنسيق CSV، نستخدم عبارة FORMAT نفسها:
لإضافة صفّ رؤوس الأعمدة إلى ملف CSV، نستخدم التنسيق CSVWithNames:
حفظ البيانات المُصدَّرة في ملف CSV
لحفظ البيانات المُصدَّرة في ملف، يمكن استخدام العبارة INTO…OUTFILE:
لاحظ أن ClickHouse استغرق ~1 ثانية فقط لحفظ 36 مليون صف في ملف CSV.
تصدير CSV باستخدام محددات مخصّصة
إذا أردنا استخدام محددات غير الفاصلة، فيمكننا استخدام خيار الإعداد format_csv_delimiter لهذا الغرض:
الآن سيستخدم ClickHouse الرمز | كمحدد في تنسيق CSV:
إذا أردنا أن يعمل ملف CSV بشكل جيد في بيئة Windows، فينبغي مراعاة تفعيل خيار output_format_csv_crlf_end_of_line. سيؤدي ذلك إلى استخدام \r\n كفواصل أسطر بدلًا من \n:
استنتاج المخطط لملفات CSV
في كثير من الحالات، قد نتعامل مع ملفات CSV غير معروفة، لذا نحتاج إلى تحديد الأنواع المناسبة للأعمدة. يحاول ClickHouse، افتراضيًا، استنتاج تنسيقات البيانات بناءً على تحليله لملف CSV معيّن. ويُعرف ذلك باسم “استنتاج المخطط”. ويمكن الاطّلاع على أنواع البيانات المكتشفة باستخدام عبارة DESCRIBE بالاقتران مع الدالة file():
هنا، يستطيع ClickHouse استنتاج أنواع الأعمدة في ملف CSV الخاص بنا بكفاءة. وإذا لم نرد أن يقوم ClickHouse بهذا الاستنتاج، فيمكننا تعطيل ذلك باستخدام الخيار التالي:
ستُعامل جميع أنواع الأعمدة على أنها String في هذه الحالة.
تصدير CSV واستيراده مع تحديد أنواع الأعمدة صراحةً
يتيح ClickHouse أيضًا تحديد أنواع الأعمدة صراحةً عند تصدير البيانات باستخدام CSVWithNamesAndTypes (وصيغ WithNames الأخرى ضمن الفئة نفسها):
سيتضمن هذا التنسيق صفَّي ترويسة: أحدهما يتضمن أسماء الأعمدة، والآخر أنواع الأعمدة. يتيح ذلك لـ ClickHouse (وللتطبيقات الأخرى) التعرّف على أنواع الأعمدة عند تحميل البيانات من ملفات مثل هذه:
يحدّد ClickHouse الآن أنواع الأعمدة استنادًا إلى صفّ ترويسةٍ ثانٍ بدلًا من التخمين.
المحددات والفواصل وقواعد الإفلات المخصصة
في الحالات المعقدة، يمكن تنسيق البيانات النصية بطريقة مخصصة للغاية مع الاحتفاظ ببنية محددة. يوفّر ClickHouse تنسيق CustomSeparated خاصًا لمثل هذه الحالات، إذ يتيح تعيين قواعد إفلات مخصصة، ومحددات، وفواصل أسطر، ورموز بداية ونهاية.
لنفترض أن لدينا البيانات التالية في الملف:
يمكننا أن نرى أن الصفوف الفردية مُحاطة بـ row()، وتُفصل الأسطر باستخدام ,، وتُفصل القيم الفردية باستخدام ;. في هذه الحالة، يمكننا استخدام الإعدادات التالية لقراءة البيانات من هذا الملف:
الآن يمكننا تحميل البيانات من ملف بتنسيقنا المخصّص:
يمكننا أيضًا استخدام CustomSeparatedWithNames لضمان تصدير رؤوس الأعمدة واستيرادها بشكل صحيح. استكشف تنسيقات Regex وTemplate للتعامل مع حالات أكثر تعقيدًا.
العمل مع ملفات CSV الكبيرة
قد تكون ملفات CSV كبيرة الحجم، ويعمل ClickHouse بكفاءة مع الملفات مهما كان حجمها. وعادةً ما تكون الملفات الكبيرة مضغوطة، ويتعامل ClickHouse مع ذلك دون الحاجة إلى فك الضغط قبل المعالجة. يمكننا استخدام عبارة COMPRESSION أثناء عملية الإدراج:
إذا لم تُذكر عبارة COMPRESSION، فسيحاول ClickHouse رغم ذلك استنتاج ضغط الملف من امتداده. ويمكن اتباع النهج نفسه لتصدير الملفات مباشرةً بصيغ مضغوطة:
سيؤدي ذلك إلى إنشاء الملف المضغوط data_csv.csv.gz.
يدعم ClickHouse العديد من التنسيقات، النصية منها والثنائية، لتلبية سيناريوهات ومنصات متنوعة. استكشف المزيد من التنسيقات وطرق العمل معها في المقالات التالية:
واطّلع أيضًا على clickhouse-local - وهي أداة محمولة كاملة الميزات للعمل على الملفات المحلية/البعيدة دون الحاجة إلى خادم ClickHouse.