Как стать автором
Обновить

Как использовать ClickHouse не по его прямому назначению

Время на прочтение10 мин
Количество просмотров19K
Всего голосов 47: ↑47 и ↓0+47
Комментарии5

Комментарии 5

Пример с clickhouse-local — обалдеть!

Спасибо за статью. С интересом смотрю на clickhouse, планирую попробовать на будущих проектах.


По интеграции с mysql вопрос. В примере в статье даже после фикса проблемы с регистрами в именах, значения столбца count в ответах mysql и clickhouse различаются: во всех строках кроме NULL значения clickhouse чуть меньше, чем mysql. Он выбрасывает какие-то данные? Или просто запросы для статьи делали на живых данных в разное время?


для сравнения чтобы не скролить



clickhouse-local — выглядит шикарно. Но и он дал результаты, отличные от пайплайна grep+sed+sort.

Да, запросы делались в разное время (но не сильно разное — наверное в течение часа) на продакшен базе.


Я попробую сейчас сделать пару похожих запросов и выясню, в чём различия.

Самое большое различие в количестве для названия "счетчик".
Причина в том, что MySQL агрегирует без учёта диакритики:
http://sqlfiddle.com/#!9/0a28f18/584
(выполняет некоторую нормализацию перед агрегацией)


Можно написать так:


SELECT BINARY name, count(*) FROM conv_main.counters GROUP BY BINARY name ORDER BY count(*) DESC LIMIT 10;

Правда так запрос в MySQL только сильно замедляется (уже выполняется 20 минут и я не могу дождаться). Может быть надо CAST(... AS VARBINARY) или что-то типа того.


Различия в работе clickhouse-local на примере в статье, по сравнению с sort, uniq в следующем:


  1. LC_ALL=C
  2. В clickhouse-local не указан формат входных данных. По-умолчанию используется TabSeparated (TSV). Он предусматривает экранирование. В том числе, можно экранировать перевод строки с помощью бэкслеша. В коде на C++ бэкслеш в конце строки тоже попадается — в экранировании макросов. Таким образом, в clickhouse-local некоторые строки (у которых бэкслеш на конце), превратятся в одну. Получить в точности такой же результат можно, указав формат LineAsString:

milovidov@milovidov-desktop:~/work/ClickHouse$ find {src,programs,utils,base} -name '*.h' -or -name '*.cpp' | grep -v generated | xargs cat > code.txt

milovidov@milovidov-desktop:~/work/ClickHouse$ time LC_ALL=C cat code.txt | sed -r -e 's/^ +//' | grep . | sort | uniq -c | sort -rn | head -n10
  57004 {
  52665 }
   6277 };
   4708 else
   3422 namespace DB
   2705 public:
   2277 */
   2268 return false;
   2142 break;
   1858 #pragma once

real    0m2,051s
user    0m2,244s
sys     0m0,139s

milovidov@milovidov-desktop:~/work/ClickHouse$ time clickhouse-local --input-format 'LineAsString' --structure 's String' --query "SELECT count() AS c, trimLeft(s) AS key FROM table WHERE key != '' GROUP BY key ORDER BY c DESC LIMIT 10" < code.txt
57004   {
52665   }
6277    };
4708    else
3422    namespace DB
2705    public:
2277    */
2268    return false;
2142    break;
1858    #pragma once

real    0m0,186s
user    0m0,150s
sys     0m0,037s

Спасибо за развернутый ответ.


Еще одно напоминание, что из коробки ничто не работает — всегда нужно разбираться с деталями.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий