2015-01-12 14 views
2

После this question, я пытаюсь загрузить 40 GB TAR file с jz-файлами, сжатыми в bz2, в PostgreSQL эффективным образом.Загрузка файла TAR и извлечение его содержимого * bz2 в sdout с помощью bzcat

В соответствии с указанным выше ответом, я пытаюсь отделить процесс и использовать внешние инструменты для создания следующего потока.

  • Открыть & Извлечение файлов SDOUT с ТАР (bsdtar в этом случае, как TAR не включает извлечение в сборке Windows) * только .bz2 файлы.
  • Извлечение * BZ2 файлы с вызовом bzcat (экспорт в sdout)
  • Открыть в моем питон скрипт «file_handling», который отображает каждую входящую линию на твит, и выводит в формате CSV на стандартный вывод
  • Поместите это на PSQL, чтобы загрузить его в одну команду COPY.

В настоящее время я получаю сообщение об ошибке, когда приезжая на bzcat, это то, что я должен построить линию, которая выполняет выше:

pipeline = [filename[1:3] + " && ", # Change drive to H so that TAR can find the file without a drive name (doesn't like absolute paths, apparently). 
      '"C:\\Tools\\GnuWin32\\gnuwin32\\bin\\bsdtar" vxOf ' + filename_nodrive + ' "*.bz2"', # Call to tar, outputs to stdin 
      " | C:\\Tools\\GnuWin32\\gnuwin32\\bin\\bzcat.exe"#, # Forward its output to bzcat 
      ' | python "D:\Cloud\Dropbox\Coding\GitHub\pyTwitter\pyTwitter_filehandling.py"', # Extract Tweets 
      ' | "C:\Program Files\PostgreSQL\9.4\bin\psql.exe" -1f copy.sql ' + secret_login_d 
      ] 
module_call = "".join(pipeline) 
module_call = "H: && "C:\Tools\GnuWin32\gnuwin32\bin\bsdtar" vxOf "Twitter datastream/Sourcefiles/archiveteam-twitter-stream-2013-01.tar" "*.bz2" | C:\Tools\GnuWin32\gnuwin32\bin\bzcat.exe | python "D:\Cloud\Dropbox\Coding\GitHub\pyTwitter\pyTwitter_filehandling.py" | "C:\Program Files\PostgreSQL\9.4in\psql.exe" -1f copy.sql "user=xxx password=xxx host=localhost port=5432 dbname=xxxxxx"" 

При выполнении кода для TAR, TAR файл выводится в подсказку CMD, намекая мне, что все в порядке. Однако bzcat линия приносит ошибку:

x 01/29/06/39.json.bz2 
bzcat.exe: Data integrity error when decompressing. 
    Input file = (stdin), output file = (stdout) 

It is possible that the compressed file(s) have become corrupted. 
You can use the -tvv option to test integrity of such files. 

Запуск -tvv дает мне:

huff+mtf data integrity (CRC) error in data 

Я пытался извлечь тот же архив с 7-Zip (GUI): это по-прежнему работает. Любая помощь в том, как устранить эту проблему, будет очень признательна. Я запускаю Windows 8.1 с GNUWin32.

+0

Спасибо @MattV за этот пост! Очень полезно для моей работы. Не могли бы вы поделиться с Python кодом «file_handling», чтобы я мог попробовать этот метод в архиве? Возможно, через github. Благодаря! –

+0

Это было давно, надеюсь, что это все еще имеет смысл: https://gist.github.com/MVersteeg/bb4a754823e7609bd204acbdb479d37d – MattV

+0

Спасибо @MattV за отличный код Python. Еще один вопрос: у вас есть файл copy.sql? Я пытался написать copy.sql в течение длительного времени, но всегда получаю результат «COPY 0». –

ответ

2

bsdtar.exe - это translating newline байтов в файлах данных в последовательности DOS CRLF, приводящей к поврежденному выходному потоку bzip2.

GNU tar работал при использовании относительных путей, но не обрабатывал абсолютные пути в Windows.

Лучше всего использовать 7-Zip вместо:

7z.exe x -so -ir!*.json.bz2 archive.tar | bzcat | ...