Eu tenho um arquivo PyArrow Parquet que é muito grande para ser processado na memória. Como os dados podem ser facilmente particionados em diferentes fragmentos, gostaria de particioná-los manualmente e criar um conjunto de dados PyArrow a partir do arquivo. Enquanto estou particionando, as linhas dentro da partição precisam ser reordenadas, para que a iteração dos dados possa ser feita em ordem natural.
Aqui está um trecho de esquema, se for relevante. A chave de particionamento é chain_id
:
pa.schema([
("chain_id", pa.uint32()),
("pair_id", pa.uint64()),
("block_number", pa.uint32()),
("timestamp", pa.timestamp("s")),
("tx_hash", pa.binary(32)),
("log_index", pa.uint32()),
])
O processo que eu estava planejando usar
- Determine os IDs das partições antecipadamente (
chain_id
no esquema acima) - Abra um novo conjunto de dados para gravação
- Para cada ID de partição
- Crie uma tabela PyArrow temporária na memória
- Leia (itere em lotes) o arquivo Parquet de origem
- Identifique as linhas pertencentes a esta partição e adicione-as à tabela na memória
- Classifique as linhas na memória
- Anexar tabela ao conjunto de dados
No entanto, a documentação sobre FileSystemDataset no PyArrow é escassa. Minha pergunta ao longo das linhas é
- Como adiciono tabelas completas a a
FilesystemDataset
, assumindo que a tabela é todo o conteúdo de uma partição? - Existe alguma ferramenta existente para particionar arquivos Parquet (PyArrow) em conjuntos de dados, sem a necessidade de escrever um script manual?
- Que tipo de garantia de pedido
pyarrow.dataset.FileSystemDataset
oferece, supondo que eu queira sempre ler os dados na ordem pré-classificada inseridato_batches
? - Alguma outra dica do PyArrwo sobre dados e conjuntos de dados que não cabem na RAM?
Eu recomendo usar a API do conjunto de dados . Ele pode filtrar sem
chain_id
carregar e gravar as partições . A leitura do conjunto de dados mantém a ordem.Meu próprio utilitário de particionamento é semelhante ao que você precisa. Não fornece classificação, mas pode ser adaptado ou fornecer ideias.