如何使用C#将CSV文件转换为Parquet格式
当然可以用C#实现CSV到Parquet格式的转换!.NET生态里有成熟的类库支持这个需求,下面我会一步步给你讲具体操作方法,附完整代码示例。
确认可行性
完全没问题!目前有两个非常流行的.NET库可以组合完成这个任务:
Parquet.Net:Apache Parquet官方推荐的.NET实现,专门用于读写Parquet文件CsvHelper:处理CSV文件的高效工具,支持复杂的读取、映射逻辑
具体操作步骤
1. 安装必要的NuGet包
你可以通过Visual Studio的NuGet包管理器安装,或者用.NET CLI命令:
# 安装Parquet处理库 dotnet add package Parquet.Net # 安装CSV读取库 dotnet add package CsvHelper
2. 定义数据模型(可选但推荐)
如果你的CSV有固定的表头和结构,先定义一个对应的数据类,方便后续映射。比如假设你的CSV内容是这样的:
Id,Name,Age,JoinDate 1,Alice,30,2020-01-15 2,Bob,25,2021-03-22
那么对应的模型类可以写:
public class Employee { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public DateTime JoinDate { get; set; } }
3. 读取CSV并转换为Parquet
下面是完整的代码示例,包含读取CSV、写入Parquet的逻辑:
using System.Globalization; using CsvHelper; using Parquet; using Parquet.Schema; // 1. 定义Parquet的Schema(可以从模型类自动生成) var parquetSchema = SchemaReflector.Reflect<Employee>(); // 2. 读取CSV文件 List<Employee> employees; using (var reader = new StreamReader("employees.csv")) using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) { employees = csv.GetRecords<Employee>().ToList(); } // 3. 将数据写入Parquet文件 using (var stream = File.OpenWrite("employees.parquet")) { using (var parquetWriter = new ParquetWriter(parquetSchema, stream)) { // 创建一个行组(Parquet文件由行组组成) using (var groupWriter = parquetWriter.CreateRowGroup()) { // 将数据写入行组 groupWriter.WriteTable(Table.FromRecords(employees)); } } }
4. 处理动态列(无固定模型的情况)
如果你的CSV结构不固定,也可以动态构建Parquet Schema,示例如下:
using CsvHelper; using CsvHelper.Configuration; using Parquet; using Parquet.Data; // 读取CSV的表头和数据 List<dynamic> csvData; List<string> headers; using (var reader = new StreamReader("dynamic.csv")) using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) { csv.Read(); csv.ReadHeader(); headers = csv.HeaderRecord.ToList(); csvData = csv.GetRecords<dynamic>().ToList(); } // 动态构建Parquet Schema var fields = headers.Select(h => new DataField<string>(h)).ToList(); var parquetSchema = new Schema(fields); // 转换数据并写入 using (var stream = File.OpenWrite("dynamic.parquet")) { using (var writer = new ParquetWriter(parquetSchema, stream)) { using (var groupWriter = writer.CreateRowGroup()) { // 将动态数据转换为Parquet行 foreach (var header in headers) { var values = csvData.Select(row => row[header].ToString()).ToList(); groupWriter.WriteColumn(new DataColumn(parquetSchema.GetDataField(header), values)); } } } }
注意事项
- 确保CSV的列类型和Parquet的类型匹配,比如日期列要正确解析,避免类型转换错误
- 对于大文件,建议使用流式处理,避免一次性加载所有数据到内存
Parquet.Net支持压缩(默认是Snappy),可以通过ParquetWriter的配置调整压缩算法
内容的提问来源于stack exchange,提问作者itsdhandapani
相关产品推荐
相关产品推荐

