dotted-ai / parquet-to-sql
Laravel helper to import Parquet files into PostgreSQL using COPY for speed.
Installs: 7
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/dotted-ai/parquet-to-sql
Requires
- php: >=8.1
- codercat/php-parquet: ^1.5
- illuminate/console: ^10.0|^11.0
- illuminate/queue: ^10.0|^11.0
- illuminate/support: ^10.0|^11.0
Requires (Dev)
- phpunit/phpunit: ^10.5
This package is auto-updated.
Last update: 2025-12-24 18:06:54 UTC
README
Helper para importar arquivos Parquet diretamente para tabelas PostgreSQL usando Laravel. Le o arquivo em lotes, tenta usar COPY para performance e faz fallback para inserts em massa.
Instalacao
composer require dotted-ai/parquet-to-sql
php artisan vendor:publish --tag=config --provider="ParquetToSql\\ParquetToSqlServiceProvider"
Dependencias:
- ext-pgsql habilitada no PHP para que o
pgsqlCopyFromArrayfuncione. codercat/php-parquet(ja esta no composer.json) para fazer o parse do arquivo.
Uso rapido (CLI)
php artisan parquet:import storage/app/data/users.parquet users \\ --truncate \\ --map=id=user_id --map=email=email_address
Opcoes principais:
--connection=escolhe a conexao (default:config('parquet-to-sql.connection')).--batch=tamanho do lote (default:config('parquet-to-sql.batch_size')).--timeout=timeout do COPY em segundos.--truncaterodaTRUNCATE TABLEantes de inserir.
Uso programatico
use ParquetToSql\ParquetImporter; $importer = app(ParquetImporter::class); $result = $importer->import( path: storage_path('app/data/users.parquet'), table: 'users', columnMap: ['id' => 'user_id', 'email' => 'email_address'], truncateBeforeImport: true, ); logger()->info('Import', $result->toArray());
Enfileirando
use ParquetToSql\ImportParquetJob; ImportParquetJob::dispatch( path: storage_path('app/data/users.parquet'), table: 'users', columnMap: ['id' => 'user_id'], connectionName: 'pgsql', truncateBeforeImport: false );
Configuracao
Arquivo config/parquet-to-sql.php:
connection: conexao de banco usada pelo importador.batch_size: quantas linhas sao lidas antes de enviar para o banco.copy_timeout: timeout do COPY em segundos.
Notas e limites
- O codigo tenta usar
PDO::pgsqlCopyFromArray; se nao existir (ex.: SQLite em testes), cai para inserts em lote. - Nomes de tabela aceitam esquema opcional (
schema.tabela) usando apenas letras, numeros e_. Nomes de colunas/targets do map aceitam apenas letras, numeros e_(sem pontos ou espacos) para manter SQL seguro. - O leitor padrao prioriza APIs de streaming (
readRows, row groups) para nao carregar o arquivo inteiro em memoria; se a lib expor apenasread(), ele ainda funciona, mas pode consumir mais memoria. - Se sua versao de
codercat/php-parquetexpuser metodos diferentes, implemente umParquetRowReaderproprio e passe no importador.
Testes
composer install --dev ./vendor/bin/phpunit