Skip to content

Instantly share code, notes, and snippets.

View alexey-milovidov's full-sized avatar

Alexey Milovidov alexey-milovidov

View GitHub Profile
@alexey-milovidov
alexey-milovidov / test.txt
Created April 18, 2018 21:07
Parsing array of wrong type
$ echo '[1, -1]' | clickhouse-local -S 'x Array(UInt8)' --query="SELECT * FROM table"
Code: 130, e.displayText() = DB::Exception: Cannot read array from text: (at row 1)
Row 1:
Column 0, name: x, type: Array(UInt8), parsed text: "[1, "ERROR
, e.what() = DB::Exception (from 0.0.0.0:0) (in query: SELECT * FROM table), Stack trace:
0. clickhouse-local(StackTrace::StackTrace()+0x12) [0x53d67b2]
1. clickhouse-local(DB::DataTypeArray::deserializeText(DB::IColumn&, DB::ReadBuffer&) const+0x2a4) [0x7e69cb4]
ClickHouse client version 1.1.54371.
Connecting to localhost:9000.
Connected to ClickHouse server version 1.1.54371.
localhost :) USE test
USE test
Ok.
+ - сделано хотя бы в master
* - в процессе
Доработки форматов.
+ Protobuf
+ Parquet
+ Avro
+ Настраиваемое поведение CSV: separator.
Old:
Running: float_parsing
[
{
"hostname": "",
"main_metric": "avg_rows_per_second",
"num_cores": 16,
"num_threads": 32,
"parameters": {
1. Short-curcuit вычисление некоторых функций.
ClickHouse использует векторное вычисление выражений в запросах (vectorized query execution). То есть, каждая функция вызывается не для отдельных значений, а для небольших массивов - кусочков столбцов. Для примера, в вычисление x + y будут переданы два массива - массив значений x и массив соответствующих значений y.
Недостаток состоит в том, что сложнее реализовать short-curcuit операторы. К таким операторам относятся AND, OR, if. Для примера, в выражении expr1 AND expr2, будут сначала вычислены оба аргумента, а затем переданы в функцию AND. Хотя в тех строчках, где expr1 равно false, выражение expr2 вовсе не обязательно было вычислять. Это становится проблемой, когда само вычисление expr2 сложное, или когда при вычислении expr2 может быть выкинуто исключение.
Short-curcuit вычисление можно было бы реализовать так:
- вычислить expr1;
- отфильтровать массивы входных аргументов для вычисления expr2, оставив только значения, где expr1 = true;
- вычислить expr2 на
Как настроить Tableau over ClickHouse ODBC на Windows
==== ODBC-драйвер для Clickhouse
1. Надо поставить драйвер https://github.com/yandex/clickhouse-odbc/releases/latest
2. Создать источник данных odbc. Пример:
https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-configuration-dsn-windows-5-2.html
Надо выбрать Unicode версию odbc-драйвера
=================================================================
==260044:302867==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x61500060db01 at pc 0x00000cf8e0a5 bp 0x7f0359a478f0 sp 0x7f0359a478e8
WRITE of size 8 at 0x61500060db01 thread T3436
#0 0xcf8e0a4 (/usr/bin/clickhouse+0xcf8e0a4)
#1 0xcf8e42b (/usr/bin/clickhouse+0xcf8e42b)
#2 0xcf8f39f (/usr/bin/clickhouse+0xcf8f39f)
#3 0xcf8f78c (/usr/bin/clickhouse+0xcf8f78c)
#4 0xcdef1df (/usr/bin/clickhouse+0xcdef1df)
#5 0xcddf6af (/usr/bin/clickhouse+0xcddf6af)
#6 0xcde32bb (/usr/bin/clickhouse+0xcde32bb)
:) CREATE TABLE test.sessions (begin DateTime, end DateTime) ENGINE = Memory
CREATE TABLE test.sessions
(
begin DateTime,
end DateTime
) ENGINE = Memory
Ok.
:) SELECT number % 3 AS key, number AS x FROM system.numbers LIMIT 10
SELECT
number % 3 AS key,
number AS x
FROM system.numbers
LIMIT 10
┌─key─┬─x─┐
│ 0 │ 0 │
:) SELECT C_REGION, C_NATION, count(*) FROM lineorder_x3 GLOBAL ANY INNER JOIN ( SELECT C_REGION, C_NATION, C_CUSTKEY AS LO_CUSTKEY FROM customer_x3 ) USING (LO_CUSTKEY) WHERE (toYear(LO_ORDERDATE) > 1993) AND (LO_DISCOUNT >= 1) AND (LO_QUANTITY < 25) GROUP BY C_REGION, C_NATION;
SELECT
C_REGION,
C_NATION,
count(*)
FROM lineorder_x3
GLOBAL ANY INNER JOIN
(
SELECT