Использование массива (Tuple (LowCardinality (String), Int32)) в ClickHouse - PullRequest
1 голос
/ 20 марта 2020

У меня есть таблица

CREATE TABLE table (
    id Int32,
    values Array(Tuple(LowCardinality(String), Int32)),
    date Date
) ENGINE MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (id, date)

, но при выполнении запроса

SELECT count(*)
FROM table
WHERE (arrayExists(x -> ((x.1) = toLowCardinality('pattern')), values) = 1)

я получаю ошибку

Code: 49. DB::Exception: Received from clickhouse:9000. DB::Exception: Cannot capture column 3 because it has incompatible type: got String, but LowCardinality(String) is expected..

Если я заменяю значения столбца 'Значения Array (Tuple (String, Int32)) затем запрос выполняется без ошибок.

В чем может быть проблема при использовании Array (Tuple (LowCardinality (String), Int32))?

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Пока не будет исправлено (см. ошибка 7815 ), можно использовать этот обходной путь:

SELECT uniqExact((id, date)) AS count
FROM table
ARRAY JOIN values
WHERE values.1 = 'pattern'

Для случая, когда существует более одного Массив -колонки можно использовать так:

SELECT uniqExact((id, date)) AS count
FROM 
(
    SELECT 
        id, 
        date, 
        arrayJoin(values) AS v, 
        arrayJoin(values2) AS v2
    FROM table
    WHERE v.1 = 'pattern' AND v2.1 = 'pattern2'
)
0 голосов
/ 20 марта 2020

значения Array (Tuple (LowCardinality (String), Int32)),

Не использовать Tuple. Это приносит только минусы. Это все еще * 2 файла на диске. Это дает двойное замедление, тогда вы извлекаете только один элемент кортежа

https://gist.github.com/den-crane/f20a2dce94a2926a1e7cfec7cdd12f6d

valuesS Array(LowCardinality(String)),
valuesI Array(Int32)
...