Ошибка при выполнении действия U-SQL в конвейере в фабрике данных Azure

Я получаю следующую ошибку при выполнении действия USQL в конвейере в ADF:

Ошибка в действии:

{"errorId":"E_CSC_USER_SYNTAXERROR","severity":"Error","component":"CSC",
    "source":"USER","message":"syntax error.
     Final statement did not end with a semicolon","details":"at token 'txt', line 3\r\nnear the ###:\r\n**************\r\nDECLARE @in string = \"/demo/SearchLog.txt\";\nDECLARE @out string = \"/scripts/Result.txt\";\nSearchLogProcessing.txt ### \n",
    "description":"Invalid syntax found in the script.",
    "resolution":"Correct the script syntax, using expected token(s) as a guide.","helpLink":"","filePath":"","lineNumber":3,
    "startOffset":109,"endOffset":112}].

Вот код набора выходных данных, конвейера и сценария USQL, который я пытаюсь выполнить в конвейере.

Набор выходных данных:

{
"name": "OutputDataLakeTable",
"properties": {
    "published": false,
    "type": "AzureDataLakeStore",
    "linkedServiceName": "LinkedServiceDestination",
    "typeProperties": {
        "folderPath": "scripts/"
    },
    "availability": {
        "frequency": "Hour",
        "interval": 1
    }
}

Трубопровод:

{
    "name": "ComputeEventsByRegionPipeline",
    "properties": {
        "description": "This is a pipeline to compute events for en-gb locale and date less than 2012/02/19.",
        "activities": [
            {
                "type": "DataLakeAnalyticsU-SQL",
                "typeProperties": {
                    "script": "SearchLogProcessing.txt",
                    "scriptPath": "scripts\\",
                    "degreeOfParallelism": 3,
                    "priority": 100,
                    "parameters": {
                        "in": "/demo/SearchLog.txt",
                        "out": "/scripts/Result.txt"
                    }
                },
                "inputs": [
                    {
                        "name": "InputDataLakeTable"
                    }
                ],
                "outputs": [
                    {
                        "name": "OutputDataLakeTable"
                    }
                ],
                "policy": {
                    "timeout": "06:00:00",
                    "concurrency": 1,
                    "executionPriorityOrder": "NewestFirst",
                    "retry": 1
                },
                "scheduler": {
                    "frequency": "Minute",
                    "interval": 15
                },
                "name": "CopybyU-SQL",
                "linkedServiceName": "AzureDataLakeAnalyticsLinkedService"
            }
        ],
        "start": "2017-01-03T12:01:05.53Z",
        "end": "2017-01-03T13:01:05.53Z",
        "isPaused": false,
        "hubName": "denojaidbfactory_hub",
        "pipelineMode": "Scheduled"
    }
}

Вот мой сценарий USQL, который я пытаюсь выполнить, используя тип действия «DataLakeAnalyticsU-SQL».

@searchlog =
    EXTRACT UserId          int,
            Start           DateTime,
            Region          string,
            Query           string,
            Duration        int?,
            Urls            string,
            ClickedUrls     string
    FROM @in
    USING Extractors.Text(delimiter:'|');

@rs1 =
    SELECT Start, Region, Duration
    FROM @searchlog
WHERE Region == "kota";


OUTPUT @rs1   
    TO @out
      USING Outputters.Text(delimiter:'|');

Подскажите, пожалуйста, как решить эту проблему.


person Jai    schedule 03.01.2017    source источник


Ответы (3)


В вашем скрипте отсутствует атрибут scriptLinkedService. Вам также (в настоящее время) необходимо поместить сценарий U-SQL в хранилище BLOB-объектов Azure для его успешного запуска. Поэтому вам также понадобится AzureStorage Связанная служба, например:

{
    "name": "StorageLinkedService",
    "properties": {
        "description": "",
        "type": "AzureStorage",
        "typeProperties": {
            "connectionString": "DefaultEndpointsProtocol=https;AccountName=myAzureBlobStorageAccount;AccountKey=**********"
        }
    }
}

Создайте эту связанную службу, заменив имя хранилища BLOB-объектов myAzureBlobStorageAccount на соответствующую учетную запись хранилища BLOB-объектов, затем поместите сценарий U-SQL (SearchLogProcessing.txt) в контейнер и повторите попытку. В моем примере конвейера ниже у меня есть контейнер с именем adlascripts в моем хранилище BLOB-объектов, и сценарий находится там:

Убедитесь, что scriptPath заполнен, как сказал Александр. Начало конвейера:

{
    "name": "ComputeEventsByRegionPipeline",
    "properties": {
        "description": "This is a pipeline to compute events for en-gb locale and date less than 2012/02/19.",
        "activities": [
            {
                "type": "DataLakeAnalyticsU-SQL",
                "typeProperties": {
                    "scriptPath": "adlascripts\\SearchLogProcessing.txt",
                    "scriptLinkedService": "StorageLinkedService",
                    "degreeOfParallelism": 3,
                    "priority": 100,
                    "parameters": {
                        "in": "/input/SearchLog.tsv",
                        "out": "/output/Result.tsv"
                    }
                },
...

Файлы input и output .tsv могут находиться в озере данных и использовать связанную службу AzureDataLakeStoreLinkedService.

Я вижу, вы пытаетесь следить за демонстрацией из: https://docs.microsoft.com/en-us/azure/data-factory/data-factory-usql-activity#script-definition. Это не самая интуитивно понятная демонстрация, и, похоже, есть некоторые проблемы, например, где определение для StorageLinkedService ?, где SearchLogProcessing.txt? Хорошо, я нашел его в Google, но на веб-странице должна быть ссылка. Я заставил его работать, но почувствовал себя Гарри Поттером в «Принце-полукровке».

person wBob    schedule 03.01.2017
comment
Спасибо, wbob. У меня это сработало. Но мы можем использовать только хранилище Azure в службе, связанной со сценарием, а не хранилище озера данных Azure. - person Jai; 04.01.2017
comment
Да, при попытке сохранить сценарий U-SQL в ADLS у меня возникла очень специфическая (и необычайно полезная) ошибка: scriptLinkedService AzureDataStoreLinkedService не поддерживается. В настоящее время scriptLinkedService может принимать только связанную службу хранилища Azure. Используйте связанную службу хранилища Azure и вместо этого поместите свой сценарий в большой двоичный объект. - person wBob; 04.01.2017
comment
Отличное расследование, Гарри-Боб :) - person Alexandre Gattiker; 05.01.2017
comment
Если вы думали об использовании подписи общего доступа для доступа к корзине со сценариями, чтобы вам не приходилось иметь дело с ключами учетной записи, позвольте мне сэкономить время, указав, что это тоже не работает, то же сообщение об ошибке как указано выше. Однако URL-адрес SAS отлично работает в браузере! - person Gavin Campbell; 04.05.2017

Удалите атрибут script в определении действия U-SQL и укажите полный путь к сценарию (включая имя файла) в атрибуте scriptPath.

Ссылка: https://docs.microsoft.com/en-us/azure/data-factory/data-factory-usql-activity.

person Alexandre Gattiker    schedule 03.01.2017
comment
Если я не использую атрибут сценария, это дает мне ошибку, что сценарий U-SQL не найден, используйте сценарий или scriptLinkedService. Итак, я должен использовать там атрибут скрипта. - person Jai; 03.01.2017
comment
Я использовал скрипты \\ SearchLogProcessing.txt, и этот же файл присутствовал в ADLS. Тем не менее, я получал сообщение об ошибке, что сценарий USQL не найден. - person Jai; 03.01.2017
comment
Используйте scripts/SearchLogProcessing.txt (косая черта) - person Alexandre Gattiker; 03.01.2017

У меня была аналогичная проблема, когда фабрика данных Azure не распознавала мои файлы сценариев. Один из способов избежать этой проблемы, не вставляя при этом большого количества кода, - это зарегистрировать хранимую процедуру. Сделать это можно так:

DROP PROCEDURE IF EXISTS master.dbo.sp_test;
CREATE PROCEDURE master.dbo.sp_test() 
AS  
BEGIN 

@searchlog =
EXTRACT UserId          int,
        Start           DateTime,
        Region          string,
        Query           string,
        Duration        int?,
        Urls            string,
        ClickedUrls     string
FROM @in
USING Extractors.Text(delimiter:'|');

@rs1 =
    SELECT Start, Region, Duration
    FROM @searchlog
WHERE Region == "kota";


OUTPUT @rs1   
    TO @out
      USING Outputters.Text(delimiter:'|');
END;

После запуска вы можете использовать

"script": "master.dbo.sp_test()"

в определении вашего конвейера JSON. Всякий раз, когда вы обновляете сценарий U-SQL, просто повторно запускайте определение процедуры. Тогда не нужно будет копировать файлы сценариев в хранилище BLOB-объектов.

person Øystein S    schedule 26.02.2017