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
相关产品推荐
相关产品推荐

