加载结构化 JSON
NDJSON (换行符分隔的 JSON) 格式,即 ClickHouse 中的 JSONEachRow 格式,且结构规整,即列名和类型固定不变。NDJSON 因其简洁性和高效的空间利用率,是加载 JSON 的首选格式,但系统同样支持其他格式用于输入和输出。
请参考以下 JSON 样本,该样本代表 Python PyPI dataset 中的一行数据:
尽可能优先使用静态 schema如果你的列名和类型都是固定的,且预计不会新增列,那么在生产环境中应始终优先使用静态定义的 schema。对于动态性很高的数据,JSON type 是首选,因为列名和类型可能会发生变化。这种类型在原型设计和数据探索中也很有用。
排序键这里我们通过
ORDER BY 子句指定了一个排序键。有关排序键及其选择方法的更多信息,请参见此处。*.json.gz 文件,ClickHouse 会根据文件扩展名和内容自动推断格式为 JSONEachRow (ndjson) 。若 ClickHouse 无法自动检测格式,可通过参数函数手动指定。
压缩文件上述文件也可以是压缩文件。ClickHouse 会自动检测并处理。
INSERT INTO SELECT:
FORMAT 子句 以内联方式加载行,例如:
JSONEachRow 格式。也支持其他常见的 JSON 格式,相关加载示例见此处。
加载半结构化 JSON
JSON 类型来处理这种情况。
请看下面这个示例,它基于上述 Python PyPI dataset 的扩展版本。这里我们添加了一个任意的 tags 列,其中包含随机的键值对。
tags 列内容不固定,因此无法对其建模。要加载这些数据,我们可以沿用之前的 schema,但额外提供一个类型为 JSON 的 tags 列:
何时使用 JSON 类型
- 键不可预知,并且会随时间发生变化。
- 包含类型不固定的值 (例如,一个 path 有时可能是字符串,有时可能是数值) 。
- 需要灵活的 schema,而严格类型并不适用。
- 键已知的扁平结构:使用标准列类型,例如 String。
- 可预测的嵌套结构:对此类结构使用 Tuple、Array 或 Nested 类型。
- 结构可预测但类型会变化:请考虑改用 Dynamic 或 Variant 类型。