Комментарии 5
Спасибо за статью. С интересом смотрю на 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 в следующем:
LC_ALL=C
- В 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
Как использовать ClickHouse не по его прямому назначению