Saltar al contenido principal
EntradaSalidaAlias

Descripción

En este formato, todos los datos se representan como un único objeto JSON, y cada fila se representa como un campo independiente de ese objeto, de forma similar al formato JSONEachRow.

Ejemplo de uso

Ejemplo básico

Dado el siguiente 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 el nombre de un objeto como valor de una columna, puede utilizar la SETTING especial format_json_object_each_row_column_for_object_name. El valor de esta SETTING se establece en el nombre de una columna, que se utiliza como clave JSON para una fila en el objeto resultante.

Resultado

Supongamos que tenemos la tabla test con dos columnas:
┌─object_name─┬─number─┐
│ first_obj   │      1 │
│ second_obj  │      2 │
│ third_obj   │      3 │
└─────────────┴────────┘
Mostremos la salida en el formato JSONObjectEachRow y usemos la SETTING 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

Supongamos que hemos guardado la salida del ejemplo anterior en un archivo llamado 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 │
└─────────────┴────────┘
También funciona para la inferencia 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) │
└─────────────┴─────────────────┘

Insertar datos

Query
INSERT INTO UserActivity FORMAT JSONEachRow {"PageViews":5, "UserID":"4324182021466249494", "Duration":146,"Sign":-1} {"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1}
ClickHouse permite:
  • Cualquier orden de los pares clave-valor dentro del objeto.
  • Omitir algunos valores.
ClickHouse ignora los espacios entre los elementos y las comas después de los objetos. Puede pasar todos los objetos en una sola línea. No es necesario separarlos con saltos de línea.

Procesamiento de los valores omitidos

ClickHouse sustituye los valores omitidos por los valores predeterminados de los tipos de datos correspondientes. Si se especifica DEFAULT expr, ClickHouse aplica reglas de sustitución diferentes según la SETTING input_format_defaults_for_omitted_fields. Considere la siguiente tabla:
Query
CREATE TABLE IF NOT EXISTS example_table
(
    x UInt32,
    a DEFAULT x * 2
) ENGINE = Memory;
  • Si input_format_defaults_for_omitted_fields = 0, el valor predeterminado de x y a es 0 (el valor predeterminado del tipo de dato UInt32).
  • Si input_format_defaults_for_omitted_fields = 1, el valor predeterminado de x es 0, pero el valor predeterminado de a es x * 2.
Al insertar datos con input_format_defaults_for_omitted_fields = 1, ClickHouse consume más recursos de cómputo que con la inserción usando input_format_defaults_for_omitted_fields = 0.

Selección de datos

Considere la tabla UserActivity como ejemplo:
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐
│ 4324182021466249494 │         5 │      146 │   -1 │
│ 4324182021466249494 │         6 │      185 │    1 │
└─────────────────────┴───────────┴──────────┴──────┘
La consulta SELECT * FROM UserActivity FORMAT JSONEachRow devuelve:
{"UserID":"4324182021466249494","PageViews":5,"Duration":146,"Sign":-1}
{"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1}
A diferencia del formato JSON, no se sustituyen las secuencias UTF-8 no válidas. Los valores se escapan del mismo modo que en JSON.
En las cadenas se puede generar cualquier secuencia de bytes. Utilice el formato JSONEachRow si está seguro de que los datos de la tabla pueden representarse como JSON sin perder información.

Uso de estructuras anidadas

Si tiene una tabla con columnas del tipo de dato Nested, puede insertar datos JSON con la misma estructura. Habilite esta función con la SETTING input_format_import_nested_json. Por ejemplo, considere la siguiente tabla:
Query
CREATE TABLE json_each_row_nested (n Nested (s String, i Int32) ) ENGINE = Memory
Como puede ver en la descripción del tipo de dato Nested, ClickHouse trata cada componente de la estructura anidada como una columna independiente (n.s y n.i para nuestra tabla). Puede insertar datos de la siguiente manera:
Query
INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n.s": ["abc", "def"], "n.i": [1, 23]}
Para insertar datos como un objeto JSON jerárquico, establezca input_format_import_nested_json=1.
{
    "n": {
        "s": ["abc", "def"],
        "i": [1, 23]
    }
}
Sin esta SETTING, ClickHouse genera una excepción.
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] │
└───────────────┴────────┘

Configuración de formato

AjusteDescripciónValor predeterminadoNotas
input_format_import_nested_jsonasigna datos JSON anidados a tablas anidadas (funciona con el formato JSONEachRow).false
input_format_json_read_bools_as_numberspermite analizar valores booleanos como números en los formatos de entrada JSON.true
input_format_json_read_bools_as_stringspermitir interpretar valores booleanos como cadenas en formatos de entrada JSON.true
input_format_json_read_numbers_as_stringspermitir interpretar números como cadenas en formatos de entrada JSON.true
input_format_json_read_arrays_as_stringspermitir interpretar arrays JSON como cadenas en formatos de entrada JSON.true
input_format_json_read_objects_as_stringspermitir interpretar objetos JSON como cadenas en formatos de entrada JSON.true
input_format_json_named_tuples_as_objectsanalizar las columnas de tuplas con nombre como objetos JSON.true
input_format_json_try_infer_numbers_from_stringsintentar inferir números a partir de campos de texto durante la inferencia de esquemas.false
input_format_json_try_infer_named_tuples_from_objectsintentar inferir tuplas con nombre a partir de objetos JSON durante la inferencia de esquemas.true
input_format_json_infer_incomplete_types_as_stringsusar el tipo String para las claves que contengan solo valores NULL u objetos/arreglos vacíos durante la inferencia de esquemas en formatos de entrada JSON.true
input_format_json_defaults_for_missing_elements_in_named_tupleinsertar valores predeterminados para los elementos faltantes en un objeto JSON al analizar una tuple con nombre.true
input_format_json_ignore_unknown_keys_in_named_tupleignorar las claves desconocidas en un objeto JSON para las tuples con nombre.false
input_format_json_compact_allow_variable_number_of_columnspermite un número variable de columnas en el formato JSONCompact/JSONCompactEachRow, ignora las columnas adicionales y usa valores predeterminados para las columnas ausentes.false
input_format_json_throw_on_bad_escape_sequencelanza una excepción si la cadena JSON contiene una secuencia de escape no válida. Si se desactiva, las secuencias de escape no válidas permanecerán tal cual en los datos.true
input_format_json_empty_as_defaulttrata los campos vacíos de la entrada JSON como valores predeterminados.false.Para las expresiones predeterminadas complejas, también debe habilitarse input_format_defaults_for_omitted_fields.
output_format_json_quote_64bit_integerscontrola si los enteros de 64 bits se escriben entre comillas en el formato de salida JSON.true
output_format_json_quote_64bit_floatscontrola si los números de coma flotante de 64 bits se escriben entre comillas en el formato de salida JSON.false
output_format_json_quote_denormalshabilita la salida de ‘+nan’, ‘-nan’, ‘+inf’ y ‘-inf’ en el formato de salida JSON.false
output_format_json_quote_decimalscontrola si los decimales se encierran entre comillas en el formato de salida JSON.false
output_format_json_escape_forward_slashescontrola el escape de barras diagonales en las salidas de String del formato de salida JSON.true
output_format_json_named_tuples_as_objectsserializa las columnas de named tuple como objetos JSON.true
output_format_json_array_of_rowsgenera un array JSON con todas las filas en formato JSONEachRow(Compact).false
output_format_json_validate_utf8habilita la validación de secuencias UTF-8 en los formatos de salida JSON (ten en cuenta que no afecta a los formatos JSON/JSONCompact/JSONColumnsWithMetadata, ya que siempre validan UTF-8).false
Última modificación el 10 de junio de 2026