2017-05-10 4 views
0

Situation: Wir haben Datenbank sagen "CLSTrackOMeter" und Tabelle sagen "Customer_Information" in Azure Data Lake Analytics.Können wir Dokumente/Bilder nicht mit USQL Custom Code und usql hochladen?

Customer_Information, speichert den Pfad des Bildes im Staging-Ordner (für jetzt habe ich den Quell-Image-Pfad in der Klassenbibliothek hart Code).

Agenda: diesen Wert von CustInfo verwenden, um Daten zu Azure Daten See store "Customer_Image" -Ordner

Versuchte Lösung hochladen - Erstellt usql Klassenbibliothek mit .net sdk, um Dateien hochladen (Fähig Führen Sie diese Klassenbibliothek in der Konsolenanwendung aus und implementieren Sie sie im azure-Data-Lake-Store. - neue USQL Skript hinzugefügt und diese Klasse Bibliothek verwiesen

  • Called Klassenbibliothek in cs-Datei von usql Skript

Code of Klassenbibliothek

using Microsoft.Analytics.Interfaces; 
    using Microsoft.Analytics.Types.Sql; 
    using System; 
    using System.Collections.Generic; 
    using System.IO; 
    using System.Linq; 
    using System.Text; 
    using Microsoft.Azure.Management.DataLake.Store; 
    using Microsoft.Azure.Management.DataLake.Store.Models; 
    using Microsoft.IdentityModel.Clients.ActiveDirectory; 
    using Microsoft.Rest.Azure.Authentication; 
    using Microsoft.Azure.Management.DataLake.StoreUploader; 
    using System.Threading; 
    using System.Diagnostics; 
    using System.Collections; 
    using System.Threading.Tasks; 

    namespace USQLCSharpProject1 
    { 
     public static class Program 
     { 
      private static DataLakeStoreAccountManagementClient _adlsClient; 
      private static DataLakeStoreFileSystemManagementClient _adlsFileSystemClient; 

      private static string _adlsAccountName; 
      private static string _resourceGroupName; 
      private static string _location; 
      private static string _subId; 

      //private static void Main(string[] args) 
      public static string UploadFileWithS2S_WithClientSecret(string s) 
      { 

       try 
       { 
        _adlsAccountName = "<DATA-LAKE-STORE-NAME>"; // TODO: Replace this value with the name of your existing Data Lake Store account. 
        _resourceGroupName = "<RESOURCE-GROUP-NAME>"; // TODO: Replace this value with the name of the resource group containing your Data Lake Store account. 
        _location = "East US 2"; 
        _subId = "<SUBSCRIPTION-ID>"; 



        string localFolderPath = @"D:\Harry\PSR\study\TEST"; // TODO: Make sure this exists and can be overwritten. 
        string localFilePath = Path.Combine(localFolderPath, "fileTwo.txt"); // TODO: Make sure this exists and can be overwritten. 
        string remoteFolderPath = "/Samples/OUTPUT"; 
        //string remoteFilePath = Path.Combine(remoteFolderPath, "file.txt"); 


        // Service principal/appplication authentication with client secret/key 
// Use the client ID of an existing AAD "Web App" application. 
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext()); 

var domain = "<AAD-directory-domain>"; 
var webApp_clientId = "<AAD-application-clientid>"; 
var clientSecret = "<AAD-application-client-secret>"; 
var clientCredential = new ClientCredential(webApp_clientId, clientSecret); 
var creds = ApplicationTokenProvider.LoginSilentAsync(domain,clientCredential).Result; 









        // Create client objects and set the subscription ID 
        _adlsClient = new DataLakeStoreAccountManagementClient(creds) { SubscriptionId = _subId }; 
        _adlsFileSystemClient = new DataLakeStoreFileSystemManagementClient(creds); 

        var parameters = new UploadParameters(localFolderPath, remoteFolderPath, _adlsAccountName, isOverwrite: true); // the default maxSegmentLength is 256M, we can set by ourself. 
        var frontend = new DataLakeStoreFrontEndAdapter(_adlsAccountName, _adlsFileSystemClient); 
        var uploader = new DataLakeStoreUploader(parameters, frontend); 
        uploader.Execute(); 
        return s; 
       } 

       catch (Exception ex) 
       { 
        return ""; 
       } 
      } 


     } 
    } 

Code of Usql

USE CLSTrackOMeter; 
REFERENCE ASSEMBLY USQLCSharpProject1; 
@result = 
    SELECT USQLUploadFile.myFirstClass.myFirstFunction(AgeGender)AS myFirstFunction_CB 
    FROM CLSTrackOMeter.dbo.Customer_Information; 

Code of USQL cs Datei

using Microsoft.Analytics.Interfaces; 
using Microsoft.Analytics.Types.Sql; 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 

namespace USQLUploadFile 
{ 
    public class myFirstClass 
    { 
     public static string myFirstFunction(string s) 
     { 
      try 
      { 

       string aa = USQLCSharpProject1.Program.UploadFileWithS2S_WithClientSecret("rajni"); 
       return aa; 

      } 
      catch (Exception ex) 
      { 
       return ""; 
      } 




     } 
    } 
} 

Projekt Bild enter image description here

Fehler Bild enter image description here

Fehler Bei der Verwendung von PROCESS Expression

USQL-Code für PROCESS Expression

USE CLSTrackOMeter; 
REFERENCE ASSEMBLY USQLCSharpProject1; 
    @result = SELECT AgeGender 
    FROM CLSTrackOMeter.dbo.Customer_Information; 

    @rs= 
    PROCESS @result 
    PRODUCE AgeGender 
    USING new USQLUploadFile.myFirstClass(); 


    OUTPUT @rs 
    TO "/output/Harry.csv" 
     USING Outputters.Csv(); 

USQL CS Datei Prozess Expression-Code

using Microsoft.Analytics.Interfaces; 
using Microsoft.Analytics.Types.Sql; 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 

namespace USQLUploadFile 
{ 
    [SqlUserDefinedProcessor] 
    public class myFirstClass : IProcessor 
    { 
     public override IRow Process(IRow input, IUpdatableRow output) 
     { 
      try 
      { 
       string AgeGender = input.Get<string>("AgeGender"); 
       //USQLCSharpProject1.Class1 obj = new ClassLibrary1.Class1(); 
       //string aa = USQLCSharpProject1.Program.UploadFileWithS2S_WithClientSecret("rajni"); 
       //return aa; 
       string aa=USQLCSharpProject1.Program.UploadFileWithS2S_WithClientSecret("AgeGender"); 
       output.Set<string>("AgeGender", AgeGender); 
       return output.AsReadOnly(); 

       //return obj.newTest(s); 
      } 
      catch (Exception ex) 
      { 
       return null; 

      } 



     } 
    } 
} 

Zusatz:

Nach Registrierung.Net SDK-Bibliotheken und sie in USQL Bezug

Jobs, zeigt unten Text in Ausgabe

System.InvalidOperationException: Collection was modified; enumeration operation may not execute. 
    at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource) 
    at System.Collections.Generic.List`1.Enumerator.MoveNextRare() 
    at System.Collections.Generic.List`1.Enumerator.MoveNext() 
    at Microsoft.Cosmos.ScopeStudio.VsExtension.ProjectSystem.ScopeProjectNode.get_ReferenceInfoList() 
    at Microsoft.Cosmos.ScopeStudio.BusinessObjects.Common.ScriptToProjectTable.GetProjectReferenceList(String scriptFilePath) 
    at Microsoft.Cosmos.ScopeStudio.UserInterface.SQLIP.BaseSubmissionViewModel`1.GetScriptContentsWithReference(ProductFunctionType productType) 
    at Microsoft.Cosmos.ScopeStudio.UserInterface.SQLIP.DataLakeJobSubmissionViewModel`1.DoJobSubmission() 

Hinzufügen weitere Referenz Img enter image description here

Register Assembly in ADLS enter image description here

Antwort

2

Ich bin ein bisschen verwirrt in was Sie versuchen zu erreichen. Versuchen Sie, die Azure SDK-Aufrufe innerhalb eines benutzerdefinierten U-SQL-Operators aufzurufen? Dies wird nicht funktionieren, da die U-SQL-Container das Aufrufen von Web-Service-APIs, einschließlich der REST-APIs von Data Lake, nicht zulassen.

+0

Ich denke, es kann lokal laufen und schließlich ist es, aber nicht auf ADLS, beim Lesen einer Ihrer Antwort https://social.msdn.microsoft.com/Forums/en-US/01a3a359-4f13-4535-8a59-e32acbdcf77e/from-ac-usql-class-assembly-make-a-external-http-web-request-to-get-geo-location-from-ip? forum = AzureDataLake –

+0

So gibt es keine Möglichkeit, wenn ich mein Bild speichern Pfad in einer ADLA-Tabelle, sagen wir mit dem Wert "/sample/image/image1.jpg", und möchten diesen Pfad für die Verschiebung in einen anderen Ordner in ADLS verwenden, sagen wir "/Customer/image/image1.jpg". Oder wenn ich das Bild auf diesem Pfad benötige, um es als Parameter für den kognitiven Dienst (FACE API) zu verwenden. –

+0

Der lokale Lauf wird nicht in einem Container ausgeführt, sodass er Sie nicht blockiert, wie dies bei den Servercontainern der Fall ist. Außerdem hat Ihr lokaler Rechner viele andere Optionen, um einen DDOS zu starten, daher ist es weniger wichtig, Sie davon abzuhalten, dies zu tun;). Sie können Daten auf viele verschiedene Arten kopieren. Ich bin immer noch nicht 100%, was genau Sie tun möchten, aber vorausgesetzt, Sie haben einen Pfad innerhalb einer Tabelle, die Sie in einem OUTPUT-Anweisungsziel verwenden möchten, müssen Sie ein Skript schreiben, um das Skript zu generieren, das OUTPUT und dann enthält Führe das generierte Skript aus. –

0

Sie möchten den PROCESS-Ausdruck verwenden (https://msdn.microsoft.com/library/en-us/Mt621322.aspx). Ein Prozessor kann null oder eine Ausgangszeile erzeugen.

Zusatz:

Darüber hinaus müssen Sie die abhängigen Module als Baugruppen registrieren, wie sie in Ihrem U-SQL-Skript verweisen (siehe https://docs.microsoft.com/en-us/azure/data-lake-analytics/data-lake-analytics-u-sql-programmability-guide#register-u-sql-assemblies):

REFERENCE ASSEMBLY [Microsoft.Azure.Management.DataLake.Store]; 
REFERENCE ASSEMBLY [Microsoft.Azure.Management.DataLake.StoreUploader]; 
REFERENCE ASSEMBLY [Microsoft.IdentityModel.Clients.ActiveDirectory]; 
REFERENCE ASSEMBLY [Microsoft.Rest.ClientRuntime]; 
REFERENCE ASSEMBLY [Microsoft.Rest.ClientRuntime.Azure]; 
REFERENCE ASSEMBLY [Microsoft.Rest.ClientRuntime.Azure.Authentication]; 
REFERENCE ASSEMBLY [Newtonsoft.Json]; 
+0

Ich habe gerade den Beitrag aktualisiert, nach dem Versuch PROCESS Ausdruck und immer noch Problem, jeder Vorschlag Alexandre, über was ich hier fehlt. –

+0

Können Sie die vollständige Ausnahme anzeigen? Sie haben eine MissingMethodException, fehlt Ihnen einige DLLs sind Ihre Assembly? –

+0

Fehler bei Ausgabe Schmerzen, während zusätzliche Schritte vorgeschlagen, aktualisiert Screenshot für das gleiche –

Verwandte Themen