#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);
}
}
}
Надеюсь, это поможет.