故障分析 | ClickHouse 物化视图插入时间变为“1970-01-01 08:00:00”问题复盘

clickhouse数据导入遇到的问题 阅读详情

作者:大睿

大睿,DBA,爱好减肥,瘦了30多斤,负责公司数据库集群的管理和维护。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


物化视图使用to的方式写入到存储表中,即如下:

CREATE MATERIALIZED VIEW
[IF NOT EXISTS]
[db.]table_name
[ON CLUSTER] TO
[db.]nameAS
SELECT ...

指定了存储的表,所以物化视图的创建也不需要指定 engine ,在查询中,查物化视图和查实际的存储表得到一样的数据,因为都是来自于同一份存储数据。

物化视图是计算每次写入原表的数据,经过聚合之后写入到目标表。比如,有按照 1s 一次记录的明细表,同时需要按照分钟级做数据的聚合统计pv(类似的需要),则可以通过创建物化视图的方式将聚合后的数据写到 1min 的表中(这种感觉有点像触发器)

范例

1s记录的明细表

CREATE TABLE dba_test.t_1s
(
    `ctime` DateTime64(0),
    `pv` Int64
)
ENGINE = MergeTree
PARTITION BY toDate(ctime)
ORDER BY ctime
SETTINGS index_granularity = 8192

1min 记录的聚合数据

CREATE TABLE dba_test.t_1m
(
    `ctime` DateTime64(0),
    `pv` Int64
)
ENGINE = SummingMergeTree
PARTITION BY toDate(ctime)
ORDER BY ctime
SETTINGS index_granularity = 8192

物化视图t_1m_mv,查询条件是从1s的表(t_1s),按照分钟级(toStartOfMinute)聚合查询结果,重新写入到1min的表(t_1m)中

物化视图

CREATE MATERIALIZED VIEW dba_test.t_1m_mv TO dba_test.t_1m
(
    `toStartOfMinute(ctime)` DateTime,
    `pv` Int64
) AS
SELECT
    toStartOfMinute(ctime),
    sum(pv) AS pv
FROM dba_test.t_1s
GROUP BY ctime

写入测试

dba-clickhouse-001 :) insert into t_1s values('2022-01-01 00:10:01',1),('2022-01-01 00:10:01',1),('2022-01-01 00:20:01',2),('2022-01-01 00:20:01',2),('2022-01-01 00:30:01',3);

INSERT INTO t_1s VALUES

Query id: 0bf16844-0123-4e25-a3d4-f9b5a5c8db37

Ok.

5 rows in set. Elapsed: 0.003 sec.

dba-clickhouse-001 :) select * from t_1s;

SELECT *
FROM t_1s

Query id: cb442100-37a6-4de7-b6f3-f80f084710dc

┌───────────────ctime─┬─pv─┐
│ 2022-01-01 00:10:01 │  1 │
│ 2022-01-01 00:10:01 │  1 │
│ 2022-01-01 00:20:01 │  2 │
│ 2022-01-01 00:20:01 │  2 │
│ 2022-01-01 00:30:01 │  3 │
└─────────────────────┴────┘

5 rows in set. Elapsed: 0.002 sec.

dba-clickhouse-001 :) select * from t_1m;

SELECT *
FROM t_1m

Query id: f9d2d05d-8ad7-44a4-b66a-ea8c3c758f1f

┌───────────────ctime─┬─pv─┐
│ 1970-01-01 08:00:00 │  9 │
└─────────────────────┴────┘

1 rows in set. Elapsed: 0.002 sec.

插入的时间竟然是1970-01-01 08:00:00

开始验证是否是查询语句有误

检查物化视图中的查询结果是否符合预期

dba-clickhouse-001 :) SELECT
:-]     toStartOfMinute(ctime),
:-]     sum(pv) AS pv
:-] FROM dba_test.t_1s
:-] GROUP BY ctime;

SELECT
    toStartOfMinute(ctime),
    sum(pv) AS pv
FROM dba_test.t_1s
GROUP BY ctime

Query id: 1ecaf07e-c766-40b7-bfa2-0f87ee54abad

┌─toStartOfMinute(ctime)─┬─pv─┐
│    2022-01-01 00:20:00 │  4 │
│    2022-01-01 00:30:00 │  3 │
│    2022-01-01 00:10:00 │  2 │
└────────────────────────┴────┘

3 rows in set. Elapsed: 0.002 sec.

查询结果符合预期

直接通过insert ...select...方式确认下插入数据是否符合预期

dba-clickhouse-001 :) insert into t_1m SELECT
:-]     toStartOfMinute(ctime),
:-]     sum(pv) AS pv
:-] FROM dba_test.t_1s
:-] GROUP BY ctime;

INSERT INTO t_1m SELECT
    toStartOfMinute(ctime),
    sum(pv) AS pv
FROM dba_test.t_1s
GROUP BY ctime

Query id: 5db8279a-ffb1-4174-843c-80cee48b448c

Ok.

0 rows in set. Elapsed: 0.002 sec.

dba-clickhouse-001 :) select * from t_1m;

SELECT *
FROM t_1m

Query id: acd79ea7-dc82-49f1-bb71-430a05895f19

┌───────────────ctime─┬─pv─┐
│ 1970-01-01 08:00:00 │  9 │
└─────────────────────┴────┘
┌───────────────ctime─┬─pv─┐
│ 2022-01-01 00:10:00 │  2 │
│ 2022-01-01 00:20:00 │  4 │
│ 2022-01-01 00:30:00 │  3 │
└─────────────────────┴────┘

4 rows in set. Elapsed: 0.002 sec.

直接插入,数据正确,时间没有被转化。

可以确认物化视图的查询部分是没有问题,那只能是在写入的时候出现了问题,换个思路去想一下,时间戳的开始时间是1970-01-01 00:00:00,而这里插入的时间是1970-01-01 08:00:00多了8小时,也就是说因为时区的原因导致时间推迟了。那会不会是因为插入的数据不规范,或者是“空”被转化了呢。

验证

dba-clickhouse-001 :) insert into t_1m values('',100);

INSERT INTO t_1m VALUES

Query id: af1785ef-dca1-467b-84c6-27f9da6547f6

Ok.

1 rows in set. Elapsed: 0.002 sec.

dba-clickhouse-001 :) select * from t_1m;

SELECT *
FROM t_1m

Query id: 34db2057-7274-4859-898e-6132f8df4465

┌───────────────ctime─┬─pv─┐
│ 1970-01-01 08:00:00 │  9 │
└─────────────────────┴────┘
┌───────────────ctime─┬─pv─┐
│ 2022-01-01 00:10:00 │  2 │
│ 2022-01-01 00:20:00 │  4 │
│ 2022-01-01 00:30:00 │  3 │
└─────────────────────┴────┘
┌───────────────ctime─┬──pv─┐
│ 1970-01-01 08:00:00 │ 100 │
└─────────────────────┴─────┘

5 rows in set. Elapsed: 0.002 sec.

果然,当插入的数据为空的时候,时间被重置了。

对比下物化视图和目标的聚合表的结构

dba-clickhouse-001 :) desc t_1m;

DESCRIBE TABLE  t_1m

Query id: 96c6a5ca-e42a-47e1-8212-cbcfefa6ffa4

┌─name──┬─type──────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ ctime │ DateTime64(0) │              │                    │         │                  │                │
│ pv    │ Int64         │              │                    │         │                  │                │
└───────┴───────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘

2 rows in set. Elapsed: 0.001 sec.

dba-clickhouse-001 :) desc t_1m_mv;

DESCRIBE TABLE  t_1m_mv

Query id: a258f6b5-f195-4386-a9bb-4ec86e7e9bd1

┌─name───────────────────┬─type─────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ toStartOfMinute(ctime) │ DateTime │              │                    │         │                  │                │
│ pv                     │ Int64    │              │                    │         │                  │                │
└────────────────────────┴──────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘

2 rows in set. Elapsed: 0.001 sec.

聚合表时间字段名叫ctime,物化视图的则是toStartOfMinute(ctime)

重新调整物化视图的写法,并清理t_1m表中的数据

dba-clickhouse-001 :) show create table t_1m_mv\G
statement: CREATE MATERIALIZED VIEW dba_test.t_1m_mv TO dba_test.t_1m
(
    `ctime` DateTime,
    `pv` Int64
) AS
SELECT
    toStartOfTenMinutes(ctime) AS ctime,
    sum(pv) AS pv
FROM dba_test.t_1s
GROUP BY ctime

dba-clickhouse-001 :) insert into t_1s values('2022-01-01 00:10:01',1),('2022-01-01 00:10:01',1),('2022-01-01 00:20:01',2),('2022-01-01 00:20:01',2),('2022-01-01 00:30:01',3);

INSERT INTO t_1s VALUES

Query id: 812d1bbd-55f3-4a8f-b9f7-bbbe93e694af

Ok.

5 rows in set. Elapsed: 0.003 sec.

dba-clickhouse-001 :) select * from t_1m;

SELECT *
FROM t_1m

Query id: 2d1a045a-4e53-4f94-bb6a-fe5e5d58f5c7

┌───────────────ctime─┬─pv─┐
│ 2022-01-01 00:10:00 │  2 │
│ 2022-01-01 00:20:00 │  4 │
│ 2022-01-01 00:30:00 │  3 │
└─────────────────────┴────┘

3 rows in set. Elapsed: 0.002 sec.

结论

物化视图的字段(t_1m_mv)要与目标表(t_1m)的字段名对齐

(表达不是很严谨,大概是上面的意思)

clickhouse跳坑指南 一、Clickhouse优缺点 优点: 1,为了高效的使用CPU,数据不仅仅按列存储,同时还按向量进行处理; 2,数据压缩空间大,减少IO;处理单查询高吞吐量每台服务器每秒最多数十亿行; 3,索引非B树结构,不需要满足最左原则;只要过滤条件在索引列中包含即可;即使在使用的数据不在索引中,由于各种并行处理机制ClickHouse全表扫描的速度也很快; 4,写入速度非常快,50-200M/s,按照每行100Byte估算,大约相当于50W-200W条/s的写入速度。 缺点: 1,不支持事务; . 阅读详情

相关推荐

C++总结笔记

/ ++操作 这是因为定义的数组,申请的是连续的内存空间,当ptr++(ptr是int类型的指针变量),地址空间向后偏移是以int类型的大小为单位进行偏移的,相当于int类型数组元素的向后偏移。使用场景:它是最通用的转换形式,用于将一种类型转换为另一种类型,例如基本数据类型的转换(如 float 转 int),指向基类的指针或引用转为指向派生类的指针或引用等。在派生类被调用时会调用派生类中的函数,不会调用基类中的被重写的函数(基类中的函数需要加上virtual才可以,即基类中的函数是虚函数)。

weixin_50890461的博客 5233

1970-01-01 08:00:00 时间由来

在用ng的date过滤服务的时候时间戳0会转换成1970-01-01 08:00:00; 是因为起源于UNIX系统,以Unix诞生的时间为参照确定的,UNIX认为1970年1月1日0点是时间纪元,现代计算机(电话,电子设备)时间以1970 年 1 月 1 日的 08:00为基准, 在时间转换时,或者时间重置时都会出现这个时间值,unix时间戳零点是 1970年1月1日0点整(utc),北京是g

学如逆水行舟,不进则退 2万+

cadence allegro 17.x 降版本到16.6的转换工具

Cadence17.x版本降低到16.6版本转换工具 下载链接:Cadence17.x版本降低到16.6版本转换工具   使用方法: 软件使用比较简单,在「第一个路径输入栏」浏览指向17.x的设计文件,也就是需要降版本的17.4或者17.2的文件,然后在「第二个路径输入栏」里浏览指向转换后的文件保存路径,然后点击「转换」按钮即可。 ...

ltqdxl的博客 1万+

为什么Date对象的默认时间戳是1970年1月1日8:00(A.M.)?

发现它的默认时间是:08:00:00,但是记得应该是1月1日的00:00:00,这里为什么是8点呢?找了一圈发现是因为存在系统时间和本地时间,因为本地时间的时区设置为东8区,所以打印的结果是早上8点。这里如果有特殊需要在使用Date函数时需要减去这多出来的8个小时,换算为8 * 60 * 60 * 1000 = 28800000ms。

m0_56426418的博客 2154

重回童年的经典系列☀️| 【坦克大战3D版】游戏制作+解析

带你重回童年的经典系列——坦克大战3D版制作,感兴趣的可以看看呀~

努力前行,总会成为自己心中的那道光 5万+

避坑指南!YOLO26模型导出/推理常见问题,99%的开发者都踩过

版本锁定:Ultralytics=8.4.2、OpenVINO=2024.0.0、Python=3.10,版本不一致是80%问题的根源;参数对齐:训练/导出/推理的imgsz、归一化、坐标映射必须完全一致,差一步就出错;算子统一:避免自定义算子,优先用YOLO26原生算子(C3k2/PSABlock),确保推理引擎兼容;分步验证:导出后先校验ONNX/IR模型→单图片推理→RTSP流推理→72小时稳定性测试,一步过易踩坑;工业级测试。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 509

【工作笔记】Mysql写入报错:Incorrect datetime value: ‘1970-01-01 08:00:00‘

原因是MySQL关于时间类型的取值范围进行检查,最早时间为1970-01-01 00:00:01。算上时区的话, 那就是1970-01-01 08:00:01。所以1970-01-01 08:00:00的时间无法写入。即1970-01-01 08:00:01。建议将默认时间赋值为。

马路上开飞机 3756

MSBlock赋能C2f模块,让目标检测在轻量化与精度间双向突破

在文件夹下新建,将上述MSBlock和C2f_MS类的代码写入其中。这一步是为了让YOLOv8的代码架构能识别我们的自定义模块。

LXY_LOVE36的博客 143

java后台测试代码向数据库写入的date类型的值始终为1970-01-01解决方法

java后台测试代码向数据库写入的date类型的值始终为1970-01-01解决方法 我在写一段测试代码的时候,向数据库添加生日的date类型的数据的时候,数据库中添加的信息每一条date类型的数据都是1970-01-01; 后来我发现是忘了添加date类型的时间显示格式 修改之后如下: 1、定义一个字符串 2、将时间格式化 3、将字符串转化为Date类型 4、再转化为方便数

Adonis_D_Gogh的博 客 4592

Quartus II编译时出现Error (119013): Current license file does not support the EP4CE6E22C6 device

Quartus II编译时出现Error (119013): Current license file does not support the EP4CE6E22C6 device, Quartus的安装过程不同于ISE/vivado的安装。“Current license file does not support”这种情况多出现在高版本的quartus中综合很久以前的代码,使用很早型号的FPGA或是CPLD。对于这种情况,就得在官网或是其他网站上下载包含所需Device的库文件。

夜半少年的博客 1万+

2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)

2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)

王老师青少年编程 989

工作日记2017.10.30 MySQL的日期存储'1970-01-01 08:00:00' 问题

类似的业务场景如下://时间戳为0 Date beginTime = new Date(beginTimeStamp); //beginTime为'1970-01-01 08:00:00'若将beginTime存到Mysql的timestamp格式的字段时,会报一下异常 Data truncation: Incorrect datetime value: ‘1970-01-01 08:00:00’

y1yo2的博客 8940

vs code , 配置 claude code 插件, 默认选项 : --dangerously-skip-permission

摘要:本文介绍如何在VS Code中为Claude Code插件配置--dangerously-skip-permission参数,包含两种方法:图形界面设置(适合新手)和直接编辑settings.json(精准配置)。该参数会跳过权限检查,仅建议在本地测试环境中使用。配置后需通过命令面板验证参数是否生效,并注意安全风险,避免在生产环境使用。多参数配置时需用数组格式,不同版本插件可能键名略有差异。

AI天才研究院 4990

DBeaver连接ClickHouse,时间少了8小时

表字段time,类型为Datetime,插入时间格式为“yyyy-MM-dd HH:mm:ss”插入表中的时间比正常给的时间少了8小时。右键编辑连接 -> 连接设置 -> 驱动属性。

naruto227的博客 1341

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

时间戳存入mysql数据库时1970年异常解决!

今天在测试的时候总是出现时间戳存入mysql数据库数据异常,无论是什么时候的时间戳存入到mysql都是1970年 问题原因:网页默认时间戳单位是【秒】级别,后台需求为【毫秒】级别 解决:取【毫秒】级别时间戳,传输正常 ...

人真正变得强大,不是因为守护着自尊心,而是抛开自尊心的时候。 3254

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

FlinkSQL sink clickhouse 报错

如下图:如果用FlinkSQL创建clickhouse的表,会报错! 原因:Flink目前还不支持clickhouse,源码中写死了。只支持Derby,Mysql,Postgres方言。 解决:如果一定要集成,有两个办法: (1)修改Flink源代码,重新打包,添加修改后的jar包。 (2)使用反射修改DIALECTS静态final属性 。 如果不集成,就先把数据由table转成datastream,再用addsink方法,落地到clickhouse中。 ...

东城庞太师 787

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【踩坑日记】关于时间戳的异常

在最近的一次作业中,保存时间的时候,由于懒得改前端组件时间,默认用了1970-01-01(只有年月日)上传数据,但是遇到了问题`Data truncation: Incorrect datetime value: '1970-01-01 08:00:00' for column 'create_time' at row 1`。但是改一下时间就可以正常提交,引发思考。时间戳不能存 0。

weixin_48471044的博客 1070

ClickHouse学习笔记:01数据类型和基本DDL

在DDL中的枚举类型也可以使用Enum(‘SZ’=0,‘SH’=1) 这种方式进行定义,ClickHouse会根据枚举的值隐式转换为Enum8或者Enum16,如果枚举的值超过了Int16的表数范围,则会报错。2、ClickHouse自身的数据类型是区分大小写的,例如Int8 就只能这样写,不能写成int8,但是如果是兼容Mysql的数据类型,则既可以大写也可以小写,如BIGINT和bigint都是可以的。简单的查询有非常高的性能,多用于数据量不大,而又需要非常非常高的性能的场景下。

1059

ClickHouse SQL Reference (四)数据类型

ClickHouse SQL Reference (四)数据类型

chinusyan的专栏 2861

datax同步数据到ClickHouse时同步时间特别长,原因:Too many partitions for single INSERT block (more than 100).

ClickHouse exception, code: 1002, host: 10.129.170.80, port: 8123; Code: 252. DB::Exception: Too many partitions for single INSERT block (more than 100). The limit is controlled by 'max_partitions_per_insert_block' setting.

qq_45124566的博客 3107

在ClickHouse中处理时序数据

如果处理时序数据可能是你非常重要的使用场景,那么本文必读。

ClickHouseDB的博客 2616

clickhouse 建表 插入 查询

在sql客服端执行,如clickhouse的客户端注意:1、date字段的类型是Datetime,csv文件中的date字段必须是 2022-09-12 20:30:10类似的形式,csv 中的date字段的类型可以为string,导入clikckhouse 中会识别为datetime的类型。

weixin_44725721的博客 1537

Clickhouse时间日期函数一文详解+代码展示

Clickhouse是一个面向联机分析处理(OLAP)的开源的面向列式存储的DBMS,简称CK, 与Hadoop, Spark相比,ClickHouse很轻量级,由俄罗斯第一大搜索引擎Yandex于2016年6月发布, 开发语言为C++。主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。时间在数据库中经常作为时间索引,在数据入库和出库以及更新的时候都需要变化。在一些指标计算或者是提取某段时间的数据时,都会根据数据库中的时间索引数据进行操作。因此很大一部分我们操作数据都得先从时间数

master_hunter的博客 3万+

C#时间戳计算公式、毫秒级时间戳

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。 时间戳转换的网址一大把,百度随便搜一下就有,比如: http://tool.chinaz.com/Tools/unixtime.aspx C#或者Java定义时间戳,如下: private string GetTimeStamp() { TimeSpan ts = DateTime.UtcNow - new DateTime(1970,

qq_42782011的博客 4724

ClickHouse之建表优化和底层语法优化(谓词下推等)

一 建表优化 1 数据类型 1.1 时间字段的类型 1.2 空值存储类型 2 分区和索引 3 表参数 4 写入和删除优化 5 常见配置 5.1 CPU 资源 5.2 内存资源 5.3 存储 二 CK底层语法优化 1 count优化 2消除子查询重复字段 3 谓词下推 4 聚合计算外推 5 聚合函数消除 6 删除重复的 order by key 7 删除重复的 limit by key 8 删除重复的 USING Key 9 标量替换 10 三元运算优化

致力于不留技术债务cuizb.top 3117
上一篇: 故障分析 | MySQL 无监听端口故障排查
下一篇: 技术分享 | 客户说 insert 慢,我该怎么办
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值