使用ChoETL读取Azure Blob存储中Parquet数据时抛出异常求助
ChoETL读取Azure Blob中Parquet文件的异常修复方案
问题描述
使用ChoETL库读取Azure Blob存储内的Parquet文件时,在初始化ChoParquetReader的代码行抛出ArgumentNullException(提示参数stream不能为空)。
原始代码
BlobServiceClient blobServiceClient = new BlobServiceClient(azureStorage); BlobContainerClient container = blobServiceClient.GetBlobContainerClient(contenedor); var blobs = container.GetBlobs().Where(x => x.Name.Contains(".parquet")); try { foreach (var item in blobs) { var blob = container.GetBlobClient(item.Name); await blob.OpenReadAsync(); // 尝试按官方文档读取Parquet文件 foreach (dynamic e in new ChoParquetReader(outStream)) { Console.WriteLine("Id: " + e.Id + " FormNumber: " + e.FormNumber); } } } catch (Exception ex) { throw ex; }
异常原因
代码中await blob.OpenReadAsync();仅调用方法但未将返回的流赋值给outStream,导致outStream为null,传递给ChoParquetReader时触发空参数异常。
修复方案
- 接收
OpenReadAsync返回的流对象,并用using语句自动管理流资源,避免资源泄漏 - 将有效流实例传入
ChoParquetReader
修复后的完整代码
BlobServiceClient blobServiceClient = new BlobServiceClient(azureStorage); BlobContainerClient container = blobServiceClient.GetBlobContainerClient(contenedor); var blobs = container.GetBlobs().Where(x => x.Name.Contains(".parquet")); try { foreach (var item in blobs) { var blob = container.GetBlobClient(item.Name); // 接收流并使用using自动释放资源 using (var stream = await blob.OpenReadAsync()) { // 传入有效流实例初始化ChoParquetReader foreach (dynamic e in new ChoParquetReader(stream)) { Console.WriteLine("Id: " + e.Id + " FormNumber: " + e.FormNumber); } } } } catch (Exception ex) { throw ex; }
额外注意事项
- 确保Parquet文件结构与代码中访问的
Id、FormNumber字段匹配,避免后续出现字段不存在的异常 - 若Blob存储需要特殊权限,需确保
BlobServiceClient已配置正确的访问凭据
内容的提问来源于stack exchange,提问作者Juan Castillo
相关产品推荐
相关产品推荐

