处理其他格式
之前加载 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 对象 时,我们可以另外定义架构并使用复杂类型 (Array
、Object Data Type
或 Tuple
) 来加载数据:
访问嵌套 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
文件中。