Использование функций Azure для вызова REST API и сохранения результатов в Azure Data Lake gen2

#c# #azure #azure-functions #azure-data-lake

#c# #azure #azure-функции #azure-data-lake

Вопрос:

Я хочу вызвать rest api и сохранить результаты в виде файла csv или json в Azure Data Lake Gen2. Основываясь на том, что я прочитал, функции Azure — это путь.

Веб-сервис возвращает данные в следующем формате:

 "ID","ProductName","Company"
"1","Apples","Alfreds futterkiste"
"2","Oranges","Alfreds futterkiste"
"3","Bananas","Alfreds futterkiste"
"4","Salad","Alfreds futterkiste"
 ...next rows
  

Я написал консольное приложение на C #, которое в данный момент выводит данные на консоль. Веб-сервис использует разбивку на страницы и возвращает 1000 строк (определяется параметром amp;num с максимальным значением 1000). После первого запроса я могу использовать amp;next-параметр для извлечения следующих 1000 строк на основе идентификатора. Например, URL-адрес

 http://testWebservice123.com/Example.csv?auth=abcamp;number=1000amp;next=1000
  

я получу строки с идентификатором от 1001 до 2000.
(вызов API и разбивка на страницы в действительности немного сложнее, и поэтому я не могу использовать, например, Azure Data Factory_v2 для загрузки в Azure Data Lake — вот почему я думаю, что мне нужны функции Azure — если я не пропустил другой сервис ??. Итак, ниже приведена просто демонстрация, чтобы узнать, как записывать данные в Azure Data Lake.)

У меня есть следующий C#:

 static void Main(string[] args)
    {


        string startUrl = "http://testWebservice123.com/Example.csv?auth=abcamp;number=1000";
        string url = "";
        string deltaRequestParameter = "";
        string lastLine;
        int numberOfLines = 0;

        do
        {
            url = startUrl   deltaRequestParameter;
            WebClient myWebClient = new WebClient();

            using (Stream myStream = myWebClient.OpenRead(url))
            {

                using (StreamReader sr = new StreamReader(myStream))
                {
                    numberOfLines = 0;
                    while (!sr.EndOfStream)
                    {
                        var row = sr.ReadLine();
                        var values = row.Split(',');

                        //do whatever with the rows by now - i.e. write to console
                        Console.WriteLine(values[0]   " "   values[1]); 

                        lastLine = values[0].Replace(""", ""); //last line in the loop - get the last ID.
                        numberOfLines  ;
                        deltaRequestParameter = "amp;next="   lastLine;
                    }

                }

            }
        } while (numberOfLines == 1001); //since the header is returned each time the number of rows will be 1001 until we get to the last request


    }
  

Я хочу записать данные в csv-файл в data-lake наиболее эффективным способом.
Как бы мне переписать приведенный выше код для работы в Azure Function и сохранить в формате csv в Azure data Lake gen2?

Ответ №1:

Вот шаги, которые вам нужно выполнить для достижения результата:

1) Создайте функцию Azure и запустите, вы можете сохранить ее HTTPTrigger / TimerTrigger или в соответствии с вашими потребностями.

2) Я предполагаю, что у вас есть код для вызова api в цикле, пока он не даст вам желаемый результат.

3) После того, как у вас есть данные в памяти, вам нужно написать следующий код, чтобы записать его в Azure data lake.

Обязательное условие для доступа к ADL с использованием вашего кода на c #:

1) Зарегистрируйте приложение в Azure AD

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

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

Предоставить разрешение в хранилище озера данных

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

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

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

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

Ниже приведен код для создания ADLS-клиента.

 // ADLS connection 
                var adlCreds = GetCreds_SPI_SecretKey(tenantId, ADL_TOKEN_AUDIENCE, serviceAppIDADLS, servicePrincipalSecretADLS);
                var adlsClient = AdlsClient.CreateClient(adlsName, adlCreds);



private static ServiceClientCredentials GetCreds_SPI_SecretKey(string tenant,Uri tokenAudience,string clientId,string secretKey)
        {
            SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
            var serviceSettings = ActiveDirectoryServiceSettings.Azure;
            serviceSettings.TokenAudience = tokenAudience;
            var creds = ApplicationTokenProvider.LoginSilentAsync(tenant,clientId,secretKey,serviceSettings).GetAwaiter().GetResult();
            return creds;
        }
  

Наконец, напишите реализацию для сохранения файла в Azure data lake

  const string delim = ",";
        static string adlsInputPath = ConfigurationManager.AppSettings.Get("AdlsInputPath");

public static void ProcessUserProfile(this SampleProfile, AdlsClient adlsClient, string fileNameExtension = "")
        {
            using (MemoryStream memStreamProfile = new MemoryStream())
            {
                using (TextWriter textWriter = new StreamWriter(memStreamProfile))
                {
                    string profile;
                    string header = Helper.GetHeader(delim, Entities.FBEnitities.Profile);
                    string fileName = adlsInputPath   fileNameExtension   "/profile.csv";
                    adlsClient.DataLakeFileHandler(textWriter, header, fileName);
                    profile = socialProfile.UserID                                                
                                      delim   socialProfile.Profile.First_Name
                                      delim   socialProfile.Profile.Last_Name
                                      delim   socialProfile.Profile.Name
                                      delim   socialProfile.Profile.Age_Range_Min
                                      delim   socialProfile.Profile.Age_Range_Max
                                      delim   socialProfile.Profile.Birthday
                                   ;

                    textWriter.WriteLine(profile);
                    textWriter.Flush();
                    memStreamProfile.Flush();
                    adlsClient.DataLakeUpdateHandler(fileName, memStreamProfile);
                }
            }
        }
  

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