У меня есть коллекция объектов List базового класса, полученная из сериализации JSON, и теперь, прежде чем я запишу данные в таблицу, мне нужно иметь копию данных в озере данных Azure. с приведенным ниже образцом кода я могу создать папку и образец файла. Пожалуйста, объясните, как записать данные непосредственно в список объектов коллекции в файл в ADLS.
Код:
Console.WriteLine("Folder Creation Started...");
Console.WriteLine("=============================================== = ");
var adlsAccountName = "sampledatalake";
var people = new List<Person> { new Person { FirstName = "John", LasttName = "Matthew"}, new Person { FirstName = "John", LasttName = "Smith" } };
var applicationId = "<Applicationid>";
var secretKey = "<secret key>";
var tenantId = "<tenantid>";
var creds = ApplicationTokenProvider.LoginSilentAsync(tenantId, applicationId, secretKey).Result;
var adlsFileSystemClient = new DataLakeStoreFileSystemManagementClient(creds, clientTimeoutInMinutes: 60);
var filePath = "/Sample/" + DateTime.Now.Year.ToString() + "/" + DateTime.Now.Month.ToString("00") + "/" + DateTime.Now.Day.ToString("00");
if (!adlsFileSystemClient.FileSystem.PathExists(adlsAccountName, filePath))
{
adlsFileSystemClient.FileSystem.Mkdirs(adlsAccountName, filePath);
}
adlsFileSystemClient.FileSystem.Create(adlsAccountName, filePath+"/Sample.txt", null, null, null, null, null);
================= РЕДАКТИРОВАТЬ ============
Это то, что я получаю при записи данных в файл в ADLS, дайте мне знать, есть ли какие-либо ограничения с этим подходом
var adlsAccountName = "sampledatalake";
var people = new List<Person> { new Person { FirstName = "John", LasttName = "Matthew"}, new Person { FirstName = "John", LasttName = "Smith" } };
var applicationId = "<Applicationid>";
var secretKey = "<secret key>";
var tenantId = "<tenantid>";
var creds = ApplicationTokenProvider.LoginSilentAsync(tenantId, applicationId, secretKey).Result;
var adlsFileSystemClient = new DataLakeStoreFileSystemManagementClient(creds, clientTimeoutInMinutes: 60);
var filePath = "/Sample/" + DateTime.Now.Year.ToString() + "/" + DateTime.Now.Month.ToString("00") + "/" + DateTime.Now.Day.ToString("00");
if (!adlsFileSystemClient.FileSystem.PathExists(adlsAccountName, filePath))
{
adlsFileSystemClient.FileSystem.Mkdirs(adlsAccountName, filePath);
}
adlsFileSystemClient.FileSystem.Create(adlsAccountName, filePath+"/Sample.txt", null, null, null, null, null);
using (MemoryStream memStreamLikes = new MemoryStream())
{
using (TextWriter textWriter = new StreamWriter(memStreamLikes))
{
string text;
textWriter.WriteLine("First Name, Last Name");
foreach (var item in people)
{
text = item.FirstName + "," + item.LasttName;
textWriter.WriteLine(text);
}
textWriter.Flush();
memStreamLikes.Flush();
byte[] textByteArray = memStreamLikes.ToArray();
adlsFileSystemClient.FileSystem.Append(adlsAccountName, filePath + "/Sample.txt", new MemoryStream(textByteArray,0,textByteArray.Length), null, null, null, null);
}
}





Вот что вам нужно сделать:
Создайте клиентский объект озера данных
var adlsClient = AdlsClient.CreateClient(adlsName, adlCreds);
и вот пример метода сохранения данных в файле tsv в озере данных
public static void ProcessUserLikes(this SocialEntity socialProfile, AdlsClient adlsClient, string fileNameExtension = "")
{
using (MemoryStream memStreamLikes = new MemoryStream())
{
using (TextWriter textWriter = new StreamWriter(memStreamLikes))
{
string header = FacebookHelper.GetHeader(delim, Entities.FBEnitities.Like);
string likes;
string fileName = adlsInputPath + fileNameExtension + "/likes.tsv";
adlsClient.DataLakeFileHandler(textWriter, header, fileName);
for (int i = 0; i < socialProfile.Likes.Count; i++)
{
for (int j = 0; j < socialProfile.Likes[i].Category_List.Count; j++)
{
likes = socialProfile.UserID
+ delim + socialProfile.FacebookID
+ delim + socialProfile.Likes[i].ID
+ delim + socialProfile.Likes[i].Name
+ delim + socialProfile.Likes[i].Category_List[j].ID
+ delim + socialProfile.Likes[i].Category_List[j].Name
+ delim + socialProfile.Likes[i].Created_time;
textWriter.WriteLine(likes);
}
}
textWriter.Flush();
memStreamLikes.Flush();
adlsClient.DataLakeUpdateHandler(fileName, memStreamLikes);
}
}
}
private static void DataLakeFileHandler(this AdlsClient adlsClient, TextWriter textWriter, string header, string fileName = "")
{
if (!adlsClient.CheckExists(fileName))
{
textWriter.WriteLine(header);
}
}
public static void DataLakeUpdateHandler(this AdlsClient adlsClient, string fileName, MemoryStream memStream)
{
if (!adlsClient.CheckExists(fileName))
{
using (var stream = adlsClient.CreateFile(fileName, IfExists.Overwrite))
{
byte[] textByteArray = memStream.ToArray();
stream.Write(textByteArray, 0, textByteArray.Length);
}
}
else
{
memStream.Seek(0, SeekOrigin.Begin);
using (var stream = adlsClient.GetAppendStream(fileName))
{
byte[] textByteArray = memStream.ReadFully();
if (textByteArray.Length > 0)
{
stream.Write(textByteArray, 0, textByteArray.Length);
}
}
}
}
public static byte[] ReadFully(this MemoryStream input)
{
using (MemoryStream ms = new MemoryStream())
{
input.CopyTo(ms);
return ms.ToArray();
}
}
Вы можете изменить в соответствии с вашими потребностями, предоставили образец метода для создания и обновления файлов.
Надеюсь, поможет.
Здесь вы можете найти информацию о безопасности и лучшие практики в отношении ADLS.docs.microsoft.com/en-us/azure/data-lake-store/… В идеале он не должен превышать 2 ГБ.
Спасибо! это действительно помогает, у меня есть один вопрос: есть ли какие-либо ограничения на размер или отсутствие столбцов, которые вы записываете в файл в ADLS с использованием .net SDK