基于C#的基于ParacheSharp库的行访问,该库基于apache-parquet-cpp(箭头)

问题描述 投票:0回答:1

有人知道如何使用ParquetSharp进行对镶木地板文件的基于行的读取访问吗?这是我必须去的地方,但inputStream抛出一个无法转换为字符串错误。

using (var buffer = new ResizableBuffer())
{
    using (var reader = new ParquetFileReader(@"C:\Users\X\Documents\X.parquet"))
    {
        using (var inputStream = new BufferReader(buffer))
        {
            using (var readerRow = ParquetFile.CreateRowReader<Tuple>(inputStream))
            {
            }
        }
    }
}

ParquetSharp使用TTuple,但我在任何地方都找不到它的定义。

我知道镶木地板是基于列的,因此这不是最有效的读取方法,但是对我的工作很方便。

问候

c# parquet apache-arrow
1个回答
0
投票

ParquetSharp的面向行的API使用反射来发现给定行结构或类的公共字段。 TTuple只是一个通用参数,是行类型的占位符。

它与自定义结构或类System.Tuple和System.ValueTuple一起使用。您可以在https://github.com/G-Research/ParquetSharp/blob/master/csharp.test/TestRowOrientedParquetFile.cs

中看到一些示例

以您的示例为例,您将定义所需的行类型:

internal struct MyStruct
{
    public readonly int FirstField;
    public readonly string SecondField;
}

然后在您的方法中的某处:

using (var reader = ParquetFile.CreateRowReader<MyStruct>(@"C:\Users\X\Documents\X.parquet"))
{
    /* read rows */
}

尽管我个人更喜欢使用C#7元组,但省去了必须首先提供自己的结构定义的麻烦。唯一的缺点是,在编写Parquet文件时,ParquetSharp无法自动从字段名称中推断列名称(在内部,System.Tuple和System.ValueTuple都具有无聊的字段名称,例如Item1,Item2等)。

using (var reader = ParquetFile.CreateRowReader<(int firstField, string secondField)>(@"C:\Users\X\Documents\X.parquet"))
{
    /* read rows */
}
© www.soinside.com 2019 - 2024. All rights reserved.