有人知道如何使用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
,但我在任何地方都找不到它的定义。
我知道镶木地板是基于列的,因此这不是最有效的读取方法,但是对我的工作很方便。
问候
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 */
}