使用 Parquet.NET 写入 Parquet 文件适用于本地文件,但会导致 blob 存储中的文件为空
Writing Parquet files using Parquet.NET works with local file, but results in empty file in blob storage
我们正在使用 parquet.net 编写 parquet 文件。我设置了一个包含 3 列和 2 行的简单模式:
// Set up the file structure
var UserKey = new Parquet.Data.DataColumn(
new DataField<Int32>("UserKey"),
new Int32[] { 1234, 12345}
);
var AADID = new Parquet.Data.DataColumn(
new DataField<string>("AADID"),
new string[] { Guid.NewGuid().ToString(), Guid.NewGuid().ToString() }
);
var UserLocale = new Parquet.Data.DataColumn(
new DataField<string>("UserLocale"),
new string[] { "en-US", "en-US" }
);
var schema = new Schema(UserKey.Field, AADID.Field, UserLocale.Field
);
当使用 FileStream 写入本地文件时,会创建一个文件,当代码完成时,我可以在文件中看到两行(1 kb 之后):
using (Stream fileStream = System.IO.File.OpenWrite("C:\Temp\Users.parquet")) {
using (var parquetWriter = new ParquetWriter(schema, fileStream)) {
// Creare a new row group in the file
using (ParquetRowGroupWriter groupWriter = parquetWriter.CreateRowGroup()) {
groupWriter.WriteColumn(UserKey);
groupWriter.WriteColumn(AADID);
groupWriter.WriteColumn(UserLocale);
}
}
}
然而,当我尝试使用相同的方法写入我们的 blob 存储时,它只会生成一个空文件,并且数据丢失:
// Open reference to Blob Container
CloudAppendBlob blob = OpenBlobFile(blobEndPoint, fileName);
using (MemoryStream stream = new MemoryStream()) {
blob.CreateOrReplaceAsync();
using (var parquetWriter = new ParquetWriter(schema, stream)) {
// Creare a new row group in the file
using (ParquetRowGroupWriter groupWriter = parquetWriter.CreateRowGroup()) {
groupWriter.WriteColumn(UserKey);
groupWriter.WriteColumn(AADID);
groupWriter.WriteColumn(UserLocale);
}
// Set stream position to 0
stream.Position = 0;
blob.AppendBlockAsync(stream);
return true;
}
...
public static CloudAppendBlob OpenBlobFile (string blobEndPoint, string fileName) {
CloudBlobContainer container = new CloudBlobContainer(new System.Uri(blobEndPoint));
CloudAppendBlob blob = container.GetAppendBlobReference(fileName);
return blob;
}
阅读文档,我认为我的 blob.AppendBlocAsync 实现应该可以解决问题,但我最终得到一个空文件。有人会就为什么会这样以及我如何解决它提出建议,以便我最终在文件中得到数据吗?
提前致谢。
文件以空结尾的解释是:
blob.AppendBlockAsync(stream);
请注意调用的函数如何具有 Async
后缀。这意味着它期望调用它的任何东西等待。我将代码所在的函数转换为异步函数,并让 Visual Studio 建议对该行进行以下更改:
_ = await blob.AppendBlockAsync(stream);
我不完全确定 _
代表什么,将鼠标悬停在它上面并没有显示更多信息,只是它是 long
数据类型,但代码现在可以工作了符合预期。
我们正在使用 parquet.net 编写 parquet 文件。我设置了一个包含 3 列和 2 行的简单模式:
// Set up the file structure
var UserKey = new Parquet.Data.DataColumn(
new DataField<Int32>("UserKey"),
new Int32[] { 1234, 12345}
);
var AADID = new Parquet.Data.DataColumn(
new DataField<string>("AADID"),
new string[] { Guid.NewGuid().ToString(), Guid.NewGuid().ToString() }
);
var UserLocale = new Parquet.Data.DataColumn(
new DataField<string>("UserLocale"),
new string[] { "en-US", "en-US" }
);
var schema = new Schema(UserKey.Field, AADID.Field, UserLocale.Field
);
当使用 FileStream 写入本地文件时,会创建一个文件,当代码完成时,我可以在文件中看到两行(1 kb 之后):
using (Stream fileStream = System.IO.File.OpenWrite("C:\Temp\Users.parquet")) {
using (var parquetWriter = new ParquetWriter(schema, fileStream)) {
// Creare a new row group in the file
using (ParquetRowGroupWriter groupWriter = parquetWriter.CreateRowGroup()) {
groupWriter.WriteColumn(UserKey);
groupWriter.WriteColumn(AADID);
groupWriter.WriteColumn(UserLocale);
}
}
}
然而,当我尝试使用相同的方法写入我们的 blob 存储时,它只会生成一个空文件,并且数据丢失:
// Open reference to Blob Container
CloudAppendBlob blob = OpenBlobFile(blobEndPoint, fileName);
using (MemoryStream stream = new MemoryStream()) {
blob.CreateOrReplaceAsync();
using (var parquetWriter = new ParquetWriter(schema, stream)) {
// Creare a new row group in the file
using (ParquetRowGroupWriter groupWriter = parquetWriter.CreateRowGroup()) {
groupWriter.WriteColumn(UserKey);
groupWriter.WriteColumn(AADID);
groupWriter.WriteColumn(UserLocale);
}
// Set stream position to 0
stream.Position = 0;
blob.AppendBlockAsync(stream);
return true;
}
...
public static CloudAppendBlob OpenBlobFile (string blobEndPoint, string fileName) {
CloudBlobContainer container = new CloudBlobContainer(new System.Uri(blobEndPoint));
CloudAppendBlob blob = container.GetAppendBlobReference(fileName);
return blob;
}
阅读文档,我认为我的 blob.AppendBlocAsync 实现应该可以解决问题,但我最终得到一个空文件。有人会就为什么会这样以及我如何解决它提出建议,以便我最终在文件中得到数据吗?
提前致谢。
文件以空结尾的解释是:
blob.AppendBlockAsync(stream);
请注意调用的函数如何具有 Async
后缀。这意味着它期望调用它的任何东西等待。我将代码所在的函数转换为异步函数,并让 Visual Studio 建议对该行进行以下更改:
_ = await blob.AppendBlockAsync(stream);
我不完全确定 _
代表什么,将鼠标悬停在它上面并没有显示更多信息,只是它是 long
数据类型,但代码现在可以工作了符合预期。