Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

JSONObjectEachRow

Entrada Saída Alias

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:

Querysql
SELECT * FROM test SETTINGS format_json_object_each_row_column_for_object_name='object_name'
Responsejson
{
    "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:

Querysql
SELECT * FROM file('data.json', JSONObjectEachRow, 'object_name String, number UInt64') SETTINGS format_json_object_each_row_column_for_object_name='object_name'
Responseresponse
┌─object_name─┬─number─┐
│ first_obj   │      1 │
│ second_obj  │      2 │
│ third_obj   │      3 │
└─────────────┴────────┘

Também funciona para inferência de esquema:

Querysql
DESCRIBE file('data.json', JSONObjectEachRow) SETTING format_json_object_each_row_column_for_object_name='object_name'
Responseresponse
┌─name────────┬─type────────────┐
│ object_name │ String          │
│ number      │ Nullable(Int64) │
└─────────────┴─────────────────┘

Inserção de dados

Querysql
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:

Querysql
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.

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.

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:

Querysql
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:

Querysql
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.

Querysql
SELECT name, value FROM system.settings WHERE name = 'input_format_import_nested_json'
Responseresponse
┌─name────────────────────────────┬─value─┐
│ input_format_import_nested_json │ 0     │
└─────────────────────────────────┴───────┘
Querysql
INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n": {"s": ["abc", "def"], "i": [1, 23]}}
Responseresponse
Code: 117. DB::Exception: Unknown field found while parsing JSONEachRow format: n: (at row 1)
Querysql
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
Responseresponse
┌─n.s───────────┬─n.i────┐
│ ['abc','def'] │ [1,23] │
└───────────────┴────────┘

Configurações de formato

Configuração Descrição Padrão Observações
input_format_import_nested_json mapeia dados JSON aninhados para tabelas aninhadas (funciona com o formato JSONEachRow). false
input_format_json_read_bools_as_numbers permite interpretar valores Bool como números em formatos de entrada JSON. true
input_format_json_read_bools_as_strings permite interpretar Bool como String em formatos de entrada JSON. true
input_format_json_read_numbers_as_strings permite interpretar números como strings em formatos de entrada JSON. true
input_format_json_read_arrays_as_strings permite interpretar arrays JSON como strings em formatos de entrada JSON. true
input_format_json_read_objects_as_strings permite interpretar objetos JSON como strings em formatos de entrada JSON. true
input_format_json_named_tuples_as_objects interpreta colunas de tupla nomeada como objetos JSON. true
input_format_json_try_infer_numbers_from_strings tenta inferir números a partir de campo do tipo string durante a inferência de esquema. false
input_format_json_try_infer_named_tuples_from_objects tentar inferir uma tupla nomeada a partir de objetos JSON durante a inferência de esquema. true
input_format_json_infer_incomplete_types_as_strings usar o tipo String para chaves que contenham 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_tuple inserir valores padrão para elementos ausentes em um objeto JSON ao analisar uma tupla nomeada. true
input_format_json_ignore_unknown_keys_in_named_tuple ignora chaves desconhecidas em objeto JSON para tuplas nomeadas. false
input_format_json_compact_allow_variable_number_of_columns permite 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_sequence gera 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_default trata 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_integers controla a delimitação de inteiros de 64 bits no formato de saída JSON. true
output_format_json_quote_64bit_floats controla a delimitação de números de ponto flutuante de 64 bits no formato de saída JSON. false
output_format_json_quote_denormals habilita as saídas '+nan', '-nan', '+inf', '-inf' no formato de saída JSON. false
output_format_json_quote_decimals controla a delimitação de decimais no formato de saída JSON. false
output_format_json_escape_forward_slashes controla o escape de barras (/) em saídas de string no formato de saída JSON. true
output_format_json_named_tuples_as_objects serializa colunas de tupla nomeada como objetos JSON. true
output_format_json_array_of_rows gera um array JSON com todas as linhas no formato JSONEachRow(Compact). false
output_format_json_validate_utf8 habilita 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
Navigation