Как обрабатывать двойной разделитель каналов в фабрике данных Azure 2

Я работаю с файлом с разделителями, состоящим из двух каналов, который я хочу загрузить в базу данных SQL Azure через фабрику данных (2):

Column1||Column2||Column3

В моем наборе входных данных я указал двойной разделитель вертикальной черты как columnDelimiter в разделе формата typeProperties:

        "format": {
            "type": "TextFormat",
            "rowDelimiter": "\n",
            "columnDelimiter": "||",
            "skipLineCount": 2
        }

К сожалению, это не работает. Все строки помечены как «несовместимые», и в мою таблицу SQL не загружаются данные. Затем я попробовал несколько вещей. Если не указан какой-либо columnDelimiter, вся строка вставляется в первый столбец моей таблицы SQL, поэтому разделитель вообще не рассматривается. Это неверно, логически каждый элемент данных должен быть вставлен в отдельный столбец. Создание сценария || в Unicode также не помогло. При преобразовании моего входного файла в один канал с разделителями он отлично работает. Однако в конечном состоянии я не могу изменить входной файл, поэтому обработка двойного разделителя каналов имеет важное значение.


person Ilse    schedule 13.05.2018    source источник
comment
@IIse Если вы примете ответ, вы можете отметить его для справки на форуме.   -  person Jay Gong    schedule 25.05.2018


Ответы (2)


Вы можете либо попросить создателей вашего входного файла использовать один разделитель (как это делают большинство людей), либо вам придется выполнить некоторую предварительную обработку. Например, вы можете сделать это с помощью шага U-SQL, который исправляет файл, а затем импортирует этот файл в вашу базу данных SQL, например, какой-нибудь простой U-SQL:

// Multiple column delimiters
@input =
    EXTRACT 
        col1 string
    FROM "/input/input91.txt"
    USING Extractors.Text(delimiter:'~', skipFirstNRows:1);


// Do some other processing here?
@output  = SELECT col1.Replace("||", "|") AS col2 FROM @input;


OUTPUT @output
TO "/output/output.txt"
USING Outputters.Text(delimiter : '|', quoting : false);

NB. Здесь я использовал разделитель (тильда "~"), который, как я знаю, не встречается во входном файле, чтобы эффективно импортировать все столбцы как один столбец, а затем исправить его.

Есть ли особая причина, по которой вы используете два разделителя?

Кроме того, если ваш файл находится в хранилище BLOB-объектов, теперь вы можете BULK INSERT в базу данных SQL Azure, и, только что выполнив этот быстрый тест, BULK INSERT может справиться с несколькими разделителями, например

DROP TABLE IF EXISTS #tmp

CREATE TABLE #tmp (
    a VARCHAR(50),
    b VARCHAR(50),
    c VARCHAR(50),
)
GO

BULK INSERT #tmp
FROM 'D:\Data Lake\USQLDataRoot\input\input91.txt'
WITH ( FIELDTERMINATOR  = '||', DATA_SOURCE = '<yourDataSource>' );

См. здесь для получения дополнительной информации о шагах, связанных с созданием внешнего источника данных и учетных данных. Затем вы можете заставить фабрику данных использовать, например, задачу Stored Proc.

person wBob    schedule 14.05.2018

На основе разрешенные правила текстового формата, допускается только один символ. Я даже хочу использовать escape-разделитель, чтобы избежать этого, но он также должен быть забанен.

введите здесь описание изображения

Итак, похоже, вам нужно обработать свои данные перед копированием активности. Поскольку ADF поддерживает копирование данных из конечная точка HTTP, поэтому я предлагаю вам следующие шаги:

  1. Использование функций Azure для чтения файла в потоковом режиме построчно.

2. Заменить все символы "||" с '|' и укажите его в ответе (не забудьте '\ n')

3. ADF устанавливает разделитель столбцов на '|' и копировать данные из конечной точки HTTP.

Это решение может обрабатывать данные большого размера, конечно, если вы не хотите выполнять такую ​​сложную работу, вы можете обработать свои данные напрямую и сохранить их как временный файл для ADF.

Надеюсь, это поможет тебе.

person Jay Gong    schedule 14.05.2018