ClickHouse 官方文档:处理 JSON 数据 (1/2)
ClickHouse 提供了多种处理 JSON 的方法,每种方法都有其优缺点和适用场景。在本指南中,我们将介绍如何加载 JSON 并优化架构设计。本指南包括以下内容:
本节假设 JSON 数据采用 NDJSON(换行分隔的 JSON,Newline delimited JSON)格式,在 ClickHouse 中称为 JSONEachRow。这种格式因其简洁性和高效的空间利用率而成为加载 JSON 的首选,但 ClickHouse 同样支持其他格式的输入和输出。 以下示例展示了一行来自 Python PyPI 数据集的 JSON 数据:
要将该 JSON 对象加载到 ClickHouse 中,需要先定义表架构。以下是一个简单的架构示例,其中 JSON 的键被映射为表的列名:
ClickHouse 支持以多种格式加载 JSON 数据,并能根据文件扩展名和内容自动推断其类型。以下示例中,我们通过 S3 函数读取了与上述表对应的 JSON 文件:
注意,这里无需显式指定文件格式。我们通过通配模式读取桶中的所有 *.json.gz 文件,ClickHouse 会根据文件扩展名和内容自动识别格式为 JSONEachRow(ndjson)。如果格式无法自动识别,可以通过参数函数手动指定。
要加载这些文件中的数据行,可以使用 INSERT INTO SELECT:
数据行也可以通过 FORMAT 子句直接加载,例如:
以上示例假设使用 JSONEachRow 格式。ClickHouse 还支持其他常见的 JSON 格式,其加载方法请参考相关示例。【https://clickhouse.com/docs/en/integrations/data-formats/json/other-formats】 上述内容展示了加载 JSON 数据的基础方法。对于更复杂的 JSON 数据结构(如嵌套结构),请参考“设计 JSON 架构”指南。【https://clickhouse.com/docs/en/integrations/data-formats/json/schema】 ClickHouse 支持自动推断 JSON 数据的结构。这一功能允许直接查询 JSON 数据,例如使用 clickhouse-local 查询磁盘数据,或查询存储在 S3 存储桶中的数据。此外,还可以在数据加载到 ClickHouse 之前自动生成表架构。 适用场景
类型检测 在之前的示例中,我们使用了 NDJSON 格式的 Python PyPI 数据集的简单版本。本节将探索一个更复杂的数据集——arXiv 数据集。该数据集包含约 250 万篇学术论文,以 NDJSON 格式分发,每一行代表一篇已发表的学术论文。以下为其中一行示例:
该数据集需要更复杂的架构设计。以下将概述定义此架构的过程,并介绍如 Tuple 和 Array 等复杂类型。 数据集存储于公共 S3 存储桶,路径为 s3://datasets-documentation/arxiv/arxiv.json.gz。 如示例所示,该数据集包含嵌套的 JSON 对象。尽管用户通常需要设计并版本化架构,但通过类型推断功能,可直接从数据中推断出类型。此功能允许自动生成架构的 DDL,避免手动创建架构,加速开发流程。
通过结合 s3 函数与 DESCRIBE 命令,可查看推断出的数据类型。
系统会自动将大多数列检测为 String 类型,而 update_date 列则正确识别为 Date 类型。versions 列被定义为 Array(Tuple(created String, version String)),用于存储对象列表;authors_parsed 列则为 Array(Array(String)),表示嵌套数组。
通过架构推断查询 JSON 数据 通过架构推断,我们可以直接查询 JSON 数据。以下示例展示了如何利用自动检测的日期和数组字段,统计每年的主要作者。
架构推断使我们无需预先定义架构即可查询 JSON 文件,从而加快临时数据分析的过程。 创建表 通过架构推断,可以自动生成表的架构。以下 CREATE AS EMPTY 命令将推断表的 DDL 并创建表,但不会加载任何数据:
要确认生成的表架构,可以使用 SHOW CREATE TABLE 命令:
以上架构正确匹配数据。架构推断是通过对数据进行采样并逐行读取实现的。列值根据文件格式提取,递归解析器与启发式算法共同确定每个值的类型。在架构推断过程中,读取的最大行数和字节数分别由参数 input_format_max_rows_to_read_for_schema_inference(默认值为 25000)和 input_format_max_bytes_to_read_for_schema_inference(默认值为 32MB)控制。如果推断结果不准确,用户可以参考相关文档提供必要的提示。 从片段创建表 在上述示例中,我们使用了 S3 文件来创建表架构。用户也可以从单行 JSON 数据片段生成表架构。以下为使用 format 函数实现的示例:
|