【问题标题】:ClickHouse: How to store JSON data the right way?ClickHouse:如何正确存储 JSON 数据?
【发布时间】:2021-01-15 18:59:34
【问题描述】:

我要将数据从 PostgreSQL 数据库迁移到 Yandex 的 ClickHouse。 源表中的字段之一是 JSON 类型 - 称为 additional_data。因此,PostgreSQL 允许我 在例如访问 json 属性 SELECT ... 查询 ->>-> 等等。

我需要在 ClickHouse 存储中的结果表中坚持相同的行为。 (即在选择查询和/或使用过滤和聚合子句时解析 JSON 的能力)

这是我在 ClickHouse 客户端 CREATE TABLE ... 期间所做的:

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 并使用 special functions 玩它更好?

【问题讨论】:

  • json-document的结构是固定不变的吗?
  • @vladimir 将来可以用一些新属性进行更改。

标签: sql clickhouse yandex yandex-metrika


【解决方案1】:
  1. 虽然 ClickHouse 使用快速 JSON 库(例如 simdjsonrapidjson)进行解析,但我认为 Nesting-fields 应该更快。

  2. 如果 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-typeCodecs 可以减小磁盘大小。

  1. 其他一些评论:
..
ORDER BY (created_at, uuid);
  1. 在任何情况下,在做出最终决定之前都需要对数据子集进行手动测试(这适用于选择架构(json 作为字符串/嵌套类型/非规范化方式),作为选择列编解码器)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 2019-04-30
    • 1970-01-01
    相关资源
    最近更新 更多