Запись данных в файл в ADLS

#c# #.net #serialization #azure-data-lake

#c# #.net #сериализация #azure-озеро данных

Вопрос:

У меня есть коллекция объектов List базового класса, которая извлекается из сериализации JSON, теперь, прежде чем записывать данные в таблицу, мне нужно иметь копию данных в Azure data lake. с помощью приведенного ниже примера кода я могу создать папку и пример файла. Пожалуйста, объясните, как напрямую записывать данные объекта list collection в файл в 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).Resu<
            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).Resu<
            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);
                }
            }
  

Ответ №1:

Вот что вам нужно сделать:

Создайте клиентский объект datalake

 var adlsClient = AdlsClient.CreateClient(adlsName, adlCreds);
  

и вот пример метода сохранения данных в файле tsv в data lake

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

Вы можете изменить в соответствии с вашими потребностями, приведенный пример метода для создания и обновления файлов.

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

Комментарии:

1. Спасибо! это действительно помогает. у меня есть один вопрос: есть ли какие-либо ограничения на размер или отсутствие столбцов, которые вы записываете в файл в ADLS с использованием .net SDK

2. Здесь вы можете ознакомиться с безопасностью и лучшими практиками с точки зрения ADLS. learn.microsoft.com/en-us/azure/data-lake-store/… В идеале он не должен превышать 2 ГБ.