Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

JSONObjectEachRow

Entrada Salida Alias

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:

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

Supongamos que hemos guardado la salida del ejemplo anterior en un archivo llamado 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 │
└─────────────┴────────┘

También funciona para la inferencia 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) │
└─────────────┴─────────────────┘

Insertar datos

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

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

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.

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:

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

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

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] │
└───────────────┴────────┘

Configuración de formato

Configuración Descripción Predeterminado Notas
input_format_import_nested_json asignar datos JSON anidados a tablas anidadas (funciona con el formato JSONEachRow). false
input_format_json_read_bools_as_numbers permitir interpretar valores booleanos como números en los formatos de entrada JSON. true
input_format_json_read_bools_as_strings permite analizar valores booleanos como cadenas en los formatos de entrada JSON. true
input_format_json_read_numbers_as_strings permite analizar números como cadenas en los formatos de entrada JSON. true
input_format_json_read_arrays_as_strings permite analizar arrays JSON como cadenas en los formatos de entrada JSON. true
input_format_json_read_objects_as_strings permite analizar objetos JSON como cadenas en formatos de entrada JSON. true
input_format_json_named_tuples_as_objects analiza columnas de tuplas con nombre como objetos JSON. true
input_format_json_try_infer_numbers_from_strings intenta inferir números a partir de campos de cadena durante la inferencia de esquema. false
input_format_json_try_infer_named_tuples_from_objects intentar inferir una tupla con nombre a partir de objetos JSON durante la inferencia del esquema. true
input_format_json_infer_incomplete_types_as_strings usar el tipo String para las claves que contienen solo NULL u objetos/arrays vacíos durante la inferencia del esquema en formatos de entrada JSON. true
input_format_json_defaults_for_missing_elements_in_named_tuple insertar valores predeterminados para los elementos que faltan en el objeto JSON al analizar una tupla con nombre. true
input_format_json_ignore_unknown_keys_in_named_tuple ignora las claves desconocidas del objeto JSON para las tuplas con nombre. false
input_format_json_compact_allow_variable_number_of_columns permite 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_sequence genera 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_default trata los campos vacíos de la entrada JSON como valores predeterminados. false. Para las expresiones predeterminadas complejas, también debe estar habilitado input_format_defaults_for_omitted_fields.
output_format_json_quote_64bit_integers controla el entrecomillado de los enteros de 64 bits en el formato de salida JSON. true
output_format_json_quote_64bit_floats controla el entrecomillado de los números de punto flotante de 64 bits en el formato de salida JSON. false
output_format_json_quote_denormals habilita las salidas '+nan', '-nan', '+inf' y '-inf' en el formato de salida JSON. false
output_format_json_quote_decimals controla el entrecomillado de los valores decimales en el formato de salida JSON. false
output_format_json_escape_forward_slashes controla el escape de barras diagonales (/) en las salidas de cadenas en el formato de salida JSON. true
output_format_json_named_tuples_as_objects serializa las columnas de tuplas con nombre como objetos JSON. true
output_format_json_array_of_rows genera un array JSON con todas las filas en formato JSONEachRow(Compact). false
output_format_json_validate_utf8 habilita 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; estos siempre validan UTF-8). false
Navigation