Сбой копирования конвейера фабрики данных Azure, если более 6 столбцов - PullRequest
1 голос
/ 17 октября 2019

Я пытаюсь скопировать данные из представления в локальном PostgeSQL или MSSQL в таблицу в Azure PostgreSQL. Кажется, я не могу заставить это успешно копировать, когда я сопоставляю более 6 столбцов из источника в приемник.

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

Если я копирую в промежуточный файл csv, я могу успешно импортировать / экспортировать неограниченное количество столбцов.

Вывод ошибки в ADFконсоль последовательно: «Операция на целевом объекте Copy_7dp завершилась неудачно: Type = Npgsql.PostgresException, Message = 08P01: неверный формат сообщения, Source = Npgsql, '"

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

После обсуждения с командой ADF в Microsoft они разъяснили мне тот факт, что Postgresql имеет 16-битное ограничение на число элементов, которые могут быть записаны одновременно. то есть, если (размер строки * размер столбца)> 65536, это вызовет эту ошибку.

Решение состоит в том, чтобы просто уменьшить «Размер пакета записи» в свойствах Sink операции копирования данных , например, это изображение

0 голосов
/ 18 октября 2019

Вывод ошибки, отображаемый в консоли ADF, постоянно: «Операция с целевым объектом Copy_7dp не выполнена: Type = Npgsql.PostgresException, Message = 08P01: неверный формат сообщения, Source = Npgsql, '"

Вы можете найти некоторые подсказки в этом старом случае , которое похоже на вашу трассировку ошибок. Смотрите решение в приведенной выше ссылке: https://github.com/npgsql/npgsql/issues/189#issuecomment-67001166

По сути, если строковое значение, которое мы пытаемся сохранить с помощью Npgsql, было получено из MemoryStream.GetBuffer (), оно взорвется, но если оно получено из MemoryStream.ToArray () он будет работать нормально.

Это объясняется в официальном документе :

Обратите внимание, что буфер содержит выделенные байты, которые могут быть неиспользованными. Например, если строка «test» записана в объект MemoryStream, длина буфера, возвращаемого из GetBuffer, составляет 256, а не 4, при этом 252 байта не используются. Чтобы получить только данные в буфере, используйте метод ToArray;однако ToArray создает копию данных в памяти.

Однако я подозреваю, что это дефект коннектора ADF Postgresql, и мы не смогли настроить какой-либо исходный код передачи на уровне использования. (Конечно, вы могли быотправьте отзыв в команду Azure Adf, чтобы получить официальное заявление)

На данный момент, в качестве обходного пути, вы можете использовать CSV-файл в качестве посредника. Перенос данных из локальной базы данных в файлы CSV в хранилище BLOB-объектов Azure. Затем перенесите данные в базу данных postgresql назначения.

...