Я создал несколько файлов avro. Я могу использовать следующие команды, чтобы преобразовать их в json, просто чтобы убедиться, что файлы в порядке
java -jar avro-tools-1.8.2.jar tojson FileName.avro>outputfilename.json
Теперь у меня есть несколько больших avro-файлов, и REST API, на который я пытаюсь загрузить, имеет ограничения по размеру, и поэтому я пытаюсь загрузить его кусками, используя потоки.
Следующий пример, который просто читает из исходного файла кусками и копирует в другой файл avro, прекрасно создает файл
using System;
using System.IO;
class Test
{
public static void Main()
{
// Specify a file to read from and to create.
string pathSource = @"D:\BDS\AVRO\filename.avro";
string pathNew = @"D:\BDS\AVRO\test\filenamenew.avro";
try
{
using (FileStream fsSource = new FileStream(pathSource,
FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[(20 * 1024 * 1024) + 100];
long numBytesToRead = (int)fsSource.Length;
int numBytesRead = 0;
using (FileStream fsNew = new FileStream(pathNew,
FileMode.Append, FileAccess.Write))
{
// Read the source file into a byte array.
//byte[] bytes = new byte[fsSource.Length];
//int numBytesToRead = (int)fsSource.Length;
//int numBytesRead = 0;
while (numBytesToRead > 0)
{
int bytesRead = fsSource.Read(buffer, 0, buffer.Length);
byte[] actualbytes = new byte[bytesRead];
Array.Copy(buffer, actualbytes, bytesRead);
// Read may return anything from 0 to numBytesToRead.
// Break when the end of the file is reached.
if (bytesRead == 0)
break;
numBytesRead += bytesRead;
numBytesToRead -= bytesRead;
fsNew.Write(actualbytes, 0, actualbytes.Length);
}
}
}
// Write the byte array to the other FileStream.
}
catch (FileNotFoundException ioEx)
{
Console.WriteLine(ioEx.Message);
}
}
}
Откуда я знаю, что это создает нормально avro. Поскольку более ранняя команда для преобразования в json, снова работает, т.е.
java -jar avro-tools-1.8.2.jar tojson filenamenew.avro>outputfilename.json
Тем не менее, когда я использую тот же код, но вместо того, чтобы копировать в другой файл, просто вызвать остальные API, файл загружается, но после загрузки того же файла с сервера и запуска команды выше для преобразования в json говорит: «Не файл данных».
Итак, очевидно, что что-то искажается, и я изо всех сил пытаюсь выяснить, что.
Это фрагмент
string filenamefullyqualified = path + filename;
Stream stream = System.IO.File.Open(filenamefullyqualified, FileMode.Open, FileAccess.Read, FileShare.None);
long? position = 0;
byte[] buffer = new byte[(20 * 1024 * 1024) + 100];
long numBytesToRead = stream.Length;
int numBytesRead = 0;
do
{
var content = new MultipartFormDataContent();
int bytesRead = stream.Read(buffer, 0, buffer.Length);
byte[] actualbytes = new byte[bytesRead];
Array.Copy(buffer, actualbytes, bytesRead);
if (bytesRead == 0)
break;
//Append Data
url = String.Format("https://{0}.dfs.core.windows.net/raw/datawarehouse/{1}/{2}/{3}/{4}/{5}?action=append&position={6}", datalakeName, filename.Substring(0, filename.IndexOf("_")), year, month, day, filename, position.ToString());
numBytesRead += bytesRead;
numBytesToRead -= bytesRead;
ByteArrayContent byteContent = new ByteArrayContent(actualbytes);
content.Add(byteContent);
method = new HttpMethod("PATCH");
request = new HttpRequestMessage(method, url)
{
Content = content
};
request.Headers.Add("Authorization", "Bearer " + accesstoken);
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
position = position + request.Content.Headers.ContentLength;
Array.Clear(buffer, 0, buffer.Length);
} while (numBytesToRead > 0);
stream.Close();
Я просмотрел ветки форума, но не нашел ничего, что касалось разбиения файлов avro.
У меня есть догадка, что мое "содержание" для http-запроса неверно. что мне не хватает?
Если вам нужно больше информации, я буду рад предоставить.