跳到主要内容
跳到主要内容

处理其他格式

之前加载 JSON 数据的示例假设使用 JSONEachRow (ndjson)。下面我们提供了在其他常见格式下加载 JSON 的示例。

JSON 对象数组

最常见的 JSON 数据形式之一是将 JSON 对象列表放在 JSON 数组中,如 这个示例

让我们为这种类型的数据创建一个表:

要导入 JSON 对象列表,我们可以使用 JSONEachRow 格式(插入来自 list.json 文件的数据):

我们使用了 FROM INFILE 子句从本地文件加载数据,可以看到导入成功:

处理 NDJSON(行分隔的 JSON)

许多应用程序可以以 JSON 格式记录数据,使得每一行日志都是单独的 JSON 对象,如 这个文件 中所示:

相同的 JSONEachRow 格式可以处理这样的文件:

JSON 对象键

在某些情况下,JSON 对象的列表可以编码为对象属性而不是数组元素(例如,见 objects.json):

ClickHouse 可以使用 JSONObjectEachRow 格式加载这种格式的数据:

指定父对象键值

假设我们还想将父对象键中的值保存到表中。在这种情况下,我们可以使用 以下选项 来定义我们想要保存键值的列名称:

现在,我们可以使用 file() 函数检查将从原始 JSON 文件加载的数据:

注意 id 列已正确填充键值。

JSON 数组

有时,为了节省空间,JSON 文件以数组形式编码而不是对象。这种情况下,我们处理的是一个 JSON 数组列表

在这种情况下,ClickHouse 将加载这些数据,并根据数组中值的位置将每个值归属到对应的列。我们使用 JSONCompactEachRow 格式来处理这个:

从 JSON 数组导入单个列

在某些情况下,数据可以编码为列而不是行为方向。在这种情况下,父 JSON 对象包含列及其值。请查看 以下文件

ClickHouse 使用 JSONColumns 格式解析这种格式化的数据:

当处理 列数组 而不是对象时,较紧凑的格式也可以使用 JSONCompactColumns 格式来支持:

保存 JSON 对象而不是解析

某些情况下,您可能希望将 JSON 对象保存到单个 String (或 JSON)列中,而不是解析它。这在处理具有不同结构的 JSON 对象列表时非常有用。请查看 这个文件,我们有多个不同的 JSON 对象在一个父列表中:

我们希望将原始 JSON 对象保存到以下表中:

现在,我们可以使用 JSONAsString 格式从文件加载数据,以保持 JSON 对象而不是解析它们:

我们可以使用 JSON 函数 查询保存的对象:

注意,JSONAsString 在我们有 JSON 对象按行格式化的文件(通常与 JSONEachRow 格式一起使用)中工作得很好。

嵌套对象的架构

在处理 嵌套 JSON 对象 时,我们可以另外定义架构并使用复杂类型 (ArrayObject Data TypeTuple) 来加载数据:

访问嵌套 JSON 对象

我们可以通过启用 以下设置选项 来引用 嵌套 JSON 键

这使我们能够使用点表示法引用嵌套 JSON 对象键(记得用反引号包裹,以便正常工作):

这样我们可以扁平化嵌套 JSON 对象或者使用一些嵌套值将它们作为单独的列保存。

跳过未知列

默认情况下,ClickHouse 在导入 JSON 数据时会忽略未知列。让我们尝试将原始文件导入到没有 month 列的表中:

我们仍然可以将 原始 JSON 数据 的 3 列插入到这个表中:

ClickHouse 会在导入时忽略未知列。可以使用 input_format_skip_unknown_fields 设置选项禁用此功能:

在 JSON 和表列结构不一致的情况下,ClickHouse 会抛出异常。

BSON

ClickHouse 允许从 BSON 编码的文件中导入和导出数据。此格式被某些数据库管理系统使用,例如 MongoDB 数据库。

要导入 BSON 数据,我们使用 BSONEachRow 格式。让我们从 这个 BSON 文件 导入数据:

我们也可以使用相同的格式导出到 BSON 文件:

之后,我们的数据将导出到 out.bson 文件中。