栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

ClickHouse建表后查询表不存在,同一个查询语句每次查询的结果不一致

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ClickHouse建表后查询表不存在,同一个查询语句每次查询的结果不一致

文章目录
  • 一、在数据停止写入时,同一个查询语句每次查询的结果不一致,应该如何处理?
  • 二、为什么有时看不到已经创建好的表并且查询结果一直抖动时多时少?
  • 三、如何处理往表里写入时间戳数据后查询出来的结果与实际数据不同?
  • 四、如何处理建表后查询表不存在?

一、在数据停止写入时,同一个查询语句每次查询的结果不一致,应该如何处理?
  • 问题描述:
    通过select count(*) 查询数据时只有整体数据的大概一半,或者数据一直在跳变。

  • 解决方案:
    检查是否是多节点集群。多节点集群需要创建分布式表,往分布式表里写入数据并查询,每次查询结果一致。否则每次查询到不同分片的数据,结果不一致。
    如何创建分布式表请参见创建分布式表。

CREATE TABLE [IF NOT EXISTS] [db.]local_table_name ON CLUSTER cluster
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
    INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,
    INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
) ENGINE = engine_name()
[PARTITION BY expr]
[ORDER BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...];

检查是否是多副本集群。多副本集群需要建Replicated系列表引擎的表,才能实现副本间数据同步。否则每次查到不同副本,结果不一致。如何创建Replicated系列表引擎的表请参见表引擎。

二、为什么有时看不到已经创建好的表并且查询结果一直抖动时多时少?

常见原因及解决方案如下。

  • 常见原因1:
    建表流程存在问题。ClickHouse的分布式集群搭建并没有原生的分布式DDL语义。如果您在自建ClickHouse集群时使用create table创建表,查询虽然返回了成功,但实际这个表只在当前连接的Server上创建了。下次连接重置换一个Server,您就看不到这个表了。

  • 解决方案:
    建表时,请使用create table on cluster default语句,on cluster default声明会把这条语句广播给default集群的所有节点进行执行。示例代码如下。
    Create table test on cluster default (a UInt64) Engine = MergeTree() order by tuple();
    在test表上再创建一个分布式表引擎,建表语句如下。
    Create table test_dis on cluster default as test Engine = Distributed(default, default, test, cityHash64(a));

  • 常见原因2:
    ReplicatedMergeTree存储表配置有问题。ReplicatedMergeTree表引擎是对应MergeTree表引擎的主备同步增强版,在单副本实例上限定只能创建MergeTree表引擎,在双副本实例上只能创建ReplicatedMergeTree表引擎。

  • 解决方案:
    在双副本实例上建表时,请使用ReplicatedMergeTree(‘/clickhouse/tables/{database}/{table}/{shard}’, ‘{replica}’)或ReplicatedMergeTree()配置ReplicatedMergeTree表引擎。其中,ReplicatedMergeTree(‘/clickhouse/tables/{database}/{table}/{shard}’, ‘{replica}’)为固定配置,无需修改。

三、如何处理往表里写入时间戳数据后查询出来的结果与实际数据不同?

用SELECT timezone()语句,查看时区是否为当地时区,如果不是修改timezone配置项的值为当地时区。如何修改请参见修改配置项运行参数值。

四、如何处理建表后查询表不存在?
  • 常见原因:
    DDL语句只在一个节点上执行。
  • 解决方案:
    检查DDL语句是否有on cluster关键字。更多信息,请参见建表语法。
暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1016651.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号