Parquet es un formato de archivo eficiente para almacenar datos de forma orientada a columnas. ClickHouse admite tanto la lectura como la escritura de archivos Parquet.
Importar desde Parquet
Antes de cargar los datos, podemos usar la función file() para inspeccionar la estructura de un archivo Parquet de ejemplo:
DESCRIBE TABLE file('data.parquet', Parquet);Hemos usado Parquet como segundo argumento para que ClickHouse conozca el formato del archivo. Esto mostrará las columnas con sus tipos:
┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path │ Nullable(String) │ │ │ │ │ │
│ date │ Nullable(String) │ │ │ │ │ │
│ hits │ Nullable(Int64) │ │ │ │ │ │
└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘También podemos explorar los archivos antes de importar realmente los datos, aprovechando toda la potencia de SQL:
SELECT *
FROM file('data.parquet', Parquet)
LIMIT 3;┌─path──────────────────────┬─date───────┬─hits─┐
│ Akiba_Hebrew_Academy │ 2017-08-01 │ 241 │
│ Aegithina_tiphia │ 2018-02-01 │ 34 │
│ 1971-72_Utah_Stars_season │ 2016-10-01 │ 1 │
└───────────────────────────┴────────────┴──────┘Importación a una tabla existente
Vamos a crear una tabla en la que importaremos datos en formato Parquet:
CREATE TABLE sometable
(
`path` String,
`date` Date,
`hits` UInt32
)
ENGINE = MergeTree
ORDER BY (date, path);Ahora podemos importar datos mediante la cláusula FROM INFILE:
INSERT INTO sometable
FROM INFILE 'data.parquet' FORMAT Parquet;
SELECT *
FROM sometable
LIMIT 5;┌─path──────────────────────────┬───────date─┬─hits─┐
│ 1988_in_philosophy │ 2015-05-01 │ 70 │
│ 2004_Green_Bay_Packers_season │ 2015-05-01 │ 970 │
│ 24_hours_of_lemans │ 2015-05-01 │ 37 │
│ 25604_Karlin │ 2015-05-01 │ 20 │
│ ASCII_ART │ 2015-05-01 │ 9 │
└───────────────────────────────┴────────────┴──────┘Observa cómo ClickHouse convirtió automáticamente las cadenas de Parquet (en la columna date) al tipo Date. Esto se debe a que ClickHouse realiza automáticamente una conversión de tipo según los tipos de la tabla de destino.
Insertar un archivo local en un servidor remoto
Si desea insertar un archivo Parquet local en un servidor remoto de ClickHouse, puede hacerlo redirigiendo el contenido del archivo a clickhouse-client, como se muestra a continuación:
clickhouse client -q "INSERT INTO sometable FORMAT Parquet" < data.parquetCrear nuevas tablas a partir de archivos Parquet
Como ClickHouse puede leer el esquema de un archivo Parquet, podemos crear tablas sobre la marcha:
CREATE TABLE imported_from_parquet
ENGINE = MergeTree
ORDER BY tuple() AS
SELECT *
FROM file('data.parquet', Parquet)Esto creará y poblará automáticamente una tabla a partir de un archivo Parquet especificado:
DESCRIBE TABLE imported_from_parquet;┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path │ Nullable(String) │ │ │ │ │ │
│ date │ Nullable(String) │ │ │ │ │ │
│ hits │ Nullable(Int64) │ │ │ │ │ │
└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘De forma predeterminada, ClickHouse es estricto con los nombres de las columnas, los tipos y los valores. Pero, a veces, se pueden omitir columnas inexistentes o valores no admitidos durante la importación. Esto se puede gestionar con la configuración de Parquet.
Exportación en formato Parquet
Para exportar cualquier tabla o el resultado de una consulta a un archivo Parquet, podemos usar una cláusula INTO OUTFILE:
SELECT *
FROM sometable
INTO OUTFILE 'export.parquet'
FORMAT ParquetEsto creará el archivo export.parquet en el directorio de trabajo.
Tipos de datos de ClickHouse y Parquet
Los tipos de datos de ClickHouse y Parquet son en su mayoría idénticos, aunque difieren ligeramente. Por ejemplo, ClickHouse exporta el tipo DateTime como un int64 de Parquet. Si luego lo volvemos a importar en ClickHouse, veremos números (archivo time.parquet):
SELECT * FROM file('time.parquet', Parquet);┌─n─┬───────time─┐
│ 0 │ 1673622611 │
│ 1 │ 1673622610 │
│ 2 │ 1673622609 │
│ 3 │ 1673622608 │
│ 4 │ 1673622607 │
└───┴────────────┘En este caso se puede usar la conversión de tipos:
SELECT
n,
toDateTime(time) <--- int to time
FROM file('time.parquet', Parquet);┌─n─┬────toDateTime(time)─┐
│ 0 │ 2023-01-13 15:10:11 │
│ 1 │ 2023-01-13 15:10:10 │
│ 2 │ 2023-01-13 15:10:09 │
│ 3 │ 2023-01-13 15:10:08 │
│ 4 │ 2023-01-13 15:10:07 │
└───┴─────────────────────┘Más información
ClickHouse ofrece compatibilidad con numerosos formatos, tanto de texto como binarios, para adaptarse a distintos escenarios y plataformas. Consulte más formatos y formas de trabajar con ellos en los siguientes artículos:
- Formatos CSV y TSV
- Avro, Arrow y ORC
- Formatos JSON
- Regex y Template
- Formatos nativos y binarios
- Formatos SQL
Consulte también clickhouse-local, una herramienta portátil y completa para trabajar con archivos locales o remotos sin necesidad del servidor de ClickHouse.