0

У меня есть простой файл FD_GROUP.TXT с содержанием:Azure Factory Data - Массовый импорт из Blob в Azure SQL

~ 0100 ~^~ Молочные и яичные продукты ~
~ 0200 ~^~ Специи и травы ~
~ 0300 ~^~ детское питание ~
~ 0400 ~^~ Жиры и масла ~
~ 0500 ~^~ Птица Продукты ~

Я пытаюсь массового импорта этих файлов (некоторые с 700000 строк) в базу данных SQL с Azure Data Factory.

Стратегия состоит в том, чтобы сначала разграничивать столбцы с ^, затем я заменяю тильды (~) пустым символом, поэтому я теряю тильды (~), затем происходит вставка.

1. SQL решение:

DECLARE @CsvFilePath NVARCHAR(1000) = 'D:\CodePurehope\Dev\NutrientData\FD_GROUP.txt'; 

CREATE TABLE #TempTable 
(
    [FoodGroupCode] VARCHAR(666) NOT NULL, 
    [FoodGroupDescription] VARCHAR(60) NOT NULL 
) 

DECLARE @sql NVARCHAR(4000) = 'BULK INSERT #TempTable FROM ''' + @CsvFilePath + ''' WITH (FIELDTERMINATOR =''^'', ROWTERMINATOR =''\n'')'; 
EXEC(@sql); 

UPDATE #TempTable 
    SET [FoodGroupCode] = REPLACE([FoodGroupCode], '~', ''), 
     [FoodGroupDescription] = REPLACE([FoodGroupDescription], '~', '') 
GO 

INSERT INTO [dbo].[FoodGroupDescriptions] 
(
    [FoodGroupCode], 
    [FoodGroupDescription] 
) 
SELECT 
    [FoodGroupCode], 
    [FoodGroupDescription] 
FROM 
    #TempTable 
GO 

DROP TABLE #TempTable 

2. SSIS решение ETL пакет: enter image description here

Плоский исходный файл разграничить с ^ и производной преобразования столбца заменить ненужные тильды (~), как показано на фотографии выше.

Как вы это делаете с Microsoft Azure Data Factory?
У меня есть FD_GROUP.TXT загружены на Azure Storage Blob, как ввода и таблицы готовы на Azure SQL Server для выхода.

У меня:
- 2 связанных услуги: AzureStorage и AzureSQL.
- 2 набора данных: Blob в качестве входных данных и SQL в качестве выходного
- 1 трубопровода

enter image description here

FoodGroupDescriptionsAzureBlob настройки

{ 
    "name": "FoodGroupDescriptionsAzureBlob", 
    "properties": { 
     "structure": [ 
      { 
       "name": "FoodGroupCode", 
       "type": "Int32" 
      }, 
      { 
       "name": "FoodGroupDescription", 
       "type": "String" 
      } 
     ], 
     "published": false, 
     "type": "AzureBlob", 
     "linkedServiceName": "AzureStorageLinkedService", 
     "typeProperties": { 
      "fileName": "FD_GROUP.txt", 
      "folderPath": "nutrition-data/NutrientData/", 
      "format": { 
       "type": "TextFormat", 
       "rowDelimiter": "\n", 
       "columnDelimiter": "^" 
      } 
     }, 
     "availability": { 
      "frequency": "Minute", 
      "interval": 15 
     } 
    } 
} 

FoodGroupDescriptionsSQLAzure настройки

{ 
    "name": "FoodGroupDescriptionsSQLAzure", 
    "properties": { 
     "structure": [ 
      { 
       "name": "FoodGroupCode", 
       "type": "Int32" 
      }, 
      { 
       "name": "FoodGroupDescription", 
       "type": "String" 
      } 
     ], 
     "published": false, 
     "type": "AzureSqlTable", 
     "linkedServiceName": "AzureSqlLinkedService", 
     "typeProperties": { 
      "tableName": "FoodGroupDescriptions" 
     }, 
     "availability": { 
      "frequency": "Minute", 
      "interval": 15 
     } 
    } 
} 

FoodGroupDescriptionsPipeline настройки

{ 
    "name": "FoodGroupDescriptionsPipeline", 
    "properties": { 
     "description": "Copy data from a blob to Azure SQL table", 
     "activities": [ 
      { 
       "type": "Copy", 
       "typeProperties": { 
        "source": { 
         "type": "BlobSource" 
        }, 
        "sink": { 
         "type": "SqlSink", 
         "writeBatchSize": 10000, 
         "writeBatchTimeout": "60.00:00:00" 
        } 
       }, 
       "inputs": [ 
        { 
         "name": "FoodGroupDescriptionsAzureBlob" 
        } 
       ], 
       "outputs": [ 
        { 
         "name": "FoodGroupDescriptionsSQLAzure" 
        } 
       ], 
       "policy": { 
        "timeout": "01:00:00", 
        "concurrency": 1, 
        "executionPriorityOrder": "NewestFirst" 
       }, 
       "scheduler": { 
        "frequency": "Minute", 
        "interval": 15 
       }, 
       "name": "CopyFromBlobToSQL", 
       "description": "Bulk Import FoodGroupDescriptions" 
      } 
     ], 
     "start": "2015-07-13T00:00:00Z", 
     "end": "2015-07-14T00:00:00Z", 
     "isPaused": false, 
     "hubName": "gymappdatafactory_hub", 
     "pipelineMode": "Scheduled" 
    } 
} 

Эта вещь не работает на Azure Factory Data + я понятия не имею, как использовать заменить в этом контексте. Любая помощь оценивается.

+0

Что вы подразумеваете под «Не работает», вы получаете конкретную ошибку? Это одноразовый импорт или что-то, что вы планируете запланировать? – JustLogic

+0

Только один раз. Я имею в виду, что ничего не происходит. –

ответ

1

Я использую свой код, и я был в состоянии получить работу, выполнив следующие действия:

В вашем FoodGroupDescriptionsAzureBlob определения JSon, вам нужно добавить «внешним»: правда в узле свойств. Входной файл Blob был создан из внешнего источника, а не из конвейера фабрики данных Azure, установив его в true, что позволяет фабрике данных Azzure знать, что этот вход должен быть готов к использованию.

Также в определении ввода blob добавьте: «quoteChar»: «~» к узлу «format», так как похоже, что данные обернуты «~», это приведет к тому, что данные из данных будут удалены INT вы определили, правильно вставьте в свою таблицу sql.

Полное блоб Защиту:

{ 
"name": "FoodGroupDescriptionsAzureBlob", 
"properties": { 
    "structure": [ 
     { 
      "name": "FoodGroupCode", 
      "type": "Int32" 
     }, 
     { 
      "name": "FoodGroupDescription", 
      "type": "String" 
     } 
    ], 
    "published": false, 
    "type": "AzureBlob", 
    "linkedServiceName": "AzureStorageLinkedService", 
    "typeProperties": { 
     "fileName": "FD_Group.txt", 
     "folderPath": "nutrition-data/NutrientData/", 
     "format": { 
      "type": "TextFormat", 
      "rowDelimiter": "\n", 
      "columnDelimiter": "^", 
      "quoteChar": "~" 
     } 
    }, 
    "availability": { 
     "frequency": "Minute", 
     "interval": 15 
    }, 
    "external": true, 
    "policy": {} 
} 

}

Поскольку у вас есть интервал установки на каждые 15 мин и трубопроводы даты начала и окончания в течение всего дня, это создаст кусочек каждые 15 мин в течение весь трубопровод запуска продолжительности, так как вы только хотите, чтобы запустить этот раз изменить начало и конец такой:

"start": "2015-07-13T00:00:00Z", 
    "end": "2015-07-13T00:15:00Z", 

Это создаст 1 ломтик.

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

+0

Это работает. С какими-то конкретными источниками вы получили эти внешние и quoteChar-параметры? Если у вас несколько таблиц, и их нужно перенести в источник в указанном порядке из-за ограничений, можем ли мы это сделать? –

+0

Вот ссылка о проблемах с устранением проблем ADF: https://azure.microsoft.com/en-us/documentation/articles/data-factory-troubleshoot/. Это делает ссылку на установку внешнего на true. Вот ссылка о копировании из blob: https://azure.microsoft.com/en-us/documentation/articles/data-factory-azure-blob-connector/ Существует раздел на узле TextFormat, который имеет описание всех опций. – JustLogic

+0

Спасибо. Можно ли использовать запрос на замену, как в моих примерах, потому что я получаю сообщение об ошибке, где поле пусто: ** Операция копирования обнаружила ошибку пользователя: столбец «CarbohydratesFactor» содержит недопустимое значение «». Невозможно преобразовать '', чтобы ввести «Десятичный». ** –

Смежные вопросы