使用 C# 序列化镶木地板数据

Serialize parquet data with C#

有没有办法使用 C# 以 Apache Parquet 格式序列化数据,我找不到任何实现。在官方的 Parquet 文档中说 "Thrift can be also code-genned into any other thrift-supported language." 但我不确定这到底是什么意思。

谢谢

不,没有。我花了一个星期的时间尝试为 .NET 编写自己的镶木地板编写器,但它太复杂了,即需要更多时间。我最终使用 Python 和 fastparquet 库在 Hadoop 集群之外进行任何处理。我必须说 fastparquet 是一项了不起的工作,非常容易使用,但缺少很多功能,即嵌套列和有效附加到文件的能力。更不用说对 Python3 的依赖,部署起来可能会让人头疼。

您可以将 Thrift 协议生成到 C# 中,但这并不能使您走得更远,它只是意味着您的输出将与 Parquet 规范兼容。

我仍然热衷于为 .NET Core/.NET 4.5 创建一个开源 Parquet 库,所以如果有人愿意合作,请告诉我。

我已经启动了一个开源项目,用于 Apache Parquet 的 .NET 实现,欢迎任何人加入。 https://github.com/aloneguid/parquet-dotnet

我们刚刚开源了围绕 Apache Parquet C++ 的 .NET 包装器。与 Parquet.NET 相比,这是一种不同的方法,后者是纯 .NET 实现。

欢迎您试用并分享您的反馈意见: https://github.com/G-Research/ParquetSharp

这是列表中的另一个。 Cinchoo ETL - 一个开源库,可以读写parquet文件。

方法一:POCO方法

定义 POCO class

public partial class Employee
{
    public int Id { get; set; }
    public string Name { get; set; } 
}

连载码

List<EmployeeRecSimple> objs = new List<EmployeeRecSimple>();

Employee rec1 = new Employee();
rec1.Id = 1;
rec1.Name = "Mark";
objs.Add(rec1);
 
Employee rec2 = new Employee();
rec2.Id = 2;
rec2.Name = "Jason";
objs.Add(rec2);
 
using (var parser = new ChoParquetWriter<Employee>("emp.parquet"))
{
    parser.Write(objs);
}

方法二:动态法

List<ExpandoObject> objs = new List<ExpandoObject>();
dynamic rec1 = new ExpandoObject();
rec1.Id = 1;
rec1.Name = "Mark";
objs.Add(rec1);
 
dynamic rec2 = new ExpandoObject();
rec2.Id = 2;
rec2.Name = "Jason";
objs.Add(rec2);
 
using (var parser = new ChoParquetWriter("emp.parquet"))
{
    parser.Write(objs);
}

免责声明:我是这个库的作者