Nem tenho certeza se estou formulando esta pergunta corretamente, mas tentarei - tenho vários arquivos de texto enormes gerados a partir de uma exportação do Oracle em um sistema Linux. Cada arquivo tem cerca de 30 GB de tamanho e eu tenho cerca de 50 deles.
O objetivo é exportar esses dados para o Azure SQL Data Warehouse. O BCP, neste caso, não é a abordagem certa tendo em mente o tamanho dos dados, então tive que usar o Polybase.
Depois de converter da codificação ASCII para UTF8, tive um problema ao consultar as tabelas externas. Polybase não funciona bem com o arquivo de texto de largura fixa com uma quebra de linha em cada linha.
O arquivo de texto se parece com isto:
101.102.103.104.105.106.107 108.108.109.110.111.112.113 114.115.116.117.118.119.120 121.122.123 --nada aqui, apenas uma linha em branco 201.202.203.204.205.206.207 208.209.210.211.212.213.214 215.216.217
O Polybase tenta processar de 101 a 107 e apresenta erros reclamando que não havia colunas suficientes neste arquivo para processar.
Aqui está o que eu acho que está acontecendo: a largura fixa e as quebras de linha estão fazendo com que trate a quebra de linha como um delimitador de linha.
Como faço para converter este arquivo para ficar como abaixo:
101,102,103,104,105,106,107,108,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123{CR}{LF} 201.202.203.204.205.206.207.208.209.210.211.212.213.214.215.216.217{CR}{LF}
EDIT: Aqui estão os dados de amostra de um arquivo. Abri no git bash em uma VM do Windows.
Esses arquivos devem ter 167 colunas ,
como separador de colunas. O problema é que, como cada linha gera várias linhas, é difícil processá-las nas tabelas externas do Polybase.
O Polybase é poderoso, mas não tão sofisticado, então não será capaz de lidar com esse formato estranho. Você tem três opções a meu ver:
Tente responder às minhas perguntas acima e forneça um arquivo de amostra e tentarei ajudar.
De acordo com um editor hexadecimal, seu arquivo de amostra possui alimentação de linha única (0A) para algumas terminações de linha e duas alimentações de linha como delimitador entre as linhas:
Um extrator personalizado U-SQL pode ser capaz de lidar com esse arquivo, mas me pergunto se teremos problemas com o arquivo completo de 30 GB.
Instruções
Adicione um script U-SQL e adicione o texto abaixo ao arquivo code-behind U-SQL:
Processe o arquivo usando o extrator personalizado:
Isso produziu um arquivo de limpeza que pude importar usando o Polybase:
Boa sorte!
Acabei usando o sed para limpar o arquivo
zcat myfile.txt.gz | sed -r 's/[ ]+/vin/g'|tr -d '\n'|tr 'vinvin' '\n'|grep -v '^$' > myfile.txt
Isso resolveu problemas de formatação com os arquivos de origem. Depois que esses arquivos foram carregados no armazenamento de blob do Azure, o resto foi fácil. Criei uma tabela externa apontando para arquivos no blob via Polybase e criei tabelas internas usando
CREATE TABLE dbo.internal AS SELECT * FROM blob.external
. Uma instância do Azure DWH com capacidade de 700 DWH conseguiu carregar cerca de 50 milhões de linhas em 5 minutos da tabela externa.