JSONObjectEachRow
| 输入 | 输出 | 别名 |
|---|---|---|
| ✔ | ✔ |
描述
在这种格式中,所有数据都表示为单个 JSON 对象,其中每一行对应该对象的一个独立字段,类似于 JSONEachRow 格式。
示例用法
基本示例
假设有如下 JSON:
要将对象名用作列值,可以使用特殊设置 format_json_object_each_row_column_for_object_name。
该设置的值应设为某一列的名称,该列将在生成的对象中作为每一行的 JSON 键名。
输出
假设我们有一张名为 test 的表,其中包含两列:
我们将它输出为 JSONObjectEachRow 格式,并使用 format_json_object_each_row_column_for_object_name 设置:
输入
假设我们将上一个示例的输出保存到名为 data.json 的文件中:
同样适用于模式推断:
写入数据
ClickHouse 允许:
- 对象中的键值对可以以任意顺序出现。
- 省略某些值。
ClickHouse 会忽略元素之间的空格以及对象后面的逗号。可以在同一行中传递所有对象,无需使用换行符将它们分隔开。
省略值的处理
ClickHouse 会使用相应数据类型的默认值来替换被省略的值。
如果指定了 DEFAULT expr,ClickHouse 会根据 input_format_defaults_for_omitted_fields 设置采用不同的替换规则。
考虑下列表:
- 如果
input_format_defaults_for_omitted_fields = 0,则x和a的默认值为0(即UInt32数据类型的默认值)。 - 如果
input_format_defaults_for_omitted_fields = 1,则x的默认值为0,但a的默认值为x * 2。
在使用 input_format_defaults_for_omitted_fields = 1 插入数据时,相比使用 input_format_defaults_for_omitted_fields = 0 插入,ClickHouse 会消耗更多计算资源。
查询数据
以 UserActivity 表为例:
查询 SELECT * FROM UserActivity FORMAT JSONEachRow 将返回:
与 JSON 格式不同,这里不会对无效的 UTF-8 序列进行替换。值的转义方式与 JSON 相同。
字符串中可以输出任意字节序列。如果确定表中的数据可以在不丢失任何信息的情况下被格式化为 JSON,请使用 JSONEachRow 格式。
嵌套结构的使用
如果有一张带有 Nested 数据类型列的表,就可以插入具有相同结构的 JSON 数据。通过 input_format_import_nested_json 设置启用此功能。
例如,考虑以下数据表:
正如您在 Nested 数据类型的说明中所看到的,ClickHouse 将嵌套结构的每个组件视为单独的一列(在我们的表中为 n.s 和 n.i)。您可以通过以下方式插入数据:
要将数据作为层级 JSON 对象插入,请设置 input_format_import_nested_json=1。
如果未进行此设置,ClickHouse 会抛出异常。