【问题标题】:Creating a file as a stream and uploading to Azure将文件创建为流并上传到 Azure
【发布时间】:2020-12-03 07:34:40
【问题描述】:

我正在使用 ChoETL 和 ChoETL.Parquet 库来创建基于其他一些数据的 parquet 文件。我可以在本地创建文件。

  using (ChoParquetWriter parser = new ChoParquetWriter($"..\\..\\..\\parquet_files\\{club}_events.parquet"))
       {
           parser.Write(events);
       }

在这段代码 sn-p 中,事件是包含字符串的对象列表。它们将被转换为镶木地板数据。

到目前为止,我已经编写了要上传到 Azure 的代码,但它需要一个本地文件作为输入。

BlobServiceClient BlobServiceClient = new BlobServiceClient("REDACTED");
var containerClient = BlobServiceClient.GetBlobContainerClient("base-test");
BlobClient blobClient = containerClient.GetBlobClient($"Base/{RequestTime.Year}/{RequestTime.Month}/{RequestTime.Day}/{RequestTime.Hour}/{RequestTime.Minute}/events.parquet");
using FileStream uploadFileStream = File.OpenRead("..\\..\\..\\events.parquet"); 
await blobClient.UploadAsync(uploadFileStream, true);
uploadFileStream.Close();

我需要在内存中创建它,然后将其上传到 Azure blob 存储。我怎样才能做到这一点?澄清一下:我需要上传镶木地板文件。

【问题讨论】:

  • fail 不多说了。您是否收到编译或运行时错误?
  • 这只是我尝试过的一条试探线。现在我给它镶木地板文件的路径,它可以工作。将在 OP 中添加更多信息
  • 您是否希望通过 MemoryStream 上传内容?
  • 是的....但我不认为我可以用这个库做到这一点,因为你需要给它一个路径

标签: c# azure parquet choetl


【解决方案1】:

关于这个问题,您可以使用BlockBlobClient.OpenWriteAsync 的方法来获取一个流并为ChoParquetWriter 提供流。然后 writer 将直接将内容写入 Azure blob。

例如

  List<EmployeeRecSimple> objs = new List<EmployeeRecSimple>();

            EmployeeRecSimple rec1 = new EmployeeRecSimple();
            rec1.Id = 1;
            rec1.Name = "Mark";
            objs.Add(rec1);

            EmployeeRecSimple rec2 = new EmployeeRecSimple();
            rec2.Id = 2;
            rec2.Name = "Jason";
            objs.Add(rec2);

            BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
            var desContainer = blobServiceClient.GetBlobContainerClient("output");
            var desBlob= desContainer.GetBlockBlobClient("my.parquet");
            var options = new BlockBlobOpenWriteOptions {
                HttpHeaders = new BlobHttpHeaders {
                    ContentType = MimeMapping.GetMimeMapping("parquet"),
                },
                // progress updates about data transfers
                ProgressHandler = new Progress<long> (
                    progress => Console.WriteLine("Progress: {0} bytes written", progress))
                    
                
            };

            using (var outStream = await desBlob.OpenWriteAsync(true, options).ConfigureAwait(false))
            using (ChoParquetWriter parser = new ChoParquetWriter(outStream)) {

                parser.Write(objs);
            }

public partial class EmployeeRecSimple
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

【讨论】:

    猜你喜欢
    • 2020-11-02
    • 2021-10-29
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2019-11-13
    • 2017-12-12
    • 2021-10-08
    相关资源
    最近更新 更多