--- layout: docu redirect_from: - /docs/guides/import/parquet_import - /docs/guides/file_formats/parquet_import title: Parquet Import --- To read data from a Parquet file, use the `read_parquet` function in the `FROM` clause of a query: ```sql SELECT * FROM read_parquet('input.parquet'); ``` Alternatively, you can omit the `read_parquet` function and let DuckDB infer it from the extension: ```sql SELECT * FROM 'input.parquet'; ``` To create a new table using the result from a query, use the [`CREATE TABLE ... AS SELECT` statement]({% link docs/stable/sql/statements/create_table.md %}#create-table--as-select-ctas): ```sql CREATE TABLE new_tbl AS SELECT * FROM read_parquet('input.parquet'); ``` To load data into an existing table from a query, use `INSERT INTO` from a `SELECT` statement: ```sql INSERT INTO tbl SELECT * FROM read_parquet('input.parquet'); ``` Alternatively, use the `COPY` statement to load data from a Parquet file into an existing table: ```sql COPY tbl FROM 'input.parquet' (FORMAT parquet); ``` ## Adjusting the Schema on the Fly You can load a Parquet file into a slightly different schema (e.g., different number of columns, more relaxed types) using the following trick. Suppose you have a Parquet file with two columns, `c1` and `c2`: ```sql COPY (FROM (VALUES (42, 43)) t(c1, c2)) TO 'f.parquet'; ``` To add another column `c3` that is not present in the file, run: ```sql FROM (VALUES (NULL::VARCHAR, NULL, NULL)) t(c1, c2, c3) WHERE false UNION ALL BY NAME FROM 'f.parquet'; ``` The first `FROM` clause generates an empty table with *three* columns where `c1` is a `VARCHAR`. Then, use `UNION ALL BY NAME` to union the Parquet file. The result is: ```text ┌─────────┬───────┬───────┐ │ c1 │ c2 │ c3 │ │ varchar │ int32 │ int32 │ ├─────────┼───────┼───────┤ │ 42 │ 43 │ NULL │ └─────────┴───────┴───────┘ ``` For additional options, see the [Parquet loading reference]({% link docs/stable/data/parquet/overview.md %}).