Запись файлов Parquet с помощью Parquet. NET работает с локальным файлом, но приводит к пустому файлу в хранилище BLOB-объектов. - PullRequest
0 голосов
/ 07 августа 2020

Мы используем паркет. net для записи файлов паркета. Я установил простую схему, содержащую 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 кб):

            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.AppendBlocAsyn c должна помочь, но в итоге я получаю пустой файл. Есть ли у кого-нибудь предложения относительно того, почему это так и как я могу решить эту проблему, чтобы я действительно получил данные в файле?

Заранее спасибо.

1 Ответ

0 голосов
/ 10 августа 2020

Объяснение того, что файл заканчивается пустым, - это строка:

blob.AppendBlockAsync(stream);

Обратите внимание, как вызываемая функция имеет суффикс Async. Это означает, что он ожидает, что все, что его зовет, будет ждать. Я превратил функцию, в которой был код, в функцию Asyn c, и Visual Studio предложила следующее изменение в строке:

_ = await blob.AppendBlockAsync(stream);

Я не совсем уверен, что представляет _, и при наведении курсора мыши на него ничего не видно, кроме того, что это тип данных long, но код теперь работает так, как задумано.

...