[英]Copy file from one DataLake Gen2 to another Data Lake Gen 2 via C# in Azure Functions
[英]Using Azure Functions to call REST API and save results in Azure Data Lake gen2
我想调用rest api并将结果保存为Azure Data Lake Gen2中的csv或json文件。 基于我所读到的,Azure功能是最佳选择。
webservice返回如下格式的数据:
"ID","ProductName","Company"
"1","Apples","Alfreds futterkiste"
"2","Oranges","Alfreds futterkiste"
"3","Bananas","Alfreds futterkiste"
"4","Salad","Alfreds futterkiste"
...next rows
我在C#中编写了一个控制台应用程序,目前将数据输出到控制台。 Web服务使用分页并返回1000行(由&num-parameter确定,最大值为1000)。 在第一个请求之后,我可以使用&next-parameter根据ID获取接下来的1000行。 例如网址
http://testWebservice123.com/Example.csv?auth=abc&number=1000&next=1000
将从ID 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=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文件到data-lake。 如何重写上述代码以在Azure Function中工作并保存到Azure数据湖gen2中的csv?
以下是实现结果所需的步骤:
1)创建一个azure函数并触发你可以保持HTTPTrigger / TimerTrigger,或根据你的需要。
2)我假设你有代码在循环中调用api,直到它给你想要的结果。
3)在内存中存储数据后,必须编写以下代码才能将其写入Azure数据湖。
使用c#代码访问ADLS的先决条件:
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数据湖中
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);
}
}
}
希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.