art*_*ski 5 sql yandex yandex-metrika clickhouse
我要将数据从 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;
Run Code Online (Sandbox Code Playgroud)
这是如何存储 JSON 可序列化数据的好选择?有任何想法吗?
也许最好将 JSON 数据存储为普通数据,String
而不是Nested
使用特殊函数来处理它?
虽然 ClickHouse 使用快速 JSON 库(例如simdjson和rapidjson)来解析,但我认为嵌套字段应该更快。
如果 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)
..
Run Code Online (Sandbox Code Playgroud)
一方面,它可以显着增加行数和磁盘空间,另一方面,它应该显着提高性能(尤其是在正确的索引中)。此外,可以使用LowCardinality-type和Codecs减小磁盘大小。
避免使用 Nullable 类型,更喜欢使用一些替换,例如 ''、0 等(参见说明Clickhouse string field disk usage: null vs empty)
UUID 类型不给索引单调性,这个应该好得多(ClickHouse 查询性能的更多秘密):
..
ORDER BY (created_at, uuid);
Run Code Online (Sandbox Code Playgroud)