COPY INTO из Azure Dala lake gen2 в Azure Synapse ничего не делает - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь скопировать из azure озера данных gen2 в таблицу в azure хранилище синапсов, используя локальный ssms. Оператор COPY INTO не вызывает никаких ошибок и не сбрасывает данные. Я копирую pandas df с сервера centos в azure озеро данных gen2, используя sep=',', encoding='utf-8'. Вот оператор COPY, который я использую.

COPY INTO dbo.SALES_CUTOMER_D 
FROM 'https://acoount_name/test-file-system/SALES_CUSTOMER_D_0.csv'
WITH (
 FILE_TYPE = 'csv',
 CREDENTIAL=(IDENTITY= 'Storage Account Key', SECRET=''),
 FIELDQUOTE = '"',
 FIELDTERMINATOR=',',
 ROWTERMINATOR='\r\n',
 ENCODING = 'UTF8',
 FIRSTROW = 2
)

1 Ответ

0 голосов
/ 13 июля 2020

Проверьте, имеет ли ваш файл окончания строки в стиле Unix (LF) вместо Windows (CRLF).

См. Разница между типами разрыва строки CR LF, LF и CR ? , если вы не понимаете CRLF.

Самый простой способ проверки, который я знаю, - это открыть файл в vi в двоичном режиме с помощью set list:

vi -b -c 'set list' <file>

Чтобы проверить, является ли это проблемой, вы можете выполнить одно из следующих действий:

  1. Сообщите COPY, какие окончания строк находятся в вашем файле:

     COPY INTO dbo.SALES_CUTOMER_D 
     FROM 'https://acoount_name/test-file-system/SALES_CUSTOMER_D_0.csv'
     WITH (
        FILE_TYPE = 'csv',
        CREDENTIAL=(IDENTITY= 'Storage Account Key', SECRET=''),
        ROWTERMINATOR='0x0A',
        FIRSTROW = 2
     )
    
  2. Подтвердите, что он действительно читает файл, заставив его проанализировать заголовок. Удалить FIRSTROW = 2.

  3. Изменить окончания строк:

  • unix2dos <csv file>
  • загрузить в datalake и попробуйте снова COPY без ROWTERMINATOR='\r\n', (это значение по умолчанию).

Небольшая ошибка :

COPY внутренне обрабатывает '\ n' как '\ r \ n'. Для получения дополнительной информации см. Раздел ROWTERMINATOR.

Другими словами:

  • Если мы не указываем опцию ROWTERMINATOR или указываем ROWTERMINATOR=’\n’ или ROWTERMINATOR=’0x0D0A’ , тогда движок использует \r\n как терминатор (Windows стиль).
  • Если мы указываем ROWTERMINATOR=’0x0A’, тогда движок использует '\ n' в качестве терминатора (Unix стиль)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...