我正在尝试使用Azure函数c#脚本附加到Azure blob中的镶木地板文件。
我已经能够使用Parquet.net程序包将其附加到本地创建的Parquet文件中。但是,当我尝试执行代码以附加到Azure中的镶木地板文件时,出现了错误。
以下代码适用于本地镶木地板文件追加。
var ds = new DataSet(new DataField<int>("id"),new DataField<string>("city"));
ds.Add(1, "London");
using (Stream fileStream = File.Open(file, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
ParquetWriter.Write(ds, fileStream,CompressionMethod.None,null,null, true);
Console.Write("File writing completed successfully\n");
}
但是下面的代码不适用于Azure Parquet文件追加
var ds = new DataSet(new DataField<int>("id"),new DataField<string>("city"));
ds.Add(1, "London");
Stream stream = new MemoryStream();
ParquetWriter.Write(ds, stream,CompressionMethod.None,null,null, false);
parquetBlob.AppendBlock(stream); //this line fails with error
我收到以下错误:
2018-07-05T05:07:14.479 [Info] Parquet file writing started
2018-07-05T05:07:14.667 [Info] Parquet file writing : successfully written to memory stream
2018-07-05T05:07:14.686 [Info] Exception while appending to parquet file: Microsoft.WindowsAzure.Storage.StorageException: The remote server returned an error: (400) Bad Request. ---> System.Net.WebException: The remote server returned an error: (400) Bad Request.
at System.Net.HttpWebRequest.GetResponse()
at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Executor\Executor.cs:line 677
--- End of inner exception stack trace ---
at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Executor\Executor.cs:line 604
at Microsoft.WindowsAzure.Storage.Blob.CloudAppendBlob.AppendBlock(Stream blockData, String contentMD5, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudAppendBlob.cs:line 2145
at Submission#0.writeParquet(String data, CloudAppendBlob parquetBlob, TraceWriter log) in D:\home\site\wwwroot\EventHubTriggerCSharp2\run.csx:line 189
at Submission#0.WriteToBlob(String fileName, String data, TraceWriter log) in D:\home\site\wwwroot\EventHubTriggerCSharp2\run.csx:line 158
Request Information
RequestID:45299e54-001e-009d-7d1e-143e91000000
RequestDate:Thu, 05 Jul 2018 05:07:13 GMT
StatusMessage:The value for one of the HTTP headers is not in the correct format.
ErrorCode:InvalidHeaderValue
我们将不胜感激任何帮助。
答案 0 :(得分:1)
@Gaurav向我们展示了方式。
The value for one of the HTTP headers is not in the correct format.
如果检查RequestInformation,我们将发现Content-Length为0。
您需要先将流搜索回到开头,然后再将其附加到Blob。
在stream.Position = 0
之前添加parquetBlob.AppendBlock(stream);