تنشئ دالة الجدول executable جدولًا استنادًا إلى مخرجات دالة معرّفة من قبل المستخدم (UDF) تُعرّفها في برنامج نصي يُخرج صفوفًا إلى stdout. يُخزَّن البرنامج النصي القابل للتنفيذ في الدليل users_scripts، ويمكنه قراءة البيانات من أي مصدر. تأكد من أن خادم ClickHouse لديك يحتوي على جميع الحزم المطلوبة لتشغيل البرنامج النصي القابل للتنفيذ. على سبيل المثال، إذا كان برنامجًا نصيًا بلغة بايثون، فتأكد من أن الخادم يحتوي على حزم بايثون اللازمة المثبّتة.
يمكنك اختياريًا تضمين استعلام إدخال واحد أو أكثر، بحيث تُمرَّر نتائجها إلى stdin ليقرأها البرنامج النصي.
Syntax
تتطلب دالة الجدول executable ثلاث معلمات، وتقبل قائمة اختيارية من استعلامات الإدخال:
executable(script_name, format, structure, [input_query...] [,SETTINGS ...])script_name: اسم ملف البرنامج النصي. يُحفَظ في مجلدuser_scripts(المجلد الافتراضي للإعدادuser_scripts_path)format: تنسيق الجدول الناتجstructure: مخطّط الجدول الناتجinput_query: استعلام اختياري (أو مجموعة أو عدة استعلامات) تُمرَّر نتائجه إلى البرنامج النصي عبر stdin
يحمل برنامج بايثون النصي التالي اسم generate_random.py ويُحفَظ في مجلد user_scripts. يقرأ العدد i ويطبع i سلاسل عشوائية، تسبق كلَّ سلسلةٍ منها قيمةٌ عددية يفصل بينها وبين السلسلة محرف جدولة:
#!/usr/local/bin/python3.9
import sys
import string
import random
def main():
# Read input value
for number in sys.stdin:
i = int(number)
# Generate some random rows
for id in range(0, i):
letters = string.ascii_letters
random_string = ''.join(random.choices(letters ,k=10))
print(str(id) + '\t' + random_string + '\n', end='')
# Flush results to stdout
sys.stdout.flush()
if __name__ == "__main__":
main()لنشغّل البرنامج النصي وندعه يُنشئ 10 سلاسل نصية عشوائية:
SELECT * FROM executable('generate_random.py', TabSeparated, 'id UInt32, random String', (SELECT 10))تكون الاستجابة على النحو التالي:
┌─id─┬─random─────┐
│ 0 │ xheXXCiSkH │
│ 1 │ AqxvHAoTrl │
│ 2 │ JYvPCEbIkY │
│ 3 │ sWgnqJwGRm │
│ 4 │ fTZGrjcLon │
│ 5 │ ZQINGktPnd │
│ 6 │ YFSvGGoezb │
│ 7 │ QyMJJZOOia │
│ 8 │ NfiyDDhmcI │
│ 9 │ REJRdJpWrg │
└────┴────────────┘الإعدادات
send_chunk_header- يتحكم في ما إذا كان سيتم إرسال عدد الصفوف قبل إرسال جزء من البيانات إلى المعالجة. القيمة الافتراضية هيfalse.pool_size— حجم المجمّع. إذا تم تحديد 0 كقيمة لـpool_size، فلن تكون هناك أي قيود على حجم المجمّع. القيمة الافتراضية هي16.max_command_execution_time— الحد الأقصى لوقت تنفيذ أمر البرنامج النصي القابل للتنفيذ لمعالجة كتلة من البيانات. يُحدد بالثواني. القيمة الافتراضية هي 10.command_termination_timeout— يجب أن يحتوي البرنامج النصي القابل للتنفيذ على حلقة القراءة والكتابة الرئيسية. بعد إنهاء دالة الجدول، يُغلق الأنبوب، ويُمنح الملف التنفيذيcommand_termination_timeoutثانيةً للتوقف قبل أن يرسل ClickHouse إشارة SIGTERM إلى العملية الفرعية. يُحدد بالثواني. القيمة الافتراضية هي 10.command_read_timeout- مهلة قراءة البيانات من stdout الخاص بالأمر، بالمللي ثانية. القيمة الافتراضية هي 10000.command_write_timeout- مهلة كتابة البيانات إلى stdin الخاص بالأمر، بالمللي ثانية. القيمة الافتراضية هي 10000.
تمرير نتائج الاستعلام إلى برنامج نصي
احرص على مراجعة المثال في محرك الجدول Executable حول كيفية تمرير نتائج الاستعلام إلى برنامج نصي. وفيما يلي كيفية تنفيذ البرنامج النصي نفسه الوارد في ذلك المثال باستخدام دالة الجدول executable:
SELECT * FROM executable(
'sentiment.py',
TabSeparated,
'id UInt64, sentiment Float32',
(SELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20)
);