2017-01-03 2 views
3

Ich erhalte Fehler folgenden, während eine USQL Aktivität läuft in der Pipeline in ADF:Fehler beim USQL Aktivität in Pipeline in Azure Daten Fabrik läuft

Fehler bei Aktivität:

{"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}]. 

Hier ist die Code des Ausgabe-Datasets, der Pipeline und des USQL-Skripts, die ich in der Pipeline ausführen möchte.

OutputDataset:

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

Pipeline:

{ 
    "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" 
    } 
} 

Hier ist mein USQL Script, das ich "DataLakeAnalyticsU-SQL" Leistungsart auszuführen versuchen verwenden.

@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:'|'); 

Bitte schlagen Sie mir vor, wie Sie dieses Problem beheben können.

Antwort

7

Ihr Skript das scriptLinkedService Attribut fehlt. Sie müssen (derzeit) das U-SQL-Skript in Azure Blob Storage platzieren, um es erfolgreich auszuführen. Daher müssen Sie auch einen AzureStorage Linked-Service, zum Beispiel:

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

Erstellen Sie diesen verknüpften Service, den Namen Blob Storage ersetzt myAzureBlobStorageAccount mit entsprechendem Blob Storage-Konto, dann den U-SQL-Skript (SearchLogProcessing.txt) in ein Container dort und versuche es noch einmal. In meiner Beispiel-Pipeline habe ich einen Container namens adlascripts in meinem Blob-Speicher und das Skript ist dort:

Stellen Sie sicher, dass die scriptPath abgeschlossen ist, wie Alexandre erwähnt. Start der Pipeline:

{ 
    "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" 
        } 
       }, 
... 

Die input und output .tsv-Dateien können im Daten See und die den AzureDataLakeStoreLinkedService verknüpft Dienst nutzen.

Ich kann sehen, Sie versuchen, die Demo von folgen: https://docs.microsoft.com/en-us/azure/data-factory/data-factory-usql-activity#script-definition. Es ist nicht die intuitivste Demo und es scheint einige Probleme zu geben, wie ist die Definition für StorageLinkedService? Wo ist SearchLogProcessing.txt? OK, ich habe es gefunden, aber es sollte einen Link in der Webseite geben. Ich habe es zur Arbeit gebracht, fühlte mich aber ein bisschen wie Harry Potter im Halbblutprinz.

+0

Danke wbob. Es hat gut für mich funktioniert. Aber wir können nur Azure Storage im skriptverknüpften Service verwenden, nicht im azure Data Lake Store. – Jai

+0

Ja, ich habe einen sehr spezifischen (und ungewöhnlich hilfreichen) Fehler beim Speichern des U-SQL-Skripts in ADLS erhalten: "scriptLinkedService' AzureDataStoreLinkedService' wird nicht unterstützt. Derzeit kann scriptLinkedService nur einen mit Azure Storage verknüpften Dienst akzeptieren. Bitte verwenden Sie Azure Speichern Sie den verknüpften Dienst und legen Sie stattdessen Ihr Skript in den Blob. " – wBob

+0

Große Untersuchung, Harry-Bob :) –

1

Entfernen Sie das Attribut script in Ihrer U-SQL-Aktivitätsdefinition und geben Sie den vollständigen Pfad zu Ihrem Skript (einschließlich des Dateinamens) im Attribut scriptPath an.

Referenz: https://docs.microsoft.com/en-us/azure/data-factory/data-factory-usql-activity

+0

Wenn ich Skript-Attribut nicht verwenden, dann gibt es mir einen Fehler, dass U-SQL-Skript nicht gefunden wird, verwenden Sie Skript oder scriptLinkedService. Also, ich muss dort Skript-Attribut verwenden. – Jai

+0

Ich habe die "scripts \\ SearchLogProcessing.txt" verwendet und die gleiche Datei war in ADLS vorhanden. Trotzdem habe ich den Fehler erhalten, dass das USQL-Skript nicht gefunden wurde. – Jai

+0

Verwenden Sie 'scripts/SearchLogProcessing.txt' (Schrägstrich) –

1

Ich hatte ein ähnliches Problem, bei dem Azure Data Factory meine Skriptdateien nicht erkannte. Eine Möglichkeit, das gesamte Problem zu vermeiden, ohne viel Code einfügen zu müssen, besteht darin, eine gespeicherte Prozedur zu registrieren.Sie können es wie folgt tun:

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; 

Danach läuft, können Sie

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

in Ihrer JSON Pipeline-Definition verwenden. Wenn Sie das U-SQL-Skript aktualisieren, führen Sie einfach erneut die Definition der Prozedur aus. Dann müssen Skriptdateien nicht in Blob Storage kopiert werden.

Verwandte Themen