Polybase на ADLS Gen2 - CSV-файл как источник не работает с ошибкой HdfsBridge :: recordReaderFillBuffer

Я впервые использую Polybase, и я пытаюсь загрузить образец файла CSV (с первой записью в качестве заголовка) из ADLS Gen2 в Synapse. Я уже создавал мастер-ключ раньше, поэтому больше не создавал его. Остальные шаги, которые я реализовал, следующие:

-- Step 1

CREATE DATABASE SCOPED CREDENTIAL access_cred
WITH
    IDENTITY = 'my_name',
    SECRET = '12345678910****==';

-- Step 2

CREATE EXTERNAL DATA SOURCE CreditCards
WITH
(
    TYPE = HADOOP,
    LOCATION = 'abfss://[email protected]',
    CREDENTIAL = access_cred
);

-- Step 3

CREATE EXTERNAL FILE FORMAT CC_FileFormat
WITH
(
    FORMAT_TYPE = DELIMITEDTEXT,
    FORMAT_OPTIONS
    (
        FIELD_TERMINATOR = ',',
        FIRST_ROW = 2,
        USE_TYPE_DEFAULT = FALSE
    )
);

--Step 4

CREATE SCHEMA ext;
CREATE SCHEMA cc;

--Step 5: Create External Table

CREATE EXTERNAL TABLE ext.creditcards (
    Card_Type_Full_Name varchar(50),
    Issuing_Bank varchar(50),
    Card_Number varchar(50),
    Card_Holder_Name varchar(50),
    CVV_CVV2 varchar(50),
    Issue_Date varchar(50),
    Expiry_Date varchar(50),
    Billing_Date varchar(50),
    Card_PIN varchar(50),
    Credit_Limit varchar(50)
)
WITH (LOCATION='/CreditCards/', --I've a folder 'CreditCards' inside which the 'Creditcards.csv` file sits
    DATA_SOURCE = CreditCards,  
    FILE_FORMAT = CC_FileFormat,
    REJECT_TYPE = VALUE,
    REJECT_VALUE = 0
);


--Step 6

CREATE TABLE cc.creditcards
WITH
(
    DISTRIBUTION = REPLICATE,
    CLUSTERED COLUMNSTORE INDEX
)
AS
SELECT * FROM ext.creditcards
OPTION (LABEL = 'CTAS : Load cc.creditcards');

Я не знаю, что делаю не так. Я пробовал просмотреть несколько сообщений в Интернете, но ничего не решает проблему, с которой я столкнулся. При попытке сделать SELECT * from <external_table> я получаю указанную ниже ошибку. (Это также ошибка, которую я получаю на шаге 6, поскольку я использую команду CTAS для загрузки моей финальной таблицы.)

Msg 107090, Level 16, State 1, Line 74
HdfsBridge::recordReaderFillBuffer - Unexpected error encountered filling record reader buffer: MalformedInputException: Input length = 1

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


person LearneR    schedule 12.06.2020    source источник


Ответы (1)


Решено: Оказалось, что эта ошибка была вызвана кодировкой файла. Исходный плоский файл, который я разместил на ADLS G2, был в ANSI, и мне просто пришлось повторно загрузить его, преобразовав в UTF8. После этого все заработало отлично.

Нашел этот совет в сообщении на форумах Microsoft: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/6a431c73-4575-4729-b7b5-9767e2a16c0e/external-table-error?forum=AzureSQLDataWarehouse

Для преобразования плоского файла ANSI в UTF8 (с помощью Блокнота): https://superuser.com/a/911373

person LearneR    schedule 15.06.2020