s3 table function مع INSERT INTO...SELECT، تُقرأ البيانات وتُدرج بأسلوب تدفقي. ولا يبقى في الذاكرة إلا عدد قليل من كتل البيانات، بينما تُقرأ الكتل باستمرار من S3 وتُرسَل إلى الجدول الوجهة.
الصيغة
s3 المعلمات البسيطة التالية:
| Parameter | Description |
|---|---|
url | URL حاوية التخزين مع المسار إلى الملف. يدعم أحرف البدل التالية في وضع readonly: * و** و? و{abc,def} و{N..M}، حيث إن N وM رقمان، و'abc' و'def' سلسلتان نصيتان. لمزيد من المعلومات، راجع هنا. |
NOSIGN | إذا جرى تمرير هذه الكلمة المفتاحية بدلًا من بيانات الاعتماد، فلن تُوقَّع أي من الطلبات. |
access_key_id and secret_access_key | مفاتيح تحدد بيانات الاعتماد المطلوب استخدامها مع نقطة النهاية المحددة. اختيارية. |
session_token | رمز جلسة لاستخدامه مع المفاتيح المحددة. وهو اختياري عند تمرير المفاتيح. |
format | التنسيق الخاص بالملف. |
structure | بنية الجدول. بالتنسيق 'column1_name column1_type, column2_name column2_type, ...'. |
compression_method | هذه المعلمة اختيارية. القيم المدعومة: none وgzip أو gz وbrotli أو br وxz أو LZMA وzstd أو zst. افتراضيًا، سيُكتشَف أسلوب الضغط تلقائيًا من امتداد الملف. |
headers | هذه المعلمة اختيارية. تتيح تمرير الترويسات في طلب S3. مرّرها بالتنسيق headers(key=value)، مثل headers('x-amz-request-payer' = 'requester'). |
partition_strategy | هذه المعلمة اختيارية. القيم المدعومة: wildcard أو hive. تتطلب wildcard وجود {_partition_id} في المسار، ويُستبدل بمفتاح التقسيم. أما hive فلا تسمح بأحرف البدل، وتفترض أن المسار هو جذر الجدول، وتُنشئ أدلة partition بنمط Hive مع Snowflake IDs كأسماء ملفات وتنسيق الملف كامتداد. القيمة الافتراضية هي الإعداد file_like_engine_default_partition_strategy (wildcard ضمن إعدادات compatibility الأقدم من 26.6، وhive بخلاف ذلك). |
partition_columns_in_data_file | هذه المعلمة اختيارية. تُستخدم فقط مع استراتيجية التقسيم من نوع hive. وتُخبر ClickHouse ما إذا كان ينبغي توقّع كتابة أعمدة partition داخل ملف البيانات. والقيمة الافتراضية هي false. |
extra_credentials | هذه المعلمة اختيارية. تُستخدم لتمرير role_arn من أجل role-based access في ClickHouse Cloud. راجع Secure S3 للاطلاع على خطوات الإعداد. |
storage_class_name | هذه المعلمة اختيارية. القيم المدعومة: STANDARD أو INTELLIGENT_TIERING. وتتيح تحديد AWS S3 Intelligent Tiering. والقيمة الافتراضية هي STANDARD. |
GCSيكون URL الخاص بـ GCS بهذا التنسيق لأن نقطة النهاية الخاصة بـ Google XML API تختلف عن JSON API:وليس https://storage.cloud.google.com.
url وaccess_key_id وsecret_access_key وformat وstructure وcompression_method بالطريقة نفسها، كما تتوفر بعض المعلمات الإضافية المدعومة:
| الوسيطة | الوصف |
|---|---|
filename | يُلحَق بـ URL إذا جرى تحديده. |
use_environment_credentials | مُفعَّل افتراضيًا، ويتيح تمرير معلمات إضافية باستخدام متغيرات البيئة AWS_CONTAINER_CREDENTIALS_RELATIVE_URI, AWS_CONTAINER_CREDENTIALS_FULL_URI, AWS_CONTAINER_AUTHORIZATION_TOKEN, AWS_EC2_METADATA_DISABLED. |
no_sign_request | مُعطَّل افتراضيًا. |
expiration_window_seconds | القيمة الافتراضية هي 120. |
القيمة المعادة
أمثلة
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' في مثل هذه الحالات:الاستخدام
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_1.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_2.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_3.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_4.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_1.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_2.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_3.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_4.csv'
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 بشكل تعاودي:
'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:
الكتابة المُقسَّمة إلى أجزاء
استراتيجية التقسيم
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
- يؤدي استخدام معرّف القسم في المفتاح إلى إنشاء ملفات منفصلة:
file_x.csv وfile_y.csv وfile_z.csv.
- يؤدّي استخدام معرّف القسم ضمن اسم حاوية التخزين إلى إنشاء ملفات في حاويات تخزين مختلفة:
my_bucket_1/file.csv وmy_bucket_10/file.csv وmy_bucket_20/file.csv.
الوصول إلى حاويات التخزين العامة
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، ويتيح لسياسة الثقة الخاصة بالدور أن تشترط سرًا مشتركًا، مما يحدّ من مشكلة النائب المرتبك. على سبيل المثال:
العمل مع الأرشيفات
- ‘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
partition_strategy.
عند ضبط use_hive_partitioning على القيمة 1، سيكتشف ClickHouse التقسيم بنمط Hive في المسار (/name=value/) وسيتيح استخدام أعمدة التقسيم بوصفها أعمدة افتراضية في الاستعلام. وستحمل هذه الأعمدة الافتراضية الأسماء نفسها الموجودة في المسار المُقسَّم.
مثال
الوصول إلى حاويات التخزين 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 المتداخلة
عدد الأوراق في السجل لا يطابق عدد العناصر في Tuple…يحدث ذلك لأن ClickHouse يتوقع أن تتطابق جميع بُنى السجلات المتداخلة مع المخطط نفسه. للتعامل مع هذه الحالة، يمكنك:
- استخدام
schema_inference_mode='union'لدمج مخططات السجلات المتداخلة المختلفة، أو - مواءمة البُنى المتداخلة يدويًا وتمكين
use_structure_from_insertion_table_in_table_functions=1.
ملاحظة حول الأداءقد يستغرق
schema_inference_mode='union' وقتًا أطول جدًا مع مجموعات بيانات S3 الكبيرة، لأنه يحتاج إلى فحص كل ملف لاستنتاج المخطط.