首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ClickHouse:如何正确地存储JSON数据?

ClickHouse:如何正确地存储JSON数据?
EN

Stack Overflow用户
提问于 2020-09-30 06:19:26
回答 2查看 10.9K关注 0票数 8

我将把数据从PostgreSQL数据库迁移到Yandex的ClickHouse。源表中的一个字段是名为additional_data的JSON类型。因此,PostgreSQL允许在使用->>->等进行SELECT ...查询时访问json属性

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

下面是我在CREATE TABLE ...期间在ClickHouse客户机中所做的工作:

代码语言:javascript
复制
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,然后使用特殊功能来处理它

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-30 07:51:19

  1. 尽管ClickHouse使用快速JSON库(如辛德逊速成)进行解析,但我认为嵌套字段应该更快。
  2. 如果JSON结构是固定的或可预测的更改,请考虑数据去错化的方式:
代码语言:javascript
复制
..
    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)
..

一方面,它可以显着地增加行数和磁盘空间,另一方面,它应该会显著提高性能(特别是在正确的索引中)。此外,使用低基数型编解码器可以减小磁盘大小。

  1. 其他一些评论:
代码语言:javascript
复制
..
ORDER BY (created_at, uuid);
  • 考虑使用聚合引擎显着地提高计算聚合值的速度
  1. 无论如何,在做出最后决定之前,需要对数据子集进行手动测试(这适用于选择模式(json作为字符串/嵌套类型/非规范化方式),用于选择列编解码器)。
票数 10
EN

Stack Overflow用户

发布于 2022-04-17 01:01:24

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64131915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档