> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> Documentación sobre el formato Parquet

# Parquet

| Entrada | Salida | Alias |
| - | - | - |
| ✔ | ✔ | |

## Descripción

[Apache Parquet](https://parquet.apache.org/) es un formato de almacenamiento columnar muy extendido en el ecosistema de Hadoop. ClickHouse admite operaciones de lectura y escritura en este formato.

## Correspondencia de tipos de datos

La tabla siguiente muestra cómo se corresponden los tipos de datos de Parquet con los [tipos de datos](/docs/es/reference/data-types/index.md) de ClickHouse.

| Tipo de Parquet (lógico, convertido o físico) | Tipo de dato de ClickHouse |
| - | - |
| `BOOLEAN` | [Bool](/docs/es/reference/data-types/boolean.md) |
| `UINT_8` | [UInt8](/docs/es/reference/data-types/int-uint.md) |
| `INT_8` | [Int8](/docs/es/reference/data-types/int-uint.md) |
| `UINT_16` | [UInt16](/docs/es/reference/data-types/int-uint.md) |
| `INT_16` | [Int16](/docs/es/reference/data-types/int-uint.md)/[Enum16](/docs/es/reference/data-types/enum.md) |
| `UINT_32` | [UInt32](/docs/es/reference/data-types/int-uint.md) |
| `INT_32` | [Int32](/docs/es/reference/data-types/int-uint.md) |
| `UINT_64` | [UInt64](/docs/es/reference/data-types/int-uint.md) |
| `INT_64` | [Int64](/docs/es/reference/data-types/int-uint.md) |
| `DATE` | [Date32](/docs/es/reference/data-types/date.md) |
| `TIMESTAMP` | [DateTime64](/docs/es/reference/data-types/datetime64.md) |
| `TIME` | [Time64](/docs/es/reference/data-types/time64.md) |
| `FLOAT` | [Float32](/docs/es/reference/data-types/float.md) |
| `DOUBLE` | [Float64](/docs/es/reference/data-types/float.md) |
| `INT96` | [DateTime64(9, 'UTC')](/docs/es/reference/data-types/datetime64.md) |
| `BYTE_ARRAY`, `UTF8`, `ENUM`, `BSON` | [String](/docs/es/reference/data-types/string.md) |
| `JSON` | [JSON](/docs/es/reference/data-types/newjson.md) |
| `FIXED_LEN_BYTE_ARRAY` | [FixedString](/docs/es/reference/data-types/fixedstring.md) |
| `DECIMAL` | [Decimal](/docs/es/reference/data-types/decimal.md) |
| `LIST` | [Array](/docs/es/reference/data-types/array.md) |
| `MAP` | [Map](/docs/es/reference/data-types/map.md) |
| struct | [Tuple](/docs/es/reference/data-types/tuple.md) |
| `FLOAT16` | [Float32](/docs/es/reference/data-types/float.md) |
| `UUID` | [FixedString(16)](/docs/es/reference/data-types/fixedstring.md) |
| `INTERVAL` | [FixedString(12)](/docs/es/reference/data-types/fixedstring.md) |
| `Point` (GeoParquet) | [Point](/docs/es/reference/data-types/geo.md#point) |
| `MultiPoint` (GeoParquet) | [MultiPoint](/docs/es/reference/data-types/geo.md#multipoint) |
| `LineString` (GeoParquet) | [LineString](/docs/es/reference/data-types/geo.md#linestring) |
| `Polygon` (GeoParquet) | [Polygon](/docs/es/reference/data-types/geo.md#polygon) |
| `MultiLineString` (GeoParquet) | [MultiLineString](/docs/es/reference/data-types/geo.md#multilinestring) |
| `MultiPolygon` (GeoParquet) | [MultiPolygon](/docs/es/reference/data-types/geo.md#multipolygon) |
| geometría mixta/desconocida (GeoParquet) | [Geometry](/docs/es/reference/data-types/geo.md#geometry) |

Al escribir un archivo Parquet, los tipos de datos que no tienen un tipo de Parquet correspondiente se convierten al tipo disponible más cercano:

| Tipo de dato de ClickHouse | Tipo de Parquet |
| - | - |
| [IPv4](/docs/es/reference/data-types/ipv4.md) | `UINT_32` |
| [IPv6](/docs/es/reference/data-types/ipv6.md) | `FIXED_LEN_BYTE_ARRAY` (16 bytes) |
| [Date](/docs/es/reference/data-types/date.md) (16 bits) | `DATE` (32 bits) |
| [DateTime](/docs/es/reference/data-types/datetime.md) (32 bits, segundos) | `TIMESTAMP` (64 bits, milisegundos) |
| [Int128/UInt128/Int256/UInt256](/docs/es/reference/data-types/int-uint.md) | `FIXED_LEN_BYTE_ARRAY` (16/32 bytes, little-endian) |
| [Point](/docs/es/reference/data-types/geo.md#point) | `BYTE_ARRAY` (WKB) + metadatos de GeoParquet |
| [MultiPoint](/docs/es/reference/data-types/geo.md#multipoint) | `BYTE_ARRAY` (WKB) + metadatos de GeoParquet |
| [LineString](/docs/es/reference/data-types/geo.md#linestring) | `BYTE_ARRAY` (WKB) + metadatos de GeoParquet |
| [Polygon](/docs/es/reference/data-types/geo.md#polygon) | `BYTE_ARRAY` (WKB) + metadatos de GeoParquet |
| [MultiLineString](/docs/es/reference/data-types/geo.md#multilinestring) | `BYTE_ARRAY` (WKB) + metadatos de GeoParquet |
| [MultiPolygon](/docs/es/reference/data-types/geo.md#multipolygon) | `BYTE_ARRAY` (WKB) + metadatos de GeoParquet |

Los arrays pueden estar anidados y pueden tener un valor de tipo `Nullable` como argumento. Los tipos `Tuple` y `Map` también pueden estar anidados.

### Enteros anchos

De forma predeterminada, ClickHouse escribe `Int128`, `UInt128`, `Int256` y `UInt256` como valores `FIXED_LEN_BYTE_ARRAY(16/32)` sin anotaciones en orden little-endian. Esta representación heredada sigue siendo la predeterminada para que los archivos puedan leerse con versiones anteriores de ClickHouse.

Establezca `output_format_parquet_wide_integer_as_decimal = 1` para usar en su lugar la representación estándar `DECIMAL` de Parquet:

| Tipo de ClickHouse | Tipo lógico de Parquet | Tipo físico | Codificación de valores |
| - | - | - | - |
| `UInt128` | `DECIMAL(39, 0)` | `FIXED_LEN_BYTE_ARRAY(17)` | Un byte de signo cero seguido del valor sin signo de 16 bytes en orden big-endian |
| `UInt256` | `DECIMAL(78, 0)` | `FIXED_LEN_BYTE_ARRAY(33)` | Un byte de signo cero seguido del valor sin signo de 32 bytes en orden big-endian |
| `Int128` | `DECIMAL(39, 0)` | `FIXED_LEN_BYTE_ARRAY(17)` | El valor de complemento a dos de 16 bytes en orden big-endian, extendido por signo a 17 bytes |
| `Int256` | `DECIMAL(77, 0)` | `FIXED_LEN_BYTE_ARRAY(33)` | El valor de complemento a dos de 32 bytes en orden big-endian, extendido por signo a 33 bytes |

La representación decimal proporciona ordenamiento numérico para las estadísticas estándar de fragmentos de columna y los índices de página de Parquet, lo que permite a ClickHouse usar la poda de mínimos/máximos de grupos de filas y páginas. ClickHouse lee ambas codificaciones. Para una precisión decimal de 39, la inferencia de esquema devuelve `Decimal(39, 0)`, respaldado por `Decimal256`; especifique una estructura explícita `Int128` o `UInt128` para recuperar un tipo de entero ancho. La precisión decimal 77 o 78 supera el rango de `Decimal256` de ClickHouse, por lo que leer esos archivos requiere una estructura explícita compatible `Int256` o `UInt256`. Con una estructura explícita de entero ancho, ClickHouse acepta valores decimales estándar almacenados como `BYTE_ARRAY` o `FIXED_LEN_BYTE_ARRAY` de cualquier ancho válido, y verifica el rango de cada valor después de eliminar la extensión de signo.

Algunos clientes de Parquet admiten precisión decimal solo hasta 38, mientras que los tipos decimales de alto nivel de Arrow admiten precisión solo hasta 76. Dichos clientes pueden rechazar la representación de precisión 77/78 aunque su esquema y ancho físico de 33 bytes cumplan con Parquet. Mantenga la configuración deshabilitada cuando los archivos deban leerse con versiones anteriores de ClickHouse o clientes con límites decimales menores.

Los tipos de datos de las columnas de una tabla de ClickHouse pueden diferir de los campos correspondientes de los datos Parquet insertados. Al insertar datos, ClickHouse interpreta los tipos de datos según la tabla anterior y luego [convierte](/docs/es/reference/functions/regular-functions/type-conversion-functions.md#CAST) los datos al tipo de dato establecido para la columna de la tabla de ClickHouse. P. ej., una columna Parquet `UINT_32` puede leerse en una columna [IPv4](/docs/es/reference/data-types/ipv4.md) de ClickHouse.

Para algunos tipos de Parquet no hay un tipo de ClickHouse que coincida estrechamente. Los leemos de la siguiente manera:

* `TIMESTAMP` con `isAdjustedToUTC=false` es una hora local de reloj (campos de año, mes, día, hora, minuto, segundo y fracción de segundo en una zona horaria local, independientemente de qué zona horaria específica se considere local), igual que SQL `TIMESTAMP WITHOUT TIME ZONE`. Sin embargo, ClickHouse lo lee como si fuera una marca temporal UTC. P. ej., `2025-09-29 18:42:13.000` (que representa la hora de un reloj local) se convierte en `2025-09-29 18:42:13.000` (`DateTime64(3, 'UTC')`, que representa un punto en el tiempo). Si se convierte a String, muestra el año, mes, día, hora, minuto, segundo y fracción de segundo correctos, que luego pueden interpretarse como pertenecientes a alguna zona horaria local en lugar de UTC. Aunque resulte contraintuitivo, cambiar el tipo de `DateTime64(3, 'UTC')` a `DateTime64(3)` no ayudaría, ya que ambos tipos representan un punto en el tiempo en lugar de una lectura de reloj, pero `DateTime64(3)` se formatearía incorrectamente usando la zona horaria local.
* `INTERVAL` actualmente se lee como `FixedString(12)` con la representación binaria sin procesar del intervalo de tiempo, tal como está codificada en el archivo Parquet.

## Tipos geo (GeoParquet)

ClickHouse admite la lectura y escritura de columnas de geometría conforme a la especificación [GeoParquet](https://geoparquet.org/). Las columnas de geometría se almacenan como payloads `BYTE_ARRAY` codificados en [WKB](https://libgeos.org/specifications/wkb/) (o en WKT al leer), con una clave JSON `geo` en los metadatos de Parquet a nivel de archivo que describe la codificación, el tipo de geometría y el CRS de cada columna de geometría.

### Comportamiento de lectura

Al leer, las columnas de geometría se asignan a los [tipos de datos geo](/docs/es/reference/data-types/geo.md) correspondientes de ClickHouse:

* Una columna declarada como `Point`, `MultiPoint`, `LineString`, `Polygon`, `MultiLineString` o `MultiPolygon` se lee como el tipo geo correspondiente de ClickHouse.
* Una columna con varios tipos de geometría o con tipos de geometría desconocidos se lee como el tipo [`Geometry`](/docs/es/reference/data-types/geo#geometry), que es un `Variant` de todos los tipos geo compatibles.
* Si el tipo de columna solicitado es `String`, se ignoran los metadatos de GeoParquet y se devuelve el payload de geometría codificada sin procesar, tal cual: bytes WKB o WKT, según la codificación que declare la columna de GeoParquet. Esto también se aplica si la configuración [`input_format_parquet_allow_geoparquet_parser`](/docs/es/reference/settings/formats/input-format#input_format_parquet_allow_geoparquet_parser) está establecida en `0`.

### Comportamiento de escritura

Al escribir, las columnas de nivel superior de tipo `Point`, `MultiPoint`, `LineString`, `Polygon`, `MultiLineString` o `MultiPolygon` se codifican como `BYTE_ARRAY` (WKB) y se añaden los metadatos JSON `geo` correspondientes al pie de página del archivo Parquet. Un [`Geometry`](/docs/es/reference/data-types/geo#geometry) `Variant` de nivel superior también se codifica como un payload `BYTE_ARRAY` de WKB (sus subvalores se convierten a WKB y se almacenan como una columna `Nullable(String)`), pero no se emiten metadatos `geo` para él, por lo que el resultado no se reconoce como una columna de geometría GeoParquet al leerlo. Otros tipos relacionados con geo, como [`Ring`](/docs/es/reference/data-types/geo#ring), se escriben usando su representación subyacente nativa, sin metadatos GeoParquet. Este comportamiento puede deshabilitarse por completo configurando [`output_format_parquet_geometadata`](/docs/es/reference/settings/formats/output-format#output_format_parquet_geometadata) en `0`, en cuyo caso incluso los tipos geo compatibles se escriben usando su representación subyacente nativa (`Point` como `Tuple(Float64, Float64)`, `LineString` como `Array(Point)`, `Polygon` como `Array(Array(Point))`, etc.) y no se emiten metadatos GeoParquet.

Las columnas de geometría deben aparecer en la raíz del esquema o anidadas dentro de `Tuple` (`struct`); no se admite anidarlas dentro de `Array` o `Map`. `Nullable` tampoco se admite para las columnas geo.

## Ejemplo de uso

### Inserción de datos

Utiliza un archivo Parquet con los siguientes datos, llamado `football.parquet`:

```text theme={null}
    ┌───────date─┬─season─┬─home_team─────────────┬─away_team───────────┬─home_team_goals─┬─away_team_goals─┐
 1. │ 2022-04-30 │   2021 │ Sutton United         │ Bradford City       │               1 │               4 │
 2. │ 2022-04-30 │   2021 │ Swindon Town          │ Barrow              │               2 │               1 │
 3. │ 2022-04-30 │   2021 │ Tranmere Rovers       │ Oldham Athletic     │               2 │               0 │
 4. │ 2022-05-02 │   2021 │ Port Vale             │ Newport County      │               1 │               2 │
 5. │ 2022-05-02 │   2021 │ Salford City          │ Mansfield Town      │               2 │               2 │
 6. │ 2022-05-07 │   2021 │ Barrow                │ Northampton Town    │               1 │               3 │
 7. │ 2022-05-07 │   2021 │ Bradford City         │ Carlisle United     │               2 │               0 │
 8. │ 2022-05-07 │   2021 │ Bristol Rovers        │ Scunthorpe United   │               7 │               0 │
 9. │ 2022-05-07 │   2021 │ Exeter City           │ Port Vale           │               0 │               1 │
10. │ 2022-05-07 │   2021 │ Harrogate Town A.F.C. │ Sutton United       │               0 │               2 │
11. │ 2022-05-07 │   2021 │ Hartlepool United     │ Colchester United   │               0 │               2 │
12. │ 2022-05-07 │   2021 │ Leyton Orient         │ Tranmere Rovers     │               0 │               1 │
13. │ 2022-05-07 │   2021 │ Mansfield Town        │ Forest Green Rovers │               2 │               2 │
14. │ 2022-05-07 │   2021 │ Newport County        │ Rochdale            │               0 │               2 │
15. │ 2022-05-07 │   2021 │ Oldham Athletic       │ Crawley Town        │               3 │               3 │
16. │ 2022-05-07 │   2021 │ Stevenage Borough     │ Salford City        │               4 │               2 │
17. │ 2022-05-07 │   2021 │ Walsall               │ Swindon Town        │               0 │               3 │
    └────────────┴────────┴───────────────────────┴─────────────────────┴─────────────────┴─────────────────┘
```

Inserte los datos:

```sql theme={null}
INSERT INTO football FROM INFILE 'football.parquet' FORMAT Parquet;
```

### Leer datos

Lea los datos con el formato `Parquet`:

```sql theme={null}
SELECT *
FROM football
INTO OUTFILE 'football.parquet'
FORMAT Parquet
```

> [!TIP]
>
> Parquet es un formato binario que no se muestra de forma legible en la terminal. Use `INTO OUTFILE` para generar archivos Parquet.

Para intercambiar datos con Hadoop, puede usar el [`motor de tabla HDFS`](/docs/es/reference/engines/table-engines/integrations/hdfs).

## Configuración de formato

| Ajuste | Descripción | Predeterminado |
| - | - | - |
| `input_format_parquet_case_insensitive_column_matching` | Ignora las diferencias entre mayúsculas y minúsculas al hacer coincidir columnas de Parquet con columnas de CH. | `0` |
| `input_format_parquet_preserve_order` | Evita reordenar las filas al leer archivos Parquet. Normalmente hace que el proceso sea mucho más lento. | `0` |
| `input_format_parquet_filter_push_down` | Al leer archivos Parquet, omite grupos de filas completos según las expresiones WHERE/PREWHERE y las estadísticas mín./máx. en los metadatos de Parquet. | `1` |
| `input_format_parquet_bloom_filter_push_down` | Al leer archivos Parquet, omite grupos de filas completos según las expresiones WHERE y el bloom filter en los metadatos de Parquet. | `0` |
| `input_format_parquet_dictionary_filter_push_down` | Al leer archivos Parquet (con reader v3), omite grupos de filas completos según las expresiones WHERE/PREWHERE y el contenido de las páginas de diccionario para condiciones de igualdad y `IN`, cuando todas las páginas de datos de un fragmento de columna están codificadas mediante diccionario. El valor es el tamaño máximo de página de diccionario (en bytes) para el que se aplica esta optimización; establécelo en `0` para deshabilitarla. Tiene prioridad sobre el bloom filter cuando ambos están disponibles. | `1048576` |
| `input_format_parquet_allow_missing_columns` | Permite columnas ausentes al leer formatos de entrada Parquet. | `1` |
| `input_format_parquet_local_file_min_bytes_for_seek` | Cantidad mínima de bytes necesaria para que una lectura local (archivo) haga seek, en lugar de leer e ignorar, en el formato de entrada Parquet. | `8192` |
| `input_format_parquet_enable_row_group_prefetch` | Habilita el prefetch de grupos de filas durante el análisis de Parquet. Actualmente, solo el análisis con un único hilo puede hacer prefetch. | `1` |
| `input_format_parquet_skip_columns_with_unsupported_types_in_schema_inference` | Omite columnas con tipos no compatibles durante la inferencia de esquema para el formato Parquet. | `0` |
| `input_format_parquet_max_block_size` | Tamaño máximo de block para el lector de Parquet. | `65409` |
| `input_format_parquet_prefer_block_bytes` | Promedio de bytes por block generado por el lector de Parquet. | `16744704` |
| `input_format_parquet_enable_json_parsing` | Al leer archivos Parquet, analiza columnas JSON como JSON column de ClickHouse. | `1` |
| `input_format_parquet_allow_geoparquet_parser` | Al leer archivos Parquet, reconoce los metadatos `geo` de GeoParquet y decodifica las columnas de geometría (WKB o WKT, según la codificación declarada de la columna) como tipos de datos geoespaciales de ClickHouse. Si es `0`, las columnas de geometría se exponen en su representación física sin procesar (`String`). | `1` |
| `output_format_parquet_row_group_size` | Tamaño objetivo del grupo de filas, en número de filas. | `1000000` |
| `output_format_parquet_row_group_size_bytes` | Tamaño objetivo del grupo de filas en bytes, antes de la compresión. | `536870912` |
| `output_format_parquet_string_as_string` | Usa el tipo String de Parquet en lugar de Binary para columnas String. | `1` |
| `output_format_parquet_fixed_string_as_fixed_byte_array` | Usa el tipo FIXED\_LEN\_BYTE\_ARRAY de Parquet en lugar de Binary para columnas FixedString. | `1` |
| `output_format_parquet_wide_integer_as_decimal` | Escribe `Int128`, `UInt128`, `Int256` y `UInt256` como valores `DECIMAL` estándar de Parquet en formato big-endian en lugar de arrays de bytes fijos little-endian heredados. | `0` |
| `output_format_parquet_compression_method` | Método de compresión para el formato de salida Parquet. Codecs compatibles: snappy, lz4, brotli, zstd, gzip, none (sin comprimir). | `zstd` |
| `output_format_parquet_parallel_encoding` | Realiza la codificación de Parquet en varios hilos. | `1` |
| `output_format_parquet_data_page_size` | Tamaño objetivo de página en bytes, antes de la compresión. | `1048576` |
| `output_format_parquet_batch_size` | Comprueba el tamaño de la página cada esta cantidad de filas. Considera reducirlo si tienes columnas cuyo tamaño promedio de valor supera unos pocos KB. | `1024` |
| `output_format_parquet_write_page_index` | Añade la posibilidad de escribir el índice de página en archivos Parquet. | `1` |
| `output_format_parquet_geometadata` | Escribe los metadatos `geo` de GeoParquet en el footer del archivo Parquet y codifica como WKB las columnas geo de nivel superior de ClickHouse ([`Point`](/docs/es/reference/data-types/geo#point), [`MultiPoint`](/docs/es/reference/data-types/geo#multipoint), [`LineString`](/docs/es/reference/data-types/geo#linestring), [`Polygon`](/docs/es/reference/data-types/geo#polygon), [`MultiLineString`](/docs/es/reference/data-types/geo#multilinestring), [`MultiPolygon`](/docs/es/reference/data-types/geo#multipolygon)). Si es `0`, esas columnas se escriben con su representación nativa subyacente (p. ej., `Point` como `Tuple(Float64, Float64)`) y no se generan metadatos de GeoParquet. | `1` |
| `input_format_parquet_import_nested` | Configuración obsoleta; no hace nada. | `0` |
| `input_format_parquet_local_time_as_utc` | true | Determina el tipo de dato que usa la inferencia de esquema para las marcas temporales de Parquet con isAdjustedToUTC=false. Si es true: DateTime64(..., 'UTC'); si es false: DateTime64(...). Ninguno de los dos comportamientos es totalmente correcto, ya que ClickHouse no tiene un tipo de dato para la hora local de reloj local. Aunque resulte contraintuitivo, probablemente 'true' sea la opción menos incorrecta, porque al dar formato a la marca temporal 'UTC' como String se producirá una representación de la hora local correcta. |
