Como dividir um enorme arquivo CSV no Linux?

5

Eu tenho 60 TB de dados que residem em 12 arquivos csv.

Os dados serão carregados em um banco de dados em cluster onde os processos de carregamento são de thread único. Para melhorar meu desempenho de carga, preciso iniciar um processo de carregamento de cada nó.

Até aqui tudo bem deste ponto de vista. Meu maior problema é como dividir esses dados? É compactado e cada arquivo csv tem cerca de 5TB de dados! Eu tentei dividir mas demora muito!

    
por Up_One 03.07.2014 / 19:14

3 respostas

1

A maneira mais fácil, mas não a mais rápida, provavelmente, é

unzip -p <zipfile> | split -C <size>
    
por 03.07.2014 / 19:41
0

Assumindo que a ordem dos dados não é importante, uma maneira de fazer isso - não muito mais rápido - mas pelo menos um pouco paralela seria escrever um script que faça o seguinte.

  1. Abra o arquivo zip.
  2. Pegue o primeiro arquivo.
  3. Leia os dados do arquivo, digamos, em linhas.
  4. Para cada linha csv, escreva um novo arquivo zip contendo a linha.
  5. Gire o arquivo selecionado (digamos, cinco zipfiles) usando a saída de uma linha.
  6. Quando atingir um determinado tamanho (digamos, 50 GB), crie um novo arquivo zip.

Isso não é mais rápido do que uma leitura seqüencial do arquivo grande, mas permite dividir o arquivo em partes menores que podem ser carregadas em paralelo enquanto os dados restantes são concluídos.

Como a maioria dos resultados compactados, não é possível (você não pode avançar X bytes), então a maior desvantagem é que, se o processo for anulado por algum motivo, você será forçado a reiniciar tudo do zero.

O Python oferece suporte para fazer algo assim por meio do módulo zipfile .

    
por 03.07.2014 / 20:04
0

Você tem que carregar os 12 arquivos em ordem ou eles podem ser importados em paralelo?

Eu pergunto porque parece que se eles tiverem que ser carregados em ordem, então, dividi-los ainda mais não permitirá que você execute qualquer coisa em paralelo de qualquer maneira e, se não, você poderá importar os 12 arquivos que você já possui paralelo.

Se os arquivos ainda não estiverem disponíveis nos nós, a transferência deles pode demorar tanto quanto a importação.

Gargalos podem aparecer em lugares surpreendentes. Você iniciou o processo de importação de thread único e verificou se os nós estão subutilizados? Você pode estar resolvendo o problema errado se não tiver verificado.

    
por 03.07.2014 / 20:12

Tags