Вставка GPFdist из плоского файла выдает ошибку 'неверная последовательность байтов для кодировки "UTF8": 0x00' при вставке

Я столкнулся с проблемой в процессе, который я пишу, чтобы получить данные из большого плоского файла. Я предварительно обработал плоский файл с помощью оболочки Python со спецификациями UTF8 следующим образом: wrFile = io.open("outFile","w+",encoding='utf8')

Я читаю исходный файл построчно, используя: lineACT = linecache.getline("inFile", i+j) lineNxt = linecache.getline("inFile", i+j+1)

Далее, после предварительной обработки строк я пишу файл следующим образом:wrFile.write(lineACT)Таким образом, перебирая # строк в infile, я создаю outfile.

Теперь файл готов к загрузке во внешний postgresql Таблица с использованием следующего запроса. Приложение загрузчика написано в Java и все конфигурации передаются с использованием файла свойств:

-- CREATE EXTERNAL TABLE FOR A SPECIFIC CLIENT
CREATE  EXTERNAL TABLE outTable (  col1 character(3), col2 
character(3),..... )
LOCATION ( '<LocationOf outFile>' )
FORMAT    'CUSTOM' (formatter=fixedwidth_in,col1='3',col2='3'......)
LOG ERRORS INTO errorTable SEGMENT REJECT LIMIT 2 ROWS;

-- INSERT INTO DELTA TABLE
INSERT  INTO deltaTable
SELECT  col1, col2,......
FROM    outTable
;

-- DROP EXTERNAL TABLE
DROP  EXTERNAL TABLE IF EXISTS outTable;

Запуск этого на UNIX коробка бросает мне исключение:

Cause: org.postgresql.util.PSQLException: ERROR: Segment reject limit reached. Aborting operation. Last error was: Expected line size from the formatting string: 1655, but the actual size is: 455  (seg43 slice1 uxpbdpsdw06.dstcorp.net:1028 pid=335160)

Примечание. Каждая строка в outFile содержит 1655 символов. Структура столбцов outTable и deltaTable также 1655. Когда я проверяю в errorTable, я нахожу это в errmsg колонка:

invalid byte sequence for encoding "UTF8": 0x00

Теперь я предполагаю, что база данных не принимает null персонажи '0x00' в файле из-за свойств кодировки БД, который я проверял 'UTF8'

Я попытался удалить нулевые символы из файла, используя следующие команды bash:

sed 's/\x0/-9/g' outFile > outFile_

&

tr < outFile -d '\000' > outFile_

но ничего не сработало до сих пор. Может кто-нибудь, пожалуйста, добавить какое-нибудь предложение о том, как сделать эту работу?

-

Заранее спасибо!

1 ответ

В большинстве случаев эта конкретная ошибка встречается всякий раз, когда данные имеют непечатаемый характер. Я рекомендую заменить непечатный символ пробелом и выполнить запрос

Другие вопросы по тегам