SET dialect = 'clickhouse' التبديل إلى ClickHouse. تُعد SET عبارة SQL الوحيدة التي يُتعرّف عليها أثناء
تفعيل لهجة KQL، لذا يمكن للجلسة دائمًا الخروج من هذا الوضع.
العناصر المدعومة
هذه مجموعة فرعية محدودة عمدًا. يُترجَم أي تركيب في KQL وفق الدلالات التي يوثّقها Kusto، أو يُرفَض بالاسم مع ظهور خطأ تحليل — ولا تُجرى أي تقريبـات بصمت. إذا أمكن تحليل استعلام، فيُفترض أن تطابق نتيجته نتيجة Kusto’s. المصادر: اسم جدول، وprint، وdatatable، وrange، وخط أنابيب بين قوسين، وunion.
يمتد range من رقم بزيادة رقم، أو من قيمة datetime بزيادة timespan، أو من قيمة timespan بزيادة
timespan.
العوامل: where / filter، وextend، وproject، وproject-away، وproject-keep،
وproject-rename، وsummarize، وsort by / order by، وtake / limit، وtop، وdistinct،
وcount، وmv-expand، وjoin، وunion، وas، وrender.
العوامل القياسية: ==، و!=، و<، و<=، و>، و>=، و=~، و!~، وin، وin~، وbetween،
وcontains، وstartswith، وendswith، وhas، وhasprefix، وhassuffix، وصيغها ذات اللاحقة _cs
(الحساسة لحالة الأحرف) و! (المنفية)، وhas_any، وhas_all، وmatches regex.
يقبل in و!in أيضًا تعبيرًا جدوليًا يوفّر عموده الأول القيم
(x in (T | project key))، بينما يقبل in~ قائمة فقط. ويُفسَّر الاسم المنفرد داخل in (...) الذي لا
يرتبط بأي let على أنه عمود، لأن المحلّل لا يملك مخططًا يميّز العمود من الجدول؛
اربط الجدول باستخدام let، أو حدده (db.table)، أو أضف خط أنابيب للحصول على الصيغة الجدولية.
العبارات: let، لربط قيمة قياسية، أو تعبير جدولي كامل، أو دالة:
T: (*) أو T: (col: type, ...) يجب أن ترد أولًا. لا يتيح المعامل الجدولي الذي
يُسمّي أعمدته للنص سوى أعمدة الوسيط تلك، لذلك يُرفض نص يقرأ
عمودًا غير مُعلن، حتى لو كان الوسيط الفعلي يحتويه؛ أما T: (*)
فيمرر الوسيط كما هو. تُفرض الأنواع المعلنة عند حد الاستدعاء:
يُرفض وسيط (أو عمود مُعلن لوسيط جدولي) لا يندرج نوعه ضمن
نوع KQL المعلن، ويُطبّق تحويل بلا فقدان، مثل تحويل long إلى real، وتُعد
القيمة التي لا تلائم النوع المعلن — كتجاوز سعة int مثلًا — خطأً بدلًا
من اقتطاعها بصمت. يمكن تمرير الوسائط حسب
الاسم وبأي ترتيب (f(c = 7, a = 12)). يتكون النص من أي عدد من عبارات let تتبعها
عبارة واحدة، ويمكنه الوصول إلى الارتباطات المحيطة به. الدالة التي يكون نصها
خط أنابيب تكون جدولًا لا قيمة، لذا تُرفض حيث يُتوقع تعبير -
في extend أو where أو print. يمكن استدعاء الدالة بلا معاملات
بأقواس أو بدونها. يُقبل view ()، وبما أنه لا يوجد هنا ما يحل
أحرف البدل في union *، فإنه يحمل المعنى نفسه لـ (). يُرفض الاستدعاء الذاتي، كما في Kusto.
يرتبط let بالعبارة التي تليه فقط، لأن عبارة KQL واحدة تقابل
استعلام ClickHouse واحدًا — وهذا أيضًا ما يمنع تسرّب الارتباط إلى استعلام متزامن. يجب ربط الاسم الذي تحتاجه عبارتان مرتين.
القيم الحرفية: السلاسل النصية (بما فيها الصيغة الحرفية @'...')، والأرقام، وdatetime(...)، وguid(...)،
والفترات الزمنية مثل 1d / 2.5h / 500ms، ومصفوفات dynamic([...]).
تُترجم نحو 130 دالة قياسية وتجميعية. وكما في Kusto، لا يجوز استدعاء الدوال التجميعية
إلا في قائمة التجميع ضمن summarize؛ إذ يُرفض print count() بدلًا من تمريره إلى
دالة ClickHouse التجميعية التي تحمل الاسم نفسه.
يمكن الوصول إلى دوال ClickHouse أيضًا. يُمرر الاسم الذي لا يعرفه سجل KQL
إلى ClickHouse بالتهجئة التي كتبتها، لذا يمكن للاستعلام استخدام أي دالة يتيحها الخادم:
range أوضح مثال —
فـrange(1, 3, 1) تساوي [1, 2, 3] في Kusto و[1, 2] في
ClickHouse، لذا فإن استخدامها في KQL يُعد خطأً بدلًا من أن ينتج إجابة خاطئة.
مدى التغطية مقارنةً بمرجع Kusto
بالقياس إلى فهارس Microsoft الخاصة (العوامل الجدولية، الدوال القياسية، دوال التجميع):
تشمل العوامل المدعومة تلك التي يشرحها دليل Microsoft العملي Learn common operators،
إضافةً إلى
datatable وrange وprint وunion وjoin، وهي كافية لبنية الاستعلامات التي
يتدرج في بنائها ذلك الدليل ومرجع KQL السريع.
ما لا تدعمه الأداة
تُرفض هذه العناصر بخطأ تحليل بدلًا من ترجمتها ترجمة غير صحيحة:- العوامل:
searchوparseوmv-applyوlookupوevaluateوinvokeوfacet، وtop-nestedوmake-seriesوsampleوserializeوpartitionوrangeعند استخدامها كعامل. - الدوال: عائلة
series_*، وbag_*/pack_*، وparse_urlوparse_csv، وparse_jsonوtodynamicوtoscalarوformat_timespanوformat_datetimeوextract_all، وrange، وعائلةpercentiles*ودوال النافذةrow_*. (يُرفضformat_datetimeوextract_allبدلًا من تقريب سلوكهما: إذ إن محددات التنسيقyyyy-MM-ddفي Kusto تختلف عن تلك في ClickHouse، كما أنextract_allفي Kusto يعيد مصفوفة لكل مجموعة التقاط.) - أسماء Kusto التي تتعارض مع دالة في ClickHouse ذات معنى مختلف:
range(المذكورة أعلاه)، وrepeatوreplaceوtranslateوmaterialize. فتمريرها سيؤدي بصمت إلى حساب شيء مختلف — إذ إنrepeat(1, 3)في Kusto هي المصفوفة[1, 1, 1]، بينما تكررrepeatفي ClickHouse سلسلة نصية — لذا يُرفض كل منها بالاسم. - الدوال الجغرافية المكانية التي تأخذ GeoJSON أو تعيده — كل
geo_*_to_central_point، وكل ما يعمل على المضلعات والخطوط. دوال النقاط وgeohash وH3 التي تعمل باستخدام خط الطول/خط العرض العاديين مدعومة. أماgeo_point_to_s2cellفغير مدعومة: لا يوفّر ClickHouse صيغة رموز S2. - كائنات
dynamic(dynamic({"a": 1}))، والوصول إلى الأعضاء (x.y) والبحث بالمفتاح (x['k']). لا تُعيّن سوى مصفوفاتdynamicإلىArrayفي ClickHouse. كما أنdynamicباعتباره نوعًا مُعلنًا — في مخططdatatableأوtypeof(...)أو وسيطة دالة — يُرفض أيضًا: إذ لا يحمل التعليق التوضيحي نوع العنصر، ولذلك لا يوجد ما يمكن تعيينه إليه بدقة. - المراجع عبر المجموعات وعبر قواعد البيانات، مثل
cluster(...)وdatabase(...). - تلميحات الاستعلام و
join(hint.strategyوhint.shufflekeyو…). - خيارات العامل:
mv-expand ... to typeof(T)/limit N/bagexpansion، وتلميحاتsummarize، وunion kind=/withsource=/isfuzzy=، وjoin hint.*. - أنماط الأعمدة ذات المحارف البديلة في
project-awayوproject-keep(project-away Tmp*): يتطلب توسيعها معرفة المخطط، وهو غير مرئي أثناء التحليل. اذكر الأعمدة صراحةً. - آلية المكونات الإضافية
evaluateبالكامل، ومعهاbag_unpackوpivotوnarrowوpythonوRوغيرها. - عبارات التطبيق:
alias databaseوdeclare pattern، وdeclare query_parametersوrestrict access to. - القيم الحرفية للسلاسل النصية المموهة (
h"...") والقيم الحرفية متعددة الأسطر (ثلاث علامات اقتباس عكسية).
سلوكيات ينبغي معرفتها
- الفترات الزمنية هي قيم
Interval. يتحول1dإلىtoIntervalNanosecond(86400000000000). اضبطinterval_output_format = 'kusto'لعرضها بتنسيق Kusto (1.00:00:00) بدلًا من رقم. - تتبع القسمة سلوك Kusto: تكون نتيجة
7 / 2هي3لأن كلا المعاملين عددان صحيحان، بينما تكون قسمة فترة زمنية على أخرى هي النسبة ذات القيمة الحقيقية بينهما (15ms / 10msتساوي1.5). ينفّذkqlDivideذلك بالاستناد إلى أنواع الوسيطات. - يؤدي طرح قيمتي تاريخ ووقت إلى عدد من الثواني، بينما ينتج عنه في Kusto فترة زمنية. وتعمل إضافة فترة زمنية أو طرحها كما هو متوقع.
- يكون
sortتنازليًا افتراضيًا، بخلاف SQL، ويضع قيم null في الطرف الأصغر. - ينقل
project-renameالعمود المعاد تسميته إلى نهاية الصف. يحتفظ Kusto بموضعه الأصلي؛ وستتطلب محاكاة ذلك معرفة المخطط أثناء التحليل. - يتطلب
unionأن تكون للمُعاملات مخططات متوافقة. يوسّع Kusto النتيجة لتشمل اتحاد جميع الأعمدة ويملأ القيم المفقودة بـ null؛ أماUNION ALLفي ClickHouse فلا يفعل ذلك. - عوامل السلاسل النصية هي دوال مطابقة وليست أنماط
LIKE. يبحثcontains '50%'عن علامة نسبة مئوية حرفية. - تأخذ
geo_*خط الطول قبل خط العرض، كما يفعل Kusto. تستخدمgeo_distance_2pointsدالةgreatCircleDistanceفي ClickHouse، وهي تقريب سريع يختلف عن Kusto عند الرقم المعنوي الرابع — بنحو 600 م على مسافة 1500 كم — ويؤديuse_spheroid = trueإلى اختيارgeoDistance، وهي صيغة الإهليلج، كما في Kusto. لا يُقصد تحقيق تطابق تام: إذ تُستخدم هذه الدوال عادةً للتصفية لا لإعداد التقارير. لاحظ أن إحداثيًا خارج [-180, 180] أو [-90, 90] ينتج رقمًا بلا معنى بدلًا من قيمة null التي يعيدها Kusto: لا تتحقق أي من دالتي ClickHouse من نطاق وسيطاتها، وسيكلّف التحقق ثماني مقارنات لكل صف. - تعيد
dayofweek()فترة زمنية، لا رقمًا: يوم الاثنين هو1.00:00:00. - تعرض
tohex()قيمة سالبة بعرض 64 بت. يعرضها Kusto بعرض نوع الوسيط نفسه، وهو ما لا يظهر أثناء التحليل. - قيم التاريخ والوقت هي قيم
DateTime64حقيقية، لذا تُطبع بتنسيق ClickHouse (2017-01-01 00:00:00) بدلًا من تنسيق Kusto (2017-01-01T00:00:00.0000000). كان التنفيذ السابق ينتج سلسلة نصية منسقة تبدو مثل Kusto، لكنها لا تُقارن أو تُفرز كقيمة تاريخ ووقت. - دوال التجميع ذات المعلمات في ClickHouse (
quantileExact(0.5)(x)) ليس لها صياغة في KQL. استخدم بديلًا مُسمّى مثلmedianExact(x).