标签: clickhouse

为什么在 ClickHouse 表中不鼓励浮点表示?

文档Float32并没有真正解释 的行为Float64以及不鼓励它们的原因。

我问这个问题是因为在将这些与控制台 cli 请求或 Rest 请求一起使用时,我看到了奇怪的行为。无论精度如何,发送到 clickhouse 的浮点值在最后一位都会稍微修改。

示例:1258.021545成为1258.0215453.

每次插入这些值时,最后一位数字都会更改。我不认为问题来自太高的精度值,因为这些值来自 Java 双精度数。

floating-point decimal-point clickhouse

5
推荐指数
1
解决办法
2598
查看次数

ClickHouse Kafka效果

遵循文档中的示例:https : //clickhouse.yandex/docs/en/table_engines/kafka/

我使用Kafka Engine和一个实例化视图创建了一个表,该视图将数据推送到MergeTree表。

这是我的表格结构:

CREATE TABLE games (
    UserId UInt32,
    ActivityType UInt8,
    Amount Float32,
    CurrencyId UInt8,
    Date String
  ) ENGINE = Kafka('XXXX.eu-west-1.compute.amazonaws.com:9092,XXXX.eu-west-1.compute.amazonaws.com:9092,XXXX.eu-west-1.compute.amazonaws.com:9092', 'games', 'click-1', 'JSONEachRow', '3');


CREATE TABLE tests.games_transactions (
    day Date,
    UserId UInt32,
    Amount Float32,
    CurrencyId UInt8,
    timevalue DateTime,
    ActivityType UInt8
 ) ENGINE = MergeTree(day, (day, UserId), 8192);


  CREATE MATERIALIZED VIEW tests.games_consumer TO tests.games_transactions
    AS SELECT toDate(replaceRegexpOne(Date,'\\..*','')) as day, UserId, Amount, CurrencyId, toDateTime(replaceRegexpOne(Date,'\\..*','')) as timevalue, ActivityType
    FROM default.games;
Run Code Online (Sandbox Code Playgroud)

在Kafka主题中,我每秒收到约150条消息。

一切都很好,部分原因是表中的数据更新有很大的延迟,这绝对不是实时的。

似乎只有当我到达65536个 …

apache-kafka clickhouse

5
推荐指数
1
解决办法
2377
查看次数

Clickhouse:如何在clickhouse SQL中查找索引字段?

我在 ClickHouse 中有现有的表。我想找出哪个字段是索引字段。我该怎么做?

sql indexing clickhouse

5
推荐指数
1
解决办法
6457
查看次数

ClickHouse 中按组排列的前 N ​​行

在 ClickHouse 中按组查询前 N 行的正确方法是什么?
让我们以具有 id2、id4、v3 列且 N=2 的 tbl 为例。我尝试了以下方法

SELECT                                                                          
    id2,                                                                        
    id4,                 
    v3 AS v3        
FROM tbl
GROUP BY                 
    id2,                 
    id4                  
ORDER BY v3 DESC                                                                
LIMIT 2 BY                       
    id2,                 
    id4      
Run Code Online (Sandbox Code Playgroud)

但出现错误

Received exception from server (version 19.3.4):
Code: 215. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception
: Column v3 is not under aggregate function and not in GROUP BY..
Run Code Online (Sandbox Code Playgroud)

我可以放入v3GROUP BY ,它似乎确实有效,但按指标分组效率不高。

any聚合函数,但我们实际上想要all值(通过 LIMIT BY 子句限制为 2)而不是any值,所以这听起来不是正确的解决方案。

Received exception from …
Run Code Online (Sandbox Code Playgroud)

greatest-n-per-group clickhouse

5
推荐指数
1
解决办法
2万
查看次数

Clickhouse 从 csv DB::NetException 导入数据:写入套接字时,连接被对等方重置

我正在尝试通过以下方式将 *.gz 文件加载到 Clickhouse:clickhouse-client --max_memory_usage=15323460608 --format_csv_delimiter="|" --query="插入 tmp1.my_test)表格式 CSV"

我收到错误: Code: 210. DB::NetException: Connection Reset by Peer, while写入套接字 (127.0.0.1:9000) 。

clickhouse-server.log 、 clickhouse-server.err.log 或 Zookeeper.log 中没有错误

当我运行插入命令时,我看到内存几乎达到了服务器的限制(32Gb),这就是为什么我尝试通过 max_memory_usage 限制它,同样的错误

有任何想法吗?提前致谢

clickhouse

5
推荐指数
1
解决办法
3177
查看次数

如何知道数据何时插入clickhouse

我明白 clickhouse 最终是一致的。因此,一旦插入调用返回,并不意味着数据将出现在选择查询中。

  1. 这是否适用于独立的 clickhouse(无分发,无复制)?
  2. 我了解数据复制的最终一致性概念,但它是否适用于分发但不适用于复制?
  3. 使用分布式+复制的clickhouse,推荐的方法是什么来知道可以安全地查找某些插入?

基本上我没有找到关于这个主题的太多信息,所以也许我没有提出最好的问题。请随时启发我。

eventual-consistency clickhouse

5
推荐指数
1
解决办法
2006
查看次数

Clickhouse:通过pandas dataframe插入数据且单元格值为null时如何取列的默认值

我正在尝试将 Pandas 数据框插入 Clickhouse,但遇到了一些问题。\n以下是表架构:

\n
CREATE TABLE IF NOT EXISTS test_table\n(\n    name String,\n    day DateTime64(3) DEFAULT \'2020-07-01 00:00:00\',\n)\nengine = MergeTree\nORDER BY (name, day);\n
Run Code Online (Sandbox Code Playgroud)\n

pandas dataframe 中的数据如下:

\n
   name   day\n0  \'a\'    NaT\n1  \'b\'    NaT\n2  \'c\'   \'2019-08-31 00:00:00\'\n
Run Code Online (Sandbox Code Playgroud)\n

插入的python代码是:

\n
from clickhouse_driver import Client\nwith Client(host="", port="", password="",\n            user="", settings={"use_numpy": True}) as client:\n    client.insert_dataframe(\n        \'INSERT INTO test_table VALUES\',\n        df)\n
Run Code Online (Sandbox Code Playgroud)\n

clickhouse中的结果是

\n
SELECT *\nFROM test_table\n\n\xe2\x94\x8c\xe2\x94\x80name\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80day\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 a    \xe2\x94\x82 1970-01-01 00:00:00.000\xe2\x94\x82\n\xe2\x94\x82 b    \xe2\x94\x82 1970-01-01 00:00:00.000\xe2\x94\x82\n\xe2\x94\x82 c    \xe2\x94\x82 2019-08-31 00:00:00.000\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n
Run Code Online (Sandbox Code Playgroud)\n

但我真正想要的是它是默认值,意味着 \'1970-01-01 00:00:00.000\' …

database dataframe pandas clickhouse clickhouse-client

5
推荐指数
1
解决办法
2603
查看次数

Clickhouse分布式表节点停止接受TCP连接

Clickhouse版本:(版本20.3.9.70(官方版本))\n(我知道不再支持此功能,我们有计划升级,但需要时间)

\n

设置

\n

我们正在运行三个查询节点(仅具有分布式表的节点),我们昨天启动了第三个。所有节点都指向相同的存储节点和表。

\n

问题

\n

该节点可以通过 TCP 和 HTTP 正常处理请求长达 11 小时。之后,clickhouse服务器开始关闭TCP连接。当这种情况发生时,HTTP 仍然可以正常工作。

\n

额外信息/证据

\n
    \n
  • system.metrics.tcp_connection随着时间的推移,新节点的数量稳步下降。
  • \n
\n

system.metrics.tcp_connection 随着时间的推移逐渐减少

\n
    \n
  • netstat显示大量 ACTIVE_WAIT 连接
  • \n
\n
netstat -ntp | tail -n+3 | awk \'{print $6}\' | sort | uniq -c | sort -n\n      2 LAST_ACK\n    380 CLOSE_WAIT\n    386 ESTABLISHED\n  29279 TIME_WAIT\n
Run Code Online (Sandbox Code Playgroud)\n

用于比较的普通节点:

\n
1199 CLOSE_WAIT\n1292 ESTABLISHED\n186 TIME_WAIT\n
Run Code Online (Sandbox Code Playgroud)\n

无法打开 clickhouse_client

\n
user@server:~$ clickhouse-client \nClickHouse client version 20.3.9.70 (official build).\nConnecting to localhost:9000 as user …
Run Code Online (Sandbox Code Playgroud)

netstat tcp clickhouse

5
推荐指数
0
解决办法
1600
查看次数

如何使用 clickhouse-driver (python) 从字典/名称元组中的 Clickhouse 获取数据?

当我们使用 DB API 2.0 获取数据时,cur.execute("select * from db.table")我们会得到一个游标,它看起来像元组列表的生成器对象。

而在 pymongo 中,当我们获取时,我们将其作为字典列表获取。我想实现这样的目标。

我不需要获取元组列表,而是想要字典列表或命名元组。

我相信从效率的角度来看这是有意义的,因为模式已经定义,所以不需要为每条记录发送它。

目前我正在使用的解决方法是:

cur.execute("select * from db.table")
columns = cur.columns_with_types
data = cur.fetchall()
df = pd.DataFrame(data,columns=[tuple[0] for tuple in columns])
data_reqd = df.to_dict('records')
Run Code Online (Sandbox Code Playgroud)

当查询返回大量数据时,此方法的公平性很差。

解决方法 1:使用fetchmany(size=block_size),但它似乎不是一种优雅的做事方式。

解决方法 2:这似乎是一种更好的处理方式。

cur.execute("select * from db.table")
columns = cur.columns_with_types
for tup in cur:
     row = dict(zip(columns, tup))
    # use row

Run Code Online (Sandbox Code Playgroud)

有什么好的办法处理这个问题吗?对问题的任何改进表示赞赏。

python memory-efficient python-db-api clickhouse

5
推荐指数
1
解决办法
2350
查看次数

如何删除SQL(Clickhouse)中的重复行?

所以我使用 clickhouse 创建了一个表,但其中有重复项。

以下查询给出了表中的重复项

select *, count() AS cnt from my_table   GROUP BY *
HAVING cnt > 1 
Run Code Online (Sandbox Code Playgroud)

在 clickhouse 中,显然你需要通过更改表来做到这一点:https ://clickhouse.com/docs/en/sql-reference/statements/alter/delete/

所以,我尝试了以下方法:

ALTER TABLE my_table DELETE WHERE (select *, count() AS cnt from my_table  GROUP BY *
HAVING cnt > 1 ); 
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

Exception: The argument of function isZeroOrNull must have simple numeric type, possibly Nullable:

有人在使用 clickhouse 之前遇到过这个问题吗?

在此视频中,他们明确提到 clickhouse 并不是此类操作的最佳选择:https://www.youtube.com/watch?v= FsVrFbcyb84&t=1865s

但我想知道是否有人找到了解决方案

sql database delete-row clickhouse

5
推荐指数
1
解决办法
8026
查看次数