clickhouse-物化视图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了clickhouse-物化视图相关的知识,希望对你有一定的参考价值。

参考技术A

https://clickhouse.tech/docs/en/sql-reference/statements/create/view/#

物化视图可以理解为一个预聚合触发器,数据在控制好触发的汇聚条件,几乎是实时的
物化视图会存储一份计算好的聚合数据,是一种空间换时间的绝妙方法,对集群的稳定性和很重要。

物化视图的建立有两种方法
1,使用TO关键字( 推荐使用 ),可以控制TTL,不能使用POPULATE
例:

2,使用默认表
此方案建议是数据量小的表,因为无法控制TTL,后期数据运维不方便。默认存储表在clickhouse中是 .inner_id.uuid 值作为表名
例:

1,物化视图是一种空间换时间的预聚合方式,聚合后的数据将存储在新表中,一般于SummingMergeTree,AggregatingMergeTree等聚合引擎一起使用。

2,物化视图因为是写入触发器,所以as select只对每批次的insert data有效果,所以即使是where条件也是对这批写入数据起效果( https://clickhouse.tech/docs/en/sql-reference/statements/create/view/#materialized )

4,POPULATE关键字,不建议使用,会把原始表中的已存在数据全部物化一遍,老数据的同步,建议直接insert到mv中

5,多表join生成物化视图,左表插入数据时才更新

6,源表数据的改变不会影响物化视图,如update, delete, drop partition

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

【中文标题】clickhouse:在启动时创建物化视图(docker)【英文标题】:clickhouse: create materialized view on startup (docker) 【发布时间】:2021-04-30 19:02:02 【问题描述】:

我正在尝试设置一个在启动时具有物化视图的本地开发泊坞窗。所以有了这个 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 文件,它无法启动。如果我只从表格开始,然后 execclickhouse-client 并创建物化视图,它就可以工作,所以我认为问题不在于物化视图本身。

我们可以对启动有具体的看法吗?

【问题讨论】:

但元数据文件夹存储附加脚本未创建 嗨@DennyCrane 但是当它是一个表时似乎没有什么区别(表已创建)。实践上有什么不同? 差别很大,我无法在评论中解释。你应该使用附加。 好的,谢谢。将所有内容更改为ATTACH,但现在有另一个问题.. 你能帮忙***.com/questions/67348100/…吗? 【参考方案1】:

需要将sql-scripts复制到/docker-entrypoint-initdb.d/-folder:

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        │
  > └─────────────────────────┘

【讨论】:

以上是关于clickhouse-物化视图的主要内容,如果未能解决你的问题,请参考以下文章

无缝更改ClickHouse物化视图SELECT逻辑的方法

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

ClickHouse-尚硅谷(13. 高级-物化视图)学习笔记

ClickHouse-尚硅谷(13. 高级-物化视图)学习笔记

带有 TO 子句的 Clickhouse 物化视图不支持按

无缝更改ClickHouse物化视图SELECT逻辑的方法