---
name: csv_to_parquet_duckdb
kind: function
lang: py
domain: core
version: "1.0.0"
purity: impure
signature: "csv_to_parquet_duckdb(csv_path: str | Path, parquet_path: str | Path, column_casts: dict[str, str] | None = None, overwrite: bool = False) -> bool"
description: "Convierte un CSV a Parquet usando DuckDB read_csv_auto. Si overwrite=False y el parquet ya existe no hace nada. column_casts permite sobreescribir tipos inferidos por columna. Retorna True si escribió."
tags: [csv, parquet, duckdb, etl, core]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [duckdb, pathlib]
params:
  - name: csv_path
    desc: "Ruta al archivo CSV fuente."
  - name: parquet_path
    desc: "Ruta de destino del archivo Parquet. Se crean los directorios intermedios si no existen."
  - name: column_casts
    desc: "Dict opcional col→tipo DuckDB para sobreescribir tipos inferidos (e.g. {\"cp\": \"VARCHAR\"})."
  - name: overwrite
    desc: "Si False (default), no sobreescribe un parquet existente y retorna False."
output: "True si el archivo Parquet fue escrito, False si fue omitido por ya existir."
tested: true
tests:
  - "convierte csv a parquet y duckdb puede leerlo"
  - "overwrite=False no sobreescribe parquet existente"
test_file_path: "python/functions/core/tests/test_csv_to_parquet_duckdb.py"
file_path: "python/functions/core/csv_to_parquet_duckdb.py"
source_repo: "internal:footprint_aurgi"
source_license: "internal-aurgi"
source_file: "zonas_mapas_aurgi/scripts/prepare_parquet.py"
---

## Ejemplo

```python
written = csv_to_parquet_duckdb(
    "data/centros.csv",
    "data/centros.parquet",
    column_casts={"cp": "VARCHAR"},
)
if written:
    print("Parquet generado")
```

## Notas

Usa DuckDB read_csv_auto que infiere tipos automáticamente. Para columnas con
códigos postales u otros campos numéricos que deben ser strings, usar column_casts.
Lanza FileNotFoundError si csv_path no existe. Otros errores de DuckDB se propagan.
