sql - ClickHouse:如何正确存储 JSON 数据?
问题描述
我打算将数据从 PostgreSQL 数据库迁移到 Yandex 的 ClickHouse。源表中的字段之一是 JSON 类型 - 称为additional_data
. 因此,PostgreSQL 允许我在查询等期间访问 json 属性。SELECT ...
->>
->
我需要相同的行为才能保留在 ClickHouse 存储中的结果表中。(即在选择查询和/或使用过滤和聚合子句时解析 JSON 的能力)
这是我CREATE TABLE ...
在 ClickHouse 客户端中所做的事情:
create table if not exists analytics.events
(
uuid UUID,
...,
created_at DateTime,
updated_at DateTime,
additional_data Nested (
message Nullable(String),
eventValue Nullable(String),
rating Nullable(String),
focalLength Nullable(Float64)
)
)
engine = MergeTree
ORDER BY (uuid, created_at)
PRIMARY KEY uuid;
如何存储 JSON 可序列化数据是一个不错的选择吗?有任何想法吗?
也许最好将 JSON 数据存储为普通数据,String
而不是Nested
使用特殊功能来使用它?
解决方案
虽然 ClickHouse 使用快速 JSON 库(例如simdjson和rapidjson)进行解析,但我认为 Nesting-fields 应该更快。
如果 JSON 结构是固定的或可预测地更改,请尝试考虑非规范化数据的方式:
..
created_at DateTime,
updated_at DateTime,
additional_data_message Nullable(String),
additional_data_eventValue Nullable(String),
additional_data_rating Nullable(String),
additional_data_focalLength Nullable(Float64)
..
一方面,它可以显着增加行数和磁盘空间,另一方面,它应该显着提高性能(尤其是在正确的索引中)。此外,可以使用LowCardinality-type和Codecs减小磁盘大小。
- 其他一些评论:
避免使用 Nullable 类型,更喜欢使用一些替换,例如 ''、0 等(参见Clickhouse 字符串字段磁盘用法说明:null vs empty)
UUID 类型不给索引单调性,这个应该会好很多(ClickHouse Query Performance 的更多秘密):
..
ORDER BY (created_at, uuid);
- 考虑使用聚合引擎来显着提高计算聚合值的速度
- 在任何情况下,在做出最终决定之前都需要对数据子集进行手动测试(这适用于选择模式(json 作为字符串/嵌套类型/非规范化方式),作为选择列编解码器)。
推荐阅读
- qml - 使用 MouseArea 更改 StackLayout 项
- ios - 如何使用 Daniel Gindi 的图表库在同一轴上拥有相同类型的图表(即 LineChart)?
- angular - 在终端中运行 ng server --open 命令时出现此错误“events.js 174 throw er; //未处理的'错误'事件”
- python - 如何在 Django 中删除某些用户图像表单数据库?
- java - 当父级不是活动而是片段时为空选项卡
- ios - SwiftUI 从列表项视图中隐藏列表项
- geode - 如何在 FunctionService.onServer() 中获取区域实例
- c - 为什么'wait'函数总是返回-1?
- java - 如何根据函数的输出在@Query 中使用查询字符串
- google-cloud-platform - Cloud Run 对 CLI 的最终用户进行身份验证