«IN» поддержка объединений - PullRequest
0 голосов
/ 22 апреля 2020

Мы пытаемся подключить Pentaho BI к ClickHouse , а иногда Pentaho генерирует запросы следующим образом:

select
...
from
date_dimension_table,
fact_table,
other_dimension_table
where
fact_table.fact_date = date_dimension_table.date
and date_dimension_table.calendar_year = 2019
and date_dimension_table.month_name in ('April', 'June', ...)
and fact_table.other_dimension_id = other_dimension_table.id
and other_dimension_table.code in ('code1', 'code2', ...)
group by
date_dimension_table.calendar_year,
date_dimension_table.month_name,
other_dimension_table.code;

Производит ClickHouse ошибка: Код: 403, e.displayText () = DB :: Exception: Неверное выражение для JOIN ON. Ожидаемое выражение равно, получил (код AS c2) IN ('code1', 'code2', ...). Поддерживаемый синтаксис: JOIN ON Expr ([таблица.] Столбец, ...) = Expr ([таблица.] Столбец, ...) [AND Expr ([таблица.] Столбец, ...) = Expr ([таблица. ] column, ...) ...] (версия 19.15.3.6 (официальная сборка))

Движки, используемые для таблиц: fact_table - MergeTree , оба измерения - TinyLog .

Таким образом, вопросы:

  1. Можно ли решить эту проблему путем изменения настольных движков ? К сожалению, мы не можем изменить запрос, он автоматически сгенерирован.

  2. Если нет, есть ли планы по поддержке объединений с в предложении в ClickHouse в ближайшее время?

Спасибо.

1 Ответ

1 голос
/ 23 апреля 2020

Эта проблема была исправлена, начиная с Версия ClickHouse v20.3.2.1, 2020-03-12 (см. Выпуск 7314 ), поэтому вам необходимо обновить CH.

! Не забудьте проверить все обратно несовместимые изменения (см. changelog ).


Давайте воспроизведем эту проблему в CH 19.15.3 ревизии 54426, чтобы получить описанную вами ошибку:

Received exception from server (version 19.15.3):
Code: 403. DB::Exception: Received from localhost:9000. DB::Exception: Invalid expression for JOIN ON. Expected equals expression, got code IN ('code1', 'code2'). Supported syntax: JOIN ON Expr([table.]column, ...) = Expr([table.]column, ...) [AND Expr([table.]column, ...) = Expr([table.]column, ...) ...]. 

Теперь выполните этот запрос в последней версии CH (версия 20.3.7 54433), чтобы убедиться, что он работает правильно:

docker pull yandex/clickhouse-server:latest

docker run -d --name ch_test_latest yandex/clickhouse-server:latest

docker exec -it ch_test_latest clickhouse-client

# create tables as described below
..

# execute test query
..

Подготовка к тесту:

create table date_dimension_table (
    date DateTime,
    calendar_year Int32,
    month_name String
) Engine = Memory;

create table fact_table (
    fact_date DateTime,
    other_dimension_id Int32
) Engine = Memory;

create table other_dimension_table (
    id Int32,
    code String
) Engine = Memory;

Тестовый запрос:

SELECT 
    date_dimension_table.calendar_year, 
    date_dimension_table.month_name, 
    other_dimension_table.code
FROM date_dimension_table
    ,fact_table
    ,other_dimension_table
WHERE (fact_table.fact_date = date_dimension_table.date) 
    AND (date_dimension_table.calendar_year = 2019) 
    AND (date_dimension_table.month_name IN ('April', 'June')) 
    AND (fact_table.other_dimension_id = other_dimension_table.id) 
    AND (other_dimension_table.code IN ('code1', 'code2'))
GROUP BY 
    date_dimension_table.calendar_year, 
    date_dimension_table.month_name, 
    other_dimension_table.code
...