Pular para o conteúdo principal
EntradaSaídaAlias

Descrição

Neste formato, todos os dados são representados como um único objeto JSON, com cada linha representada como um campo separado desse objeto, de maneira semelhante ao formato JSONEachRow.

Exemplo de uso

Exemplo básico

Dado o seguinte JSON:
{
  "row_1": {"num": 42, "str": "hello", "arr":  [0,1]},
  "row_2": {"num": 43, "str": "hello", "arr":  [0,1,2]},
  "row_3": {"num": 44, "str": "hello", "arr":  [0,1,2,3]}
}
Para usar um nome de objeto como valor de uma coluna, você pode usar a configuração especial format_json_object_each_row_column_for_object_name. O valor dessa configuração é definido como o nome de uma coluna, usada como chave JSON de uma linha no objeto resultante.

Saída

Digamos que temos a tabela test com duas colunas:
┌─object_name─┬─number─┐
│ first_obj   │      1 │
│ second_obj  │      2 │
│ third_obj   │      3 │
└─────────────┴────────┘
Vamos gerar a saída no formato JSONObjectEachRow e usar a configuração format_json_object_each_row_column_for_object_name:
Query
SELECT * FROM test SETTINGS format_json_object_each_row_column_for_object_name='object_name'
Response
{
    "first_obj": {"number": 1},
    "second_obj": {"number": 2},
    "third_obj": {"number": 3}
}

Entrada

Digamos que armazenamos a saída do exemplo anterior em um arquivo chamado data.json:
Query
SELECT * FROM file('data.json', JSONObjectEachRow, 'object_name String, number UInt64') SETTINGS format_json_object_each_row_column_for_object_name='object_name'
Response
┌─object_name─┬─number─┐
│ first_obj   │      1 │
│ second_obj  │      2 │
│ third_obj   │      3 │
└─────────────┴────────┘
Também funciona para inferência de esquema:
Query
DESCRIBE file('data.json', JSONObjectEachRow) SETTING format_json_object_each_row_column_for_object_name='object_name'
Response
┌─name────────┬─type────────────┐
│ object_name │ String          │
│ number      │ Nullable(Int64) │
└─────────────┴─────────────────┘

Inserção de dados

Query
INSERT INTO UserActivity FORMAT JSONEachRow {"PageViews":5, "UserID":"4324182021466249494", "Duration":146,"Sign":-1} {"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1}
O ClickHouse permite:
  • Qualquer ordem dos pares chave-valor no objeto.
  • Omitir alguns valores.
O ClickHouse ignora os espaços entre os elementos e as vírgulas após os objetos. Você pode passar todos os objetos em uma única linha. Não é necessário separá-los com quebras de linha.

Processamento de valores omitidos

O ClickHouse substitui os valores omitidos pelos valores padrão dos tipos de dados correspondentes. Se DEFAULT expr for especificado, o ClickHouse usará regras de substituição diferentes, dependendo da configuração input_format_defaults_for_omitted_fields. Considere a tabela a seguir:
Query
CREATE TABLE IF NOT EXISTS example_table
(
    x UInt32,
    a DEFAULT x * 2
) ENGINE = Memory;
  • Se input_format_defaults_for_omitted_fields = 0, o valor padrão de x e a é 0 (o valor padrão do tipo de dado UInt32).
  • Se input_format_defaults_for_omitted_fields = 1, o valor padrão de x é 0, mas o valor padrão de a é x * 2.
Ao inserir dados com input_format_defaults_for_omitted_fields = 1, o ClickHouse consome mais recursos computacionais do que na inserção com input_format_defaults_for_omitted_fields = 0.

Selecionando dados

Considere a tabela UserActivity como um exemplo:
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐
│ 4324182021466249494 │         5 │      146 │   -1 │
│ 4324182021466249494 │         6 │      185 │    1 │
└─────────────────────┴───────────┴──────────┴──────┘
A consulta SELECT * FROM UserActivity FORMAT JSONEachRow retorna:
{"UserID":"4324182021466249494","PageViews":5,"Duration":146,"Sign":-1}
{"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1}
Ao contrário do formato JSON, não há substituição de sequências UTF-8 inválidas. Os valores são escapados da mesma forma que no JSON.
Qualquer conjunto de bytes pode ser emitido nas strings. Use o formato JSONEachRow se tiver certeza de que os dados da tabela podem ser formatados como JSON sem perda de informação.

Uso de estruturas aninhadas

Se você tiver uma tabela com colunas do tipo de dado Nested, poderá inserir dados JSON com a mesma estrutura. Ative esse recurso com a configuração input_format_import_nested_json. Por exemplo, considere a seguinte tabela:
Query
CREATE TABLE json_each_row_nested (n Nested (s String, i Int32) ) ENGINE = Memory
Como você pode ver na descrição do tipo de dado Nested, o ClickHouse trata cada componente da estrutura aninhada como uma coluna separada (n.s e n.i na nossa tabela). Você pode inserir os dados da seguinte forma:
Query
INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n.s": ["abc", "def"], "n.i": [1, 23]}
Para inserir dados como um objeto JSON hierárquico, defina input_format_import_nested_json=1.
{
    "n": {
        "s": ["abc", "def"],
        "i": [1, 23]
    }
}
Sem essa configuração, ClickHouse lança uma exceção.
Query
SELECT name, value FROM system.settings WHERE name = 'input_format_import_nested_json'
Response
┌─name────────────────────────────┬─value─┐
│ input_format_import_nested_json │ 0     │
└─────────────────────────────────┴───────┘
Query
INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n": {"s": ["abc", "def"], "i": [1, 23]}}
Response
Code: 117. DB::Exception: Unknown field found while parsing JSONEachRow format: n: (at row 1)
Query
SET input_format_import_nested_json=1
INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n": {"s": ["abc", "def"], "i": [1, 23]}}
SELECT * FROM json_each_row_nested
Response
┌─n.s───────────┬─n.i────┐
│ ['abc','def'] │ [1,23] │
└───────────────┴────────┘

Configurações de formato

ConfiguraçãoDescriçãoPadrãoObservações
input_format_import_nested_jsonmapeia dados JSON aninhados para tabelas aninhadas (funciona com o formato JSONEachRow).false
input_format_json_read_bools_as_numberspermite analisar valores booleanos como números em formatos de entrada JSON.true
input_format_json_read_bools_as_stringspermite interpretar bools como strings em formatos de entrada JSON.true
input_format_json_read_numbers_as_stringspermite interpretar números como strings em formatos de entrada JSON.true
input_format_json_read_arrays_as_stringspermite interpretar arrays JSON como strings em formatos de entrada JSON.true
input_format_json_read_objects_as_stringspermite interpretar objetos JSON como strings em formatos de entrada JSON.true
input_format_json_named_tuples_as_objectsanalisa colunas de tupla nomeada como objetos JSON.true
input_format_json_try_infer_numbers_from_stringstenta inferir números a partir de campos string durante a inferência de esquema.false
input_format_json_try_infer_named_tuples_from_objectstenta inferir tuplas nomeadas a partir de objetos JSON durante a inferência de esquema.true
input_format_json_infer_incomplete_types_as_stringsusar o tipo String para chaves que contêm apenas NULLs ou objetos/arrays vazios durante a inferência de esquema em formatos de entrada JSON.true
input_format_json_defaults_for_missing_elements_in_named_tupleinserir valores padrão para elementos ausentes em objeto JSON durante a análise de tupla nomeada.true
input_format_json_ignore_unknown_keys_in_named_tupleignorar chaves desconhecidas em objeto JSON para tuplas nomeadas.false
input_format_json_compact_allow_variable_number_of_columnspermite um número variável de colunas no formato JSONCompact/JSONCompactEachRow, ignora colunas extras e usa valores padrão para colunas ausentes.false
input_format_json_throw_on_bad_escape_sequencegera uma exceção se a string JSON contiver uma sequência de escape inválida. Se desabilitado, as sequências de escape inválidas permanecerão como estão nos dados.true
input_format_json_empty_as_defaulttrata campos vazios na entrada JSON como valores padrão.false.Para expressões padrão complexas, input_format_defaults_for_omitted_fields também precisa estar habilitado.
output_format_json_quote_64bit_integerscontrola o uso de aspas em inteiros de 64 bits no formato de saída JSON.true
output_format_json_quote_64bit_floatscontrola o uso de aspas em números de ponto flutuante de 64 bits no formato de saída JSON.false
output_format_json_quote_denormalshabilita as saídas ‘+nan’, ‘-nan’, ‘+inf’ e ‘-inf’ no formato de saída JSON.false
output_format_json_quote_decimalscontrola o uso de aspas em valores decimais no formato de saída JSON.false
output_format_json_escape_forward_slashescontrola o escape de barras normais em saídas de String no formato de saída JSON.true
output_format_json_named_tuples_as_objectsserializa colunas de named tuple como objetos JSON.true
output_format_json_array_of_rowsgera um array JSON de todas as linhas no formato JSONEachRow(Compact).false
output_format_json_validate_utf8habilita a validação de sequências UTF-8 nos formatos de saída JSON (observe que isso não afeta os formatos JSON/JSONCompact/JSONColumnsWithMetadata, que sempre validam UTF-8).false
Última modificação em 10 de junho de 2026