You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ParquetWriter未完整写入数据至Azure Blob Storage问题排查

问题分析与解决方案

核心问题排查与修复

你的代码存在多个可能导致数据写入不完整的问题,对应修复方案如下:

1. 延迟加载枚举未被完整消费

ChoJSONReader.LoadText(stringJson)返回的是延迟加载的IEnumerable,调用parser.Write(parsedJson)时,可能因流操作的时机问题,导致枚举未完成就提前终止。强制将数据加载到内存集合中,确保所有记录被写入:

var parsedJson = ChoJSONReader.LoadText(stringJson).ToList();

2. 缺少显式的写入完成操作

尽管使用了using语句,部分版本的ChoParquetWriter仍需手动调用Flush()确保所有数据写入流。在Write后添加刷新操作:

parser.Write(parsedJson);
parser.Flush();

3. 冗余序列化步骤引入风险

将对象序列为JSON字符串再反序列化的操作不仅低效,还可能引发数据丢失。直接跳过中间步骤,用ChoParquetWriter写入对象集合:

public async Task UploadParquetFromObjects<T>(string fileName, IEnumerable<T> objects)
{
    var desBlob = blobClient.GetBlockBlobClient(fileName);
  
    using (var outStream = await desBlob.OpenWriteAsync(true).ConfigureAwait(false))
    using (ChoParquetWriter parser = new ChoParquetWriter(outStream))
    {
        parser.Write(objects);
    }
}

注意:将参数类型改为IEnumerable<T> objects,确保传入的是集合类型,避免单个对象被错误处理。

4. Azure Blob流的写入确认

OpenWriteAsync返回的流需要手动刷新,确保数据完全写入Blob:

using (var outStream = await desBlob.OpenWriteAsync(true).ConfigureAwait(false))
using (ChoParquetWriter parser = new ChoParquetWriter(outStream))
{
    parser.Write(parsedJson);
    parser.Flush();
    await outStream.FlushAsync().ConfigureAwait(false);
}

验证步骤

  • 先测试写入本地文件,确认ChoParquetWriter能完整写入所有数据,排除Azure Blob服务的影响
  • 检查传入的objects参数是否确实包含所有预期记录,排除数据源本身的问题

内容的提问来源于stack exchange,提问作者Daniel Assumpção

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:30:58