Разве мы не можем загружать документы / изображения с помощью пользовательского кода USQL и usql?

Ситуация: мы создали базу данных с надписью «CLSTrackOMeter» и таблицу с именем «Customer_Information» в аналитике озера данных Azure.

Customer_Information, хранит путь к изображению в промежуточной папке (пока я жестко запрограммировал путь к исходному изображению в библиотеке классов).

Повестка дня: используйте это значение из CustInfo для загрузки данных в папку Customer_Image хранилища озера данных Azure.

Пробное решение - создана библиотека классов usql с использованием .net sdk для загрузки файлов (возможность запускать эту библиотеку классов в консольном приложении) и развернута в хранилище озера данных Azure. - Добавлен новый скрипт USQL и указана ссылка на эту библиотеку классов.

  • Вызывается библиотека классов в cs-файле usql-скрипта

Библиотека кодов занятий

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


        }
    }

Код Usql

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

Код файла cs USQL

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




        }
    }
}

Изображение проекта  введите описание изображения здесь

Изображение ошибки  введите описание изображения здесь

Ошибка при использовании выражения PROCESS  введите описание изображения здесь

Код USQL для выражения PROCESS

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

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;

            }



        }
    }
}

дополнение:

После регистрации библиотек .Net SDK и ссылки на них в USQL

Отправка задания, отображается текст под текстом в выводе

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()

Добавление дополнительного эталонного изображения  введите описание изображения здесь

Зарегистрируйте сборку в ADLS  введите описание изображения здесь


person Harsimranjeet Singh    schedule 10.05.2017    source источник


Ответы (2)


Я немного озадачен тем, чего вы пытаетесь достичь. Вы пытаетесь вызвать вызовы пакета SDK для Azure из пользовательского оператора U-SQL? Это не сработает, поскольку контейнеры U-SQL не позволяют вызывать API-интерфейсы веб-служб, включая API-интерфейсы REST озера данных.

person Michael Rys    schedule 12.05.2017
comment
Я предполагаю, что он может работать локально, и в конечном итоге это так, но не в ADLS, пока читаете один из ваших ответов social.msdn.microsoft.com/Forums/en-US/ - person Harsimranjeet Singh; 12.05.2017
comment
Так что нет никакой возможности, если я сохраню свой путь к изображению в таблице ADLA, скажем, со значением /sample/image/image1.jpg и хочу использовать этот же путь для перемещения его в другую папку в ADLS, скажем, / Customer / image / image1.jpg. Или, если мне нужно, чтобы изображение на этом пути использовалось в качестве параметра для когнитивной службы (FACE API). - person Harsimranjeet Singh; 12.05.2017
comment
Локальный запуск не выполняется в контейнере, поэтому он не блокирует вас, как это делают контейнеры сервера. Кроме того, на вашем локальном компьютере есть много других возможностей для запуска DDOS, поэтому менее важно заблокировать вас от этого;). Вы можете копировать данные разными способами. Я все еще не на 100% то, что именно вы хотите сделать, но предполагая, что у вас есть путь внутри таблицы, который вы хотите использовать в цели оператора OUTPUT, вам нужно будет написать один скрипт для генерации скрипта, который содержит OUTPUT, а затем запустить сгенерированный скрипт. - person Michael Rys; 19.05.2017

Вы хотите использовать выражение PROCESS (https://msdn.microsoft.com/library/en-us/Mt621322.aspx). Процессор может производить ноль или одну строку вывода.

дополнение:

Кроме того, вам необходимо зарегистрировать зависимые модули как сборки, чтобы ссылаться на них в вашем сценарии U-SQL (см. 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];
person Alexandre Gattiker    schedule 10.05.2017
comment
Я только что обновил сообщение, попробовав выражение PROCESS, но все еще сталкиваюсь с проблемой, любым предложением Александра, о том, что мне здесь не хватает. - person Harsimranjeet Singh; 11.05.2017
comment
Можете показать полное исключение? У вас есть MissingMethodException, вам не хватает каких-то DLL, которые являются вашей сборкой? - person Alexandre Gattiker; 11.05.2017
comment
Получение ошибки при выводе боли при выполнении дополнительных шагов, обновленный снимок экрана для того же - person Harsimranjeet Singh; 11.05.2017
comment
Нажал "Дополнительно" и "Отправить задание", оно было успешно выполнено, но файл не был загружен. - person Harsimranjeet Singh; 11.05.2017
comment
Вам следует удалить блоки catch, которые принимают исключения. - person Alexandre Gattiker; 11.05.2017