يمكن إجراء تحليل السلاسل الزمنية في ClickHouse باستخدام دوال SQL القياسية للتجميع ودوال النوافذ. وعند العمل مع بيانات السلاسل الزمنية، ستصادف عادةً ثلاثة أنواع رئيسية من المقاييس:
- مقاييس Counter التي تزداد باستمرار بمرور الوقت (مثل مشاهدات الصفحات أو إجمالي الأحداث)
- مقاييس Gauge التي تمثل قياسات لحظية يمكن أن ترتفع أو تنخفض (مثل استخدام CPU أو درجة الحرارة)
- المُدرَّجات التكرارية التي تجمع المشاهدات ضمن سلال وتحصي عددها (مثل مدد الطلبات أو أحجام الاستجابة)
وتشمل أنماط التحليل الشائعة لهذه المقاييس مقارنة القيم بين الفترات، وحساب الإجماليات التراكمية، وتحديد معدلات التغير، وتحليل التوزيعات.
ويمكن تحقيق كل ذلك من خلال الجمع بين دوال التجميع، ودوال النوافذ مثل sum() OVER، ودوال متخصصة مثل histogram().
التغيّرات بين الفترات
عند تحليل بيانات السلاسل الزمنية، نحتاج كثيرًا إلى فهم كيف تتغيّر القيم من فترة زمنية إلى أخرى.
وهذا أمر أساسي لكلٍّ من مقاييس Gauge ومقاييس Counter.
وتتيح لنا دالة النافذة lagInFrame الوصول إلى قيمة الفترة السابقة لحساب هذه التغيّرات.
يوضح الاستعلام التالي ذلك من خلال حساب التغيّرات اليومية في مشاهدات صفحة Wikipedia الخاصة بـ "Weird Al" Yankovic. ويبيّن عمود الاتجاه ما إذا كانت الزيارات قد ارتفعت (قيم موجبة) أو انخفضت (قيم سالبة) مقارنةً باليوم السابق، مما يساعد على رصد الارتفاعات أو الانخفاضات غير المعتادة في النشاط.
SELECT
toDate(time) AS day,
sum(hits) AS h,
lagInFrame(h) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS p,
h - p AS trend
FROM wikistat
WHERE path = '"Weird_Al"_Yankovic'
GROUP BY ALL
LIMIT 10;┌────────day─┬────h─┬────p─┬─trend─┐
│ 2015-05-01 │ 3934 │ 0 │ 3934 │
│ 2015-05-02 │ 3411 │ 3934 │ -523 │
│ 2015-05-03 │ 3195 │ 3411 │ -216 │
│ 2015-05-04 │ 3076 │ 3195 │ -119 │
│ 2015-05-05 │ 3450 │ 3076 │ 374 │
│ 2015-05-06 │ 3053 │ 3450 │ -397 │
│ 2015-05-07 │ 2890 │ 3053 │ -163 │
│ 2015-05-08 │ 3898 │ 2890 │ 1008 │
│ 2015-05-09 │ 3092 │ 3898 │ -806 │
│ 2015-05-10 │ 3508 │ 3092 │ 416 │
└────────────┴──────┴──────┴───────┘القيم التراكمية
تتراكم مقاييس Counter بطبيعتها بمرور الوقت. ولتحليل هذا النمو التراكمي، يمكننا حساب المجاميع التراكمية باستخدام دوال النافذة.
يوضح query التالي ذلك باستخدام عبارة sum() OVER، التي تُنشئ مجموعًا تراكميًا. وتوفّر الدالة bar() تمثيلًا مرئيًا لهذا النمو.
SELECT
toDate(time) AS day,
sum(hits) AS h,
sum(h) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING) AS c,
bar(c, 0, 50000, 25) AS b
FROM wikistat
WHERE path = '"Weird_Al"_Yankovic'
GROUP BY ALL
ORDER BY day
LIMIT 10;┌────────day─┬────h─┬─────c─┬─b─────────────────┐
│ 2015-05-01 │ 3934 │ 3934 │ █▉ │
│ 2015-05-02 │ 3411 │ 7345 │ ███▋ │
│ 2015-05-03 │ 3195 │ 10540 │ █████▎ │
│ 2015-05-04 │ 3076 │ 13616 │ ██████▊ │
│ 2015-05-05 │ 3450 │ 17066 │ ████████▌ │
│ 2015-05-06 │ 3053 │ 20119 │ ██████████ │
│ 2015-05-07 │ 2890 │ 23009 │ ███████████▌ │
│ 2015-05-08 │ 3898 │ 26907 │ █████████████▍ │
│ 2015-05-09 │ 3092 │ 29999 │ ██████████████▉ │
│ 2015-05-10 │ 3508 │ 33507 │ ████████████████▊ │
└────────────┴──────┴───────┴───────────────────┘حساب المعدلات
عند تحليل بيانات السلاسل الزمنية، غالبًا ما يكون من المفيد فهم معدل الأحداث لكل وحدة زمنية. يحسب هذا الاستعلام معدل مشاهدات الصفحات في الثانية بقسمة الإجمالي لكل ساعة على عدد الثواني في الساعة (3600). يساعد المخطط الشريطي في تحديد ساعات ذروة النشاط.
SELECT
toStartOfHour(time) AS time,
sum(hits) AS hits,
round(hits / (60 * 60), 2) AS rate,
bar(rate * 10, 0, max(rate * 10) OVER (), 25) AS b
FROM wikistat
WHERE path = '"Weird_Al"_Yankovic'
GROUP BY time
LIMIT 10;┌────────────────time─┬───h─┬─rate─┬─b─────┐
│ 2015-07-01 01:00:00 │ 143 │ 0.04 │ █▊ │
│ 2015-07-01 02:00:00 │ 170 │ 0.05 │ ██▏ │
│ 2015-07-01 03:00:00 │ 148 │ 0.04 │ █▊ │
│ 2015-07-01 04:00:00 │ 190 │ 0.05 │ ██▏ │
│ 2015-07-01 05:00:00 │ 253 │ 0.07 │ ███▏ │
│ 2015-07-01 06:00:00 │ 233 │ 0.06 │ ██▋ │
│ 2015-07-01 07:00:00 │ 359 │ 0.1 │ ████▍ │
│ 2015-07-01 08:00:00 │ 190 │ 0.05 │ ██▏ │
│ 2015-07-01 09:00:00 │ 121 │ 0.03 │ █▎ │
│ 2015-07-01 10:00:00 │ 70 │ 0.02 │ ▉ │
└─────────────────────┴─────┴──────┴───────┘المدرجات التكرارية
من حالات الاستخدام الشائعة لبيانات السلاسل الزمنية إنشاء مدرجات تكرارية استنادًا إلى الأحداث المتتبعة.
لنفترض أننا نريد فهم توزيع الصفحات بحسب إجمالي hits لها، مع الاقتصار على الصفحات التي يزيد إجمالي hits فيها على 10,000.
يمكننا استخدام الدالة histogram() لإنشاء مُدرَّج تكراري تكيّفي تلقائيًا استنادًا إلى عدد الفئات:
SELECT
histogram(10)(hits) AS hist
FROM
(
SELECT
path,
sum(hits) AS hits
FROM wikistat
WHERE date(time) = '2015-06-15'
GROUP BY path
HAVING hits > 10000
)
FORMAT Vertical;Row 1:
──────
hist: [(10033,23224.55065359477,60.625),(23224.55065359477,37855.38888888889,15.625),(37855.38888888889,52913.5,3.5),(52913.5,69438,1.25),(69438,83102.16666666666,1.25),(83102.16666666666,94267.66666666666,2.5),(94267.66666666666,116778,1.25),(116778,186175.75,1.125),(186175.75,946963.25,1.75),(946963.25,1655250,1.125)]يمكننا بعد ذلك استخدام arrayJoin() لمعالجة البيانات وbar() لعرضها بصريًا:
WITH histogram(10)(hits) AS hist
SELECT
round(arrayJoin(hist).1) AS lowerBound,
round(arrayJoin(hist).2) AS upperBound,
arrayJoin(hist).3 AS count,
bar(count, 0, max(count) OVER (), 20) AS b
FROM
(
SELECT
path,
sum(hits) AS hits
FROM wikistat
WHERE date(time) = '2015-06-15'
GROUP BY path
HAVING hits > 10000
);┌─lowerBound─┬─upperBound─┬──count─┬─b────────────────────┐
│ 10033 │ 19886 │ 53.375 │ ████████████████████ │
│ 19886 │ 31515 │ 18.625 │ ██████▉ │
│ 31515 │ 43518 │ 6.375 │ ██▍ │
│ 43518 │ 55647 │ 1.625 │ ▌ │
│ 55647 │ 73602 │ 1.375 │ ▌ │
│ 73602 │ 92880 │ 3.25 │ █▏ │
│ 92880 │ 116778 │ 1.375 │ ▌ │
│ 116778 │ 186176 │ 1.125 │ ▍ │
│ 186176 │ 946963 │ 1.75 │ ▋ │
│ 946963 │ 1655250 │ 1.125 │ ▍ │
└────────────┴────────────┴────────┴──────────────────────┘