s3 table function مع INSERT INTO...SELECT، تُقرأ البيانات وتُدرج بأسلوب تدفقي. ولا يبقى في الذاكرة إلا عدد قليل من كتل البيانات، بينما تُقرأ الكتل باستمرار من S3 وتُرسَل إلى الجدول الوجهة.
الصيغة
s3 المعلمات البسيطة التالية:
GCSيكون عنوان URL لـ GCS بهذا التنسيق، إذ تختلف نقطة نهاية Google XML API عن JSON API:وليس https://storage.cloud.google.com.
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 امتدادات أسماء الملفات لتحديد تنسيق البيانات. على سبيل المثال، كان بإمكاننا تشغيل الأمر السابق من دون ويمكن لـ ClickHouse أيضًا تحديد طريقة ضغط الملف. على سبيل المثال، إذا كان الملف مضغوطًا بامتداد
CSVWithNames:.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:- ‘https://datasets-documentation.s3.eu-west-3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_1.csv'
- ‘https://datasets-documentation.s3.eu-west-3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_2.csv'
- ‘https://datasets-documentation.s3.eu-west-3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_3.csv'
- ‘https://datasets-documentation.s3.eu-west-3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_4.csv'
- ‘https://datasets-documentation.s3.eu-west-3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_1.csv'
- ‘https://datasets-documentation.s3.eu-west-3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_2.csv'
- ‘https://datasets-documentation.s3.eu-west-3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_3.csv'
- ‘https://datasets-documentation.s3.eu-west-3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_4.csv'
file-1.csv، …، file-4.csv:
test-data.csv.gz:
test-data.csv.gz من جدول موجود:
** في نمط glob للاجتياز التكراري للمجلدات. يقرأ الاستعلام التالي كل ملف باسم some_file_1.csv ضمن my-test-bucket-768:
** لمطابقة عدة أسماء ملفات بشكل تعاودي:
s3://:
config.xml:
الكتابة المُقسَّمة إلى أجزاء
استراتيجية التقسيم
مدعومة فقط لاستعلامات INSERT.wildcard: يستبدل حرف البدل {_partition_id} في مسار الملف بمفتاح التقسيم الفعلي. ويُحدَّد افتراضيًا عندما يحتوي المسار على {_partition_id}.
عند عدم تعيين partition_strategy، لا يستخدم المسار الذي يحتوي على نمط glob آخر أي استراتيجية للتقسيم ويتجاهل PARTITION BY. ويستخدم المسار الذي لا يحتوي على glob استراتيجية hive عندما تكون قيمة file_like_engine_default_partition_strategy هي hive؛ وإلا فلا يستخدم أي استراتيجية للتقسيم.
hive يطبّق التقسيم بنمط Hive على عمليات القراءة والكتابة. ويُنشئ الملفات باستخدام التنسيق التالي: <prefix>/<key1=val1/key2=val2...>/<snowflakeid>.<toLower(file_format)>.
مثال على استراتيجية التقسيم hive
wildcard
- يؤدي استخدام معرّف القسم في المفتاح إلى إنشاء ملفات منفصلة:
file_x.csv وfile_y.csv وfile_z.csv.
- يؤدّي استخدام معرّف القسم ضمن اسم حاوية التخزين إلى إنشاء ملفات في حاويات تخزين مختلفة:
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 إلى الدالة. على سبيل المثال:
roleARN إلى الدالة s3 عبر المعلمة extra_credentials. على سبيل المثال:
external_id اختياريًا إلى جانب role_arn. ويُمرَّر كمعلمة ExternalId في استدعاء AWS STS AssumeRole، ويتيح لسياسة الثقة الخاصة بالدور أن تشترط سرًا مشتركًا، مما يحدّ من مشكلة النائب المرتبك. على سبيل المثال:
العمل مع الأرشيفات
لنفترض أن لدينا عدة ملفات أرشيف بعناوين URI التالية على S3:- ‘https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-10.csv.zip'
- ‘https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-11.csv.zip'
- ‘https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-12.csv.zip'
يدعم 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. على سبيل المثال:
تحليل عناوين URL النسبية
يتيح الإعداد s3_base تمرير عنوان URL نسبي إلى الدالةs3. عند تعيين s3_base وعدم احتواء وسيطة الدالة على مخطط، يُحل عنوان URL بالاستناد إلى عنوان URL الأساسي وفقًا لـ RFC 3986، باستخدام القواعد نفسها التي يستخدمها الإعداد url_base في الدالة url. وتُمرَّر عناوين URL المطلقة دون تغيير.
ينطبق هذا الإعداد أيضًا على محرك الجدول S3 ودوال الجدول التي تشترك في تهيئة s3 (s3Cluster وgcs وoss). بالنسبة إلى محرك الجدول S3، يُجسَّد عنوان URL المحلول ضمن تعريف الجدول المخزَّن، لذا لا يعتمد الجدول على قيمة s3_base بعد إنشائه.
مثال
إعدادات التخزين
- s3_truncate_on_insert - يتيح تفريغ الملف قبل الإدراج فيه. معطّل افتراضيًا.
- s3_create_new_file_on_insert - يتيح إنشاء ملف جديد عند كل عملية إدراج إذا كان للتنسيق لاحقة. معطّل افتراضيًا.
- s3_skip_empty_files - يتيح تخطي الملفات الفارغة أثناء القراءة. مفعّل افتراضيًا.
- s3_base - عنوان URL الأساسي لحل عناوين URL النسبية المُمرَّرة إلى الدالة
s3. فارغ (معطّل) افتراضيًا.
مخططات Avro المتداخلة
عند قراءة ملفات Avro التي تحتوي على سجلات متداخلة تختلف من ملف إلى آخر (على سبيل المثال، تحتوي بعض الملفات على حقل إضافي داخل كائن متداخل)، فقد يُرجع ClickHouse خطأً مثل:عدد الأوراق في السجل لا يطابق عدد العناصر في Tuple…يحدث ذلك لأن ClickHouse يتوقع أن تتطابق جميع بُنى السجلات المتداخلة مع المخطط نفسه. للتعامل مع هذه الحالة، يمكنك:
- استخدام
schema_inference_mode='union'لدمج مخططات السجلات المتداخلة المختلفة، أو - مواءمة البُنى المتداخلة يدويًا وتمكين
use_structure_from_insertion_table_in_table_functions=1.
ملاحظة حول الأداءقد يستغرق
schema_inference_mode='union' وقتًا أطول جدًا مع مجموعات بيانات S3 الكبيرة، لأنه يحتاج إلى فحص كل ملف لاستنتاج المخطط.