clickhouse:在启动时创建实体化视图 (docker)

clickhouse: create materialized view on startup (docker)

我正在尝试建立本地开发 docker,在启动时使用物化视图。所以有了这个 Dockerfile:

FROM yandex/clickhouse-server:20.6.4.44
COPY default /var/lib/clickhouse/metadata/default

default 中我们有这两个定义:

a_table.sql:

CREATE TABLE default.a_table (
    `startTimestamp` DateTime,
    `fieldNumber` UInt32,
    `clientCountry` UInt16,
    `packets` UInt64,
    `bytes` UInt64
)
ENGINE = SummingMergeTree()
PARTITION BY toYYYYMM(startTimestamp)
ORDER BY (startTimestamp, clientCountry)
SETTINGS index_granularity = 8192

和视图,v_by_country_15m.sql::

CREATE MATERIALIZED VIEW v_by_country_15m 
ENGINE = SummingMergeTree()
PARTITION BY toYYYYMM(startTimestamp)
PRIMARY KEY (startTimestamp, clientCountry)
ORDER BY (startTimestamp, clientCountry)
AS (
       SELECT startTimestamp,
              clientCountry,
              sum(bytes) as bytes
       FROM a_table
       GROUP BY startTimestamp, clientCountry
)

如果我只在 default 文件夹中包含 a_table.sql 文件,容器会正常启动,但如果我在 default 文件夹中包含 v_by_country_15m.sql 文件,它无法启动。如果我只从 table 开始,然后是 execclickhouse-client 并只创建物化视图,它就可以工作,所以我认为问题不是物化视图本身。

我们可以在启动时有物化视图吗?

需要将sql-脚本复制到/docker-entrypoint-initdb.d/-文件夹:

FROM yandex/clickhouse-server:20.6.4.44
COPY default/* /docker-entrypoint-initdb.d/

检查一下:

docker build -t test_ch:latest  .
docker run test_ch

docker exec -it {container-id} bash
> clickhouse client
  > USE default
  > SHOW TABLES
  > ┌─name────────────────────┐
  > │ .inner.v_by_country_15m │
  > │ a_table                 │
  > │ v_by_country_15m        │
  > └─────────────────────────┘