الانتقال إلى المحتوى الرئيسي
يوفّر واجهة شبيهة بالجداول للاستعلام عن الملفات وإدراجها في Amazon S3 وGoogle Cloud Storage. تشبه دالة الجدول هذه دالة hdfs، لكنها توفّر ميزات خاصة بـ S3. إذا كان لديك عدة نسخ متماثلة في عنقودك، فيمكنك استخدام دالة s3Cluster بدلًا من ذلك لموازاة عمليات الإدراج. عند استخدام s3 table function مع INSERT INTO...SELECT، تُقرأ البيانات وتُدرج بأسلوب تدفقي. ولا يبقى في الذاكرة إلا عدد قليل من كتل البيانات، بينما تُقرأ الكتل باستمرار من S3 وتُرسَل إلى الجدول الوجهة.

الصيغة

GCSتتكامل دالة الجدول S3 مع Google Cloud Storage باستخدام GCS XML API ومفاتيح HMAC. راجع مستندات التوافق من Google لمزيد من التفاصيل حول نقطة النهاية وHMAC.بالنسبة إلى GCS، استبدل HMAC Key وHMAC secret الخاصين بك في الموضعين اللذين يظهر فيهما access_key_id وsecret_access_key.
المعلمات تدعم دالة الجدول s3 المعلمات البسيطة التالية:
GCSيكون URL الخاص بـ GCS بهذا التنسيق لأن نقطة النهاية الخاصة بـ Google XML API تختلف عن JSON API:
وليس https://storage.cloud.google.com.
يمكن أيضًا تمرير الوسيطات باستخدام named collections. في هذه الحالة، تعمل url وaccess_key_id وsecret_access_key وformat وstructure وcompression_method بالطريقة نفسها، كما تتوفر بعض المعلمات الإضافية المدعومة:

القيمة المعادة

جدول ذو البنية المحددة لقراءة البيانات أو كتابتها في الملف المحدد.

أمثلة

تحديد أول 5 صفوف من الجدول من ملف S3 ‏https://datasets-documentation.s3.eu-west-3.amazonaws.com/aapl_stock.csv:
يستخدم ClickHouse امتدادات أسماء الملفات لتحديد تنسيق البيانات. على سبيل المثال، كان بإمكاننا تشغيل الأمر السابق من دون CSVWithNames:
ويمكن لـ ClickHouse أيضًا تحديد طريقة ضغط الملف. على سبيل المثال، إذا كان الملف مضغوطًا بامتداد .csv.gz، فسيقوم ClickHouse بفك ضغطه تلقائيًا.
قد تُربك ملفات Parquet ذات الأسماء مثل *.parquet.snappy أو *.parquet.zstd ClickHouse، وتتسبب في ظهور الخطأين TOO_LARGE_COMPRESSED_BLOCK أو ZSTD_DECODER_FAILED. ويحدث ذلك لأن ClickHouse سيحاول قراءة الملف بالكامل على أنه بيانات مرمّزة باستخدام Snappy أو ZSTD، بينما يطبّق Parquet الضغط على مستوى مجموعات الصفوف والأعمدة.تحدد البيانات الوصفية في Parquet الضغط لكل عمود بالفعل، لذا يكون امتداد الملف زائدًا عن الحاجة. يمكنك ببساطة استخدام compression_method = 'none' في مثل هذه الحالات:

الاستخدام

لنفترض أن لدينا عدة ملفات بعناوين URI التالية على S3: احسب عدد الصفوف في الملفات التي تنتهي بأرقام من 1 إلى 3:
احسب العدد الإجمالي للصفوف في جميع الملفات الموجودة في هذين الدليلين:
إذا كانت قائمة ملفاتك تتضمن نطاقات رقمية تبدأ بأصفار بادئة، فاستخدم الصيغة التي تحتوي على أقواس لكل رقم على حدة، أو استخدم ?.
احسب العدد الإجمالي للصفوف في الملفات المسماة file-000.csv، file-001.csv، … ، file-999.csv:
أدرج البيانات في الملف test-data.csv.gz:
أدرج البيانات في الملف test-data.csv.gz من جدول موجود:
يمكن استخدام ** في Glob للاجتياز التعاودي للمجلدات. انظر المثال أدناه، إذ سيجلب جميع الملفات من مجلد my-test-bucket-768 بشكل تعاودي:
يجلب ما يلي البيانات من جميع ملفات test-data.csv.gz الموجودة في أي مجلد داخل دليل my-test-bucket بشكل تعاودي:
ملاحظة. يمكن تحديد محوّلات URL مخصصة في ملف تكوين الخادم. مثال:
سيتم استبدال URL 's3://clickhouse-public-datasets/my-test-bucket-768/**/test-data.csv.gz' بـ 'http://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/**/test-data.csv.gz' يمكن إضافة mapper مخصّص إلى config.xml:
في حالات الاستخدام في بيئة الإنتاج، يُوصى باستخدام named collections. وفيما يلي مثال على ذلك:

الكتابة المُقسَّمة إلى أجزاء

استراتيجية التقسيم

مدعومة فقط لاستعلامات INSERT. wildcard: يستبدل حرف البدل {_partition_id} في مسار الملف بمفتاح التقسيم الفعلي. يُحدَّد افتراضيًا فقط ضمن إعدادات compatibility الأقدم من 26.6؛ وإلا تكون القيمة الافتراضية هي hive (راجع الإعداد file_like_engine_default_partition_strategy). hive يطبّق التقسيم بنمط Hive على عمليات القراءة والكتابة. ويُنشئ الملفات باستخدام التنسيق التالي: <prefix>/<key1=val1/key2=val2...>/<snowflakeid>.<toLower(file_format)>. مثال على استراتيجية التقسيم hive
أمثلة على استراتيجية التقسيم wildcard
  1. يؤدي استخدام معرّف القسم في المفتاح إلى إنشاء ملفات منفصلة:
ونتيجةً لذلك، تُكتَب البيانات في ثلاثة ملفات: file_x.csv وfile_y.csv وfile_z.csv.
  1. يؤدّي استخدام معرّف القسم ضمن اسم حاوية التخزين إلى إنشاء ملفات في حاويات تخزين مختلفة:
ونتيجةً لذلك، تُكتب البيانات في ثلاثة ملفات ضمن حاويات تخزين مختلفة: my_bucket_1/file.csv وmy_bucket_10/file.csv وmy_bucket_20/file.csv.

الوصول إلى حاويات التخزين العامة

يحاول ClickHouse جلب بيانات الاعتماد من أنواع متعددة من المصادر. وقد يؤدي ذلك أحيانًا إلى حدوث مشكلات عند الوصول إلى بعض حاويات التخزين العامة، ما يتسبب في أن يعيد العميل رمز الخطأ 403. يمكن تجنب هذه المشكلة باستخدام الكلمة المحجوزة NOSIGN، ما يُجبر العميل على تجاهل جميع بيانات الاعتماد وعدم توقيع الطلبات.

استخدام بيانات اعتماد S3 ‏(ClickHouse Cloud)

بالنسبة إلى حاويات التخزين غير العامة، يمكن للمستخدمين تمرير aws_access_key_id وaws_secret_access_key إلى الدالة. على سبيل المثال:
يُعد هذا مناسبًا لعمليات الوصول لمرة واحدة أو في الحالات التي يمكن فيها تغيير بيانات الاعتماد بسهولة. ومع ذلك، لا يُنصح به كحل طويل الأمد لعمليات الوصول المتكررة أو عندما تكون بيانات الاعتماد حساسة. في هذه الحالة، نوصي بأن يعتمد المستخدمون على الوصول المستند إلى الأدوار. يَرِد توثيق الوصول المستند إلى الأدوار لـ S3 في ClickHouse Cloud هنا. بعد الإعداد، يمكن تمرير roleARN إلى الدالة s3 عبر المعلمة extra_credentials. على سبيل المثال:
يمكن أيضًا تمرير external_id اختياريًا إلى جانب role_arn. ويُمرَّر كمعلمة ExternalId في استدعاء AWS STS AssumeRole، ويتيح لسياسة الثقة الخاصة بالدور أن تشترط سرًا مشتركًا، مما يحدّ من مشكلة النائب المرتبك. على سبيل المثال:
يمكنك العثور على المزيد من الأمثلة هنا

العمل مع الأرشيفات

لنفترض أن لدينا عدة ملفات أرشيف بعناوين URI التالية على S3: يمكن استخراج البيانات من هذه الأرشيفات باستخدام ::. ويمكن استخدام أنماط globs سواء في جزء URL أو في الجزء الذي يلي :: (وهو المسؤول عن اسم الملف داخل الأرشيف).
يدعم ClickHouse ثلاثة تنسيقات للأرشيف: ZIP TAR 7Z وبينما يمكن الوصول إلى أرشيفات ZIP وTAR من أي موقع تخزين مدعوم، فلا يمكن قراءة أرشيفات 7Z إلا من نظام الملفات المحلي الذي ثُبّت عليه ClickHouse.

إدراج البيانات

لاحظ أن الصفوف لا يمكن إدراجها إلا في الملفات الجديدة. ولا توجد دورات دمج أو عمليات تقسيم للملفات. وما إن يُكتَب ملف حتى تفشل عمليات الإدراج اللاحقة. اطّلع على مزيد من التفاصيل هنا.

الأعمدة الافتراضية

  • _path — مسار الملف. النوع: LowCardinality(String). في حالة الأرشيف، يعرض المسار بالتنسيق: "{path_to_archive}::{path_to_file_inside_archive}"
  • _file — اسم الملف. النوع: LowCardinality(String). في حالة الأرشيف، يعرض اسم الملف داخل الأرشيف.
  • _size — حجم الملف بالبايت. النوع: Nullable(UInt64). إذا كان حجم الملف غير معروف، تكون القيمة NULL. في حالة الأرشيف، يعرض حجم الملف غير المضغوط للملف الموجود داخل الأرشيف.
  • _time — وقت آخر تعديل للملف. النوع: Nullable(DateTime). إذا كان الوقت غير معروف، تكون القيمة NULL.

إعداد use_hive_partitioning

هذا تلميح لـ ClickHouse لتحليل الملفات المُقسَّمة بنمط Hive عند القراءة. ولا يؤثر في الكتابة. ولتحقيق تماثل بين القراءة والكتابة، استخدم الوسيطة partition_strategy. عند ضبط use_hive_partitioning على القيمة 1، سيكتشف ClickHouse التقسيم بنمط Hive في المسار (/name=value/) وسيتيح استخدام أعمدة التقسيم بوصفها أعمدة افتراضية في الاستعلام. وستحمل هذه الأعمدة الافتراضية الأسماء نفسها الموجودة في المسار المُقسَّم. مثال

الوصول إلى حاويات التخزين requester-pays

للوصول إلى حاوية التخزين requester-pays، يجب تمرير الترويسة x-amz-request-payer = requester مع أي طلب. ويتم ذلك بتمرير المعلمة headers('x-amz-request-payer' = 'requester') إلى الدالة s3. على سبيل المثال:

إعدادات التخزين

  • s3_truncate_on_insert - يتيح تفريغ الملف قبل الإدراج فيه. معطّل افتراضيًا.
  • s3_create_new_file_on_insert - يتيح إنشاء ملف جديد عند كل عملية إدراج إذا كان للتنسيق لاحقة. معطّل افتراضيًا.
  • s3_skip_empty_files - يتيح تخطي الملفات الفارغة أثناء القراءة. مفعّل افتراضيًا.

مخططات Avro المتداخلة

عند قراءة ملفات Avro التي تحتوي على سجلات متداخلة تختلف من ملف إلى آخر (على سبيل المثال، تحتوي بعض الملفات على حقل إضافي داخل كائن متداخل)، فقد يُرجع ClickHouse خطأً مثل:
عدد الأوراق في السجل لا يطابق عدد العناصر في Tuple…
يحدث ذلك لأن ClickHouse يتوقع أن تتطابق جميع بُنى السجلات المتداخلة مع المخطط نفسه. للتعامل مع هذه الحالة، يمكنك:
  • استخدام schema_inference_mode='union' لدمج مخططات السجلات المتداخلة المختلفة، أو
  • مواءمة البُنى المتداخلة يدويًا وتمكين use_structure_from_insertion_table_in_table_functions=1.
ملاحظة حول الأداءقد يستغرق schema_inference_mode='union' وقتًا أطول جدًا مع مجموعات بيانات S3 الكبيرة، لأنه يحتاج إلى فحص كل ملف لاستنتاج المخطط.
مثال
آخر تعديل في ٢ يوليو ٢٠٢٦