| 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:
SELECT * FROM test SETTINGS format_json_object_each_row_column_for_object_name='object_name'{
"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:
SELECT * FROM file('data.json', JSONObjectEachRow, 'object_name String, number UInt64') SETTINGS format_json_object_each_row_column_for_object_name='object_name'┌─object_name─┬─number─┐
│ first_obj │ 1 │
│ second_obj │ 2 │
│ third_obj │ 3 │
└─────────────┴────────┘También funciona para la inferencia de esquema:
DESCRIBE file('data.json', JSONObjectEachRow) SETTING format_json_object_each_row_column_for_object_name='object_name'┌─name────────┬─type────────────┐
│ object_name │ String │
│ number │ Nullable(Int64) │
└─────────────┴─────────────────┘Insertar datos
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:
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 dexyaes0(el valor predeterminado del tipo de datoUInt32). - Si
input_format_defaults_for_omitted_fields = 1, el valor predeterminado dexes0, pero el valor predeterminado deaesx * 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:
CREATE TABLE json_each_row_nested (n Nested (s String, i Int32) ) ENGINE = MemoryComo 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:
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.
SELECT name, value FROM system.settings WHERE name = 'input_format_import_nested_json'┌─name────────────────────────────┬─value─┐
│ input_format_import_nested_json │ 0 │
└─────────────────────────────────┴───────┘INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n": {"s": ["abc", "def"], "i": [1, 23]}}Code: 117. DB::Exception: Unknown field found while parsing JSONEachRow format: n: (at row 1)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┌─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 |