Clickhouse: [Feature Request] Pivoting Table Engine

Created on 16 Dec 2017  Β·  2Comments  Β·  Source: ClickHouse/ClickHouse

Clickhouse is best for collecting metrics, but metrics usualy come as short table example:
(example - you get metric from some device, than push it to clickhouse)

image

But columnar DB should save them as long table (for perfomance) for now - if you want to convert short table for long one - you need collector server + script, that transform metrics, when you have distributed arcitecture it is big problem, because some of metrics (from same device) can be handle on one server and another - on second server. Also that add time lag for adding metric (collector should wait all metric for device and after that - insert it).

I have an idea how to solve that problem.

Clickhouse should have Pivoting table (like pivot function in MSSQL/Oracle) but it should be not function - it should be table type. When we create that table type - we set some settings for that engine:

  1. static colums (that dont pivoting)
  2. Dynamic colums (that pivoting)
  3. Backend engine (MergeTree/ReplicatedMergeTree/etc)

image

So, if we insert sample table (from my example) clickhouse:

  1. Scan incoming rows
  2. Find that last 2 colums are dynamic and get that metric name are generator column and metric result are result column
  3. Clickhouse scan table that we have, and look for columns with name in metric name
  4. If we have it - add rows to table
  5. If not - ALTER table and add new columns then - insert rows

As a result we get that table automaticaly:
image

And if clickhouse get new metric (new name in DYNAMIC column) - it ALTER table adding new column, than add new metric.

That function can gain huge performance for metrics usage case (when you have distributed collection network) and when you dont know what metrics you should collect tomorrow =)

_Russian translation of that:
ΠžΡ‡Π΅Π½ΡŒ Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π²ΠΈΠΆΠΎΠΊ Ρ‚Π°Π±Π»ΠΈΡ† ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π° Π²Ρ…ΠΎΠ΄ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° - статичСский Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ (ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ) ΠΈ Π΄Π²Π΅ динамичСскиС.

ΠŸΠ΅Ρ€Π²Π°Ρ динамичСская ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ, Π° вторая ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° - Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для ΠΏΠ΅Ρ€Π²ΠΎΠΉ (наглядно ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… Π²Ρ‹ΡˆΠ΅).

Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами - ΠΊΠΎΠ³Π΄Π° ΠΊ Π²Π°ΠΌ поступаСт ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ΡƒΠ·ΠΊΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ структуру Ρ‚Π°Π±Π»ΠΈΡ† ΠΏΠΎΠ΄ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ - ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π² ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠΌ ΡƒΠ·ΠΊΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, Π° clickhouse ΡƒΠΆΠ΅ сам Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ (ALTER TABLE) ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π½ΠΈΡ… Π½ΡƒΠΆΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² Ρ‚ΠΎΠΌ кСйсС ΠΊΠΎΠ³Π΄Π° ΠΈΠ΄Π΅Ρ‚ распрСдСлСнная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² дальнСйшСм Π·Π°Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² clickhouse. Или ΠΊΠΎΠ³Π΄Π° сСгодня Π½Π΅ извСстно Ρ‡Ρ‚ΠΎ Π·Π°Π²Ρ‚Ρ€Π° ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π½Π°Π΄ΠΎ сильно большС Π΄Π°Π½Π½Ρ‹Ρ…. Π’ΠΊ Ссли Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² ΡƒΠ·ΠΊΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ - это Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ CH, Ссли ΠΆΠ΅ Π΄Π΅Π»Π°Ρ‚ΡŒ ΡˆΠΈΡ€ΠΎΠΊΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ - Ρ‚ΠΎ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ скрипт ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ посылаСт Π΄Π°Π½Π½Ρ‹Π΅ Π² CH + Ρ€ΡƒΠΊΠ°ΠΌΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ ALTER.

И Π΄Π°, Ρ‚ΡƒΡ‚ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ replacing Π΄Π²ΠΈΠΆΠΎΠΊ ΠΈΠ»ΠΈ update Ρ‚ΠΊ строки ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ =)_

feature st-discussion

Most helpful comment

hi, @alexey-milovidov @ztlpn, I also think dynamic column is useful for metric system.
Is there a plan to add the feature ?

All 2 comments

If you make your Dynamic.X a nested table, then you could do arrayElement(indexOf( to put specific key as a column manually.

hi, @alexey-milovidov @ztlpn, I also think dynamic column is useful for metric system.
Is there a plan to add the feature ?

Was this page helpful?
0 / 5 - 0 ratings

Related issues

vvp83 picture vvp83  Β·  3Comments

opavader picture opavader  Β·  3Comments

vixa2012 picture vixa2012  Β·  3Comments

innerr picture innerr  Β·  3Comments

jangorecki picture jangorecki  Β·  3Comments