Как работать с двойным разделителем труб в Azure Data Factory 2 - PullRequest
0 голосов
/ 13 мая 2018

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

Column1 || Столбец2 || Column3

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

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

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

Есть мысли? Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Вы можете либо попросить создателей вашего входного файла использовать один разделитель (как это делают большинство людей), либо вам придется выполнить некоторую предварительную обработку.Например, вы можете сделать это с помощью шага 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>' );

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

0 голосов
/ 14 мая 2018

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

enter image description here

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...