UDFs الدوال المعرّفة من قِبل المستخدم
- تبدأ Executable UDFs برنامجًا خارجيًا أو برنامجًا نصيًا (بايثون، Bash، إلخ)، وتُمرِّر إليه blocks من البيانات عبر STDIN / STDOUT. استخدمها لدمج التعليمات البرمجية أو الأدوات الحالية دون الحاجة إلى إعادة تجميع ClickHouse. وهي تفرض overhead أعلى لكل استدعاء مقارنةً بالخيارات التي تعمل داخل العملية، لذا فهي الأنسب للمنطق الأثقل أو عند الحاجة إلى runtime مختلف.
- تُعرَّف SQL UDFs باستخدام
CREATE FUNCTIONبالكامل ضمن SQL. وتُضمَّن/تُوسَّع داخل query plan (من دون حدٍّ فاصل على مستوى العملية)، مما يجعلها lightweight ومثالية لإعادة استخدام منطق expression أو تبسيط columns المحسوبة المعقدة. - تُشغِّل Experimental WebAssembly UDFs تعليمات برمجية مُجمَّعة إلى WebAssembly داخل sandbox ضمن server process. وهي توفّر overhead أقل لكل استدعاء مقارنةً بالبرامج التنفيذية الخارجية، مع عزل أفضل من الامتدادات native، مما يجعلها مناسبة للخوارزميات المخصّصة المكتوبة بلغات يمكنها الاستهداف إلى WASM (مثل C/C++/Rust).
الدوال المعرفة من قبل المستخدم القابلة للتنفيذ
هذه الميزة متاحة ضمن المعاينة الخاصة في ClickHouse Cloud.
يرجى التواصل مع ClickHouse Support عبر https://clickhouse.cloud/support لطلب الوصول.
user_defined_executable_functions_config.
يتضمن تكوين الدالة الإعدادات التالية:
| Parameter | الوصف | مطلوب | القيمة الافتراضية |
|---|---|---|---|
name | اسم دالة | نعم | - |
command | اسم البرنامج النصي المطلوب تنفيذه، أو الأمر إذا كانت execute_direct تساوي false | نعم | - |
argument | وصف الوسيطة مع type وname الاختياري الخاص بها. تُوصَف كل وسيطة في إعداد منفصل. ويكون تحديد الاسم ضروريًا إذا كانت أسماء الوسائط جزءًا من التسلسل لدالة معرّفة من قبل المستخدم بتنسيق مثل Native أو JSONEachRow | نعم | c + argument_number |
format | تنسيق تُمرَّر به الوسائط إلى الأمر. ومن المتوقع أيضًا أن يستخدم خرج الأمر التنسيق نفسه | نعم | - |
return_type | نوع القيمة المُعادة | نعم | - |
return_name | اسم القيمة المُعادة. ويكون تحديد اسم الإرجاع ضروريًا إذا كان اسم الإرجاع جزءًا من التسلسل لدالة معرّفة من قبل المستخدم بتنسيق مثل Native أو JSONEachRow | اختياري | result |
type | نوع التنفيذ. إذا ضُبطت type على executable، فسيُشغَّل أمر واحد. وإذا ضُبطت على executable_pool، فسيُنشأ مجمّع من الأوامر | نعم | - |
max_command_execution_time | الحد الأقصى لوقت التنفيذ بالثواني لمعالجة كتلة من البيانات. يكون هذا الإعداد صالحًا فقط لأوامر executable_pool | اختياري | 10 |
command_termination_timeout | المدة بالثواني التي يجب أن ينهي خلالها الأمر عمله بعد إغلاق الأنبوب الخاص به. بعد ذلك، تُرسَل الإشارة SIGTERM إلى العملية التي تنفذ الأمر | اختياري | 10 |
command_read_timeout | مهلة قراءة البيانات من stdout الخاص بالأمر، بالمللي ثانية | اختياري | 10000 |
command_write_timeout | مهلة كتابة البيانات إلى stdin الخاص بالأمر، بالمللي ثانية | اختياري | 10000 |
pool_size | حجم مجمّع الأوامر | اختياري | 16 |
send_chunk_header | يتحكم في ما إذا كان سيتم إرسال عدد الصفوف قبل إرسال دفعة من البيانات إلى العملية | اختياري | false |
execute_direct | إذا كانت execute_direct = 1، فسيُبحث عن command داخل مجلد user_scripts المحدد بواسطة user_scripts_path. ويمكن تحديد وسائط إضافية للبرنامج النصي باستخدام فاصل من المسافات البيضاء. مثال: script_name arg1 arg2. وإذا كانت execute_direct = 0، فسيُمرَّر command كوسيطة إلى bin/sh -c | اختياري | 1 |
lifetime | فترة إعادة تحميل الدالة بالثواني. إذا ضُبطت على 0 فلن تُعاد تحميل الدالة | اختياري | 0 |
deterministic | ما إذا كانت الدالة حتمية (تعيد النتيجة نفسها للإدخال نفسه) | اختياري | false |
stderr_reaction | كيفية التعامل مع خرج stderr الخاص بالأمر. القيم: none (تجاهل)، log (تسجيل كل خرج stderr فورًا)، log_first (تسجيل أول 4 KiB بعد الخروج)، log_last (تسجيل آخر 4 KiB بعد الخروج)، throw (طرح استثناء فورًا عند أي خرج من stderr). عند استخدام log_first أو log_last مع رمز خروج غير صفري، يُضمَّن محتوى stderr في رسالة الاستثناء | اختياري | log_last |
check_exit_code | إذا كانت القيمة true، فسيتحقق ClickHouse من رمز خروج الأمر. ويتسبب رمز الخروج غير الصفري في حدوث استثناء | اختياري | true |
STDIN وأن يكتب النتيجة إلى STDOUT. ويجب أن يعالج الأمر الوسائط على نحو تكراري. أي إنه بعد معالجة دفعة من الوسائط، يجب أن ينتظر الدفعة التالية.
الدوال المعرّفة من قبل المستخدم القابلة للتنفيذ
أمثلة
UDF من برنامج نصي مضمن
test_function_sum يدويًا مع ضبط execute_direct على القيمة 0 باستخدام إعدادات XML أو YAML.
- XML
- YAML
الملف
test_function.xml (/etc/clickhouse-server/test_function.xml مع إعدادات المسار الافتراضية)./etc/clickhouse-server/test_function.xml
Query
Result
UDF من برنامج نصي بايثون
STDIN ويُرجعها كسلسلة نصية.
أنشئ test_function باستخدام تهيئة XML أو YAML.
- XML
- YAML
الملف
test_function.xml (/etc/clickhouse-server/test_function.xml مع إعدادات المسار الافتراضية)./etc/clickhouse-server/test_function.xml
أنشئ ملف البرنامج النصي
test_function.py داخل مجلد user_scripts (/var/lib/clickhouse/user_scripts/test_function.py مع إعدادات المسار الافتراضية).
Query
Result
اقرأ قيمتين من STDIN وأعِد مجموعهما على شكل كائن JSON
test_function_sum_json باستخدام وسيطات مُسمّاة وتنسيق JSONEachRow، وذلك باستخدام تهيئة XML أو YAML.
- XML
- YAML
الملف
test_function.xml (/etc/clickhouse-server/test_function.xml مع إعدادات المسار الافتراضية)./etc/clickhouse-server/test_function.xml
أنشئ ملف البرنامج النصي
test_function_sum_json.py داخل المجلد user_scripts (/var/lib/clickhouse/user_scripts/test_function_sum_json.py مع إعدادات المسار الافتراضية).
Query
Result
استخدام المعلمات في إعداد command
command (يعمل هذا فقط مع الدوال المعرّفة من قبل المستخدم من النوع executable).
ويتطلب ذلك أيضًا الخيار execute_direct لضمان عدم وجود ثغرة ناتجة عن توسيع وسيطات الصدفة.
- XML
- YAML
ملف
test_function_parameter_python.xml (/etc/clickhouse-server/test_function_parameter_python.xml مع إعدادات المسار الافتراضية)./etc/clickhouse-server/test_function_parameter_python.xml
أنشئ ملف البرنامج النصي
test_function_parameter_python.py داخل المجلد user_scripts (/var/lib/clickhouse/user_scripts/test_function_parameter_python.py مع إعدادات المسار الافتراضية).
Query
Result
UDF من برنامج نصي shell
- XML
- YAML
ملف
test_function_shell.xml (/etc/clickhouse-server/test_function_shell.xml باستخدام إعدادات المسار الافتراضية)./etc/clickhouse-server/test_function_shell.xml
أنشئ ملف البرنامج النصي
test_shell.sh داخل المجلد user_scripts (/var/lib/clickhouse/user_scripts/test_shell.sh باستخدام إعدادات المسار الافتراضية).
/var/lib/clickhouse/user_scripts/test_shell.sh
Query
Result
معالجة الأخطاء
تقييم تعبيرات الوسائط
&& و || و ?:.
في ClickHouse، تُقيَّم وسائط الدوال (المعاملات) دائمًا.
ويرجع ذلك إلى أن أجزاءً كاملة من الأعمدة تُقيَّم دفعةً واحدة، بدلًا من حساب كل صف على حدة.
تنفيذ الدوال في معالجة الاستعلامات الموزعة
SELECT f(sum(g(x))) FROM distributed_table GROUP BY h(y),
- إذا كان
distributed_tableيحتوي على shardين على الأقل، فستُنفَّذ الدالتان ‘g’ و ‘h’ على الخوادم البعيدة، بينما تُنفَّذ الدالة ‘f’ على الخادم الطالب. - إذا كان
distributed_tableيحتوي على shard واحد فقط، فستُنفَّذ جميع الدوال ‘f’ و ‘g’ و ‘h’ على خادم هذا الـ shard.
hostName، التي تُرجع اسم الخادم الذي تعمل عليه، بحيث يمكن تنفيذ GROUP BY حسب الخوادم في استعلام SELECT.
إذا كانت دالة في استعلام ما تُنفَّذ على الخادم الطالب، لكنك تحتاج إلى تنفيذها على الخوادم البعيدة، فيمكنك تغليفها داخل الدالة التجميعية ‘any’ أو إضافتها إلى مفتاح في GROUP BY.