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

Я хочу вызвать api rest и сохранить результаты в виде файла 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 строк (определяется параметром & num с максимальным значением 1000). После первого запроса я могу использовать параметр & next-для получения следующих 1000 строк на основе идентификатора. Например, URL

http://testWebservice123.com/Example.csv?auth=abc&number=1000&next=1000

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

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

static void Main(string[] args)
    {


        string startUrl = "http://testWebservice123.com/Example.csv?auth=abc&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 = "&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-файл в озеро данных. Как переписать приведенный выше код для работы в функции Azure и сохранить в формате csv в озере данных Azure gen2?

1 Ответ

1 голос
/ 15 апреля 2019

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

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

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

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

Предварительные условия для доступа к ADLS с использованием вашего кода c #:

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

enter image description here

enter image description here

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

enter image description here

enter image description here

enter image description here

enter image description here

Ниже приведен код длясоздание клиента 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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...