尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

parquet-go 实操指南:从 Go 结构体到 Parquet 文件的最短路径

parquet-go 实操指南:从 Go 结构体到 Parquet 文件的最短路径 parquet-go 实操指南从 Go 结构体到 Parquet 文件的最短路径【免费下载链接】parquet-gopure golang library for reading/writing parquet file项目地址: https://gitcode.com/gh_mirrors/pa/parquet-go你的 Go 服务要产出列式数据——日志归档、埋点落盘、给下游分析引擎供数——parquet-go 解决的就是这一步带 tag 的 Go 结构体直接写成 Parquet 文件读的时候只解码需要的列不依赖 JVM 和外部二进制。这篇按能干什么来讲跑通第一个文件后你带走的是 4 个常用任务的做法和 5 个容易踩的坑。 为什么值得看在 Go 服务里直接产出 Parquet服务本来就在写 JSON/CSV想把同一份数据落成列式文件供查询不想为格式转换单独维护一个 Java 组件。只取大文件里的部分列几百 MB 的 Parquet 表只要两三个字段希望按列取、按批读不把整表拉进内存。存量格式互转手上有 JSON/CSV 要灌进 Parquet或要把 Parquet 转回 JSON 给别的系统消费。 最短上手路径跑通第一个 Parquet 文件克隆仓库直接运行扁平结构示例git clone https://gitcode.com/gh_mirrors/pa/parquet-go cd parquet-go/example go run local_flat.go预期结果生成 output/flat.parquet100 行 Student 记录snappy 压缩程序随后读回并打印一条命令同时验证了写入和读取两条链路。它内部做的事很薄核心就是给字段打 tag再用 writer 逐条写type Student struct { Name string parquet:namename, typeBYTE_ARRAY, convertedtypeUTF8, encodingPLAIN_DICTIONARY Age int32 parquet:nameage, typeINT32 } pw, _ : writer.NewParquetWriter(fw, new(Student), 4) for i : 0; i 100; i { pw.Write(Student{Name: stu, Age: int32(i)}) } pw.WriteStop()fw 由 local.NewLocalFileWriter 创建指向本地路径构造函数的最后一个参数是并发协程数。WriteStop 负责写文件尾部的元数据不调用它文件就不完整。完整的可运行版本都在 示例代码 目录里对照着改 schema 即可。 按任务练手 把现有数据写进去四种 writer 对应四种数据已经在手上的形态Go 结构体上面的 ParquetWritertag 即 schema没打 tag 的字段跳过不写。JSON 字符串JSONWriter 用一段 JSON schema 描述列表达能力比 tag 强可写嵌套的 LIST/MAP每行喂一个 JSON 字符串。CSV 风格CSVWriter 用一组 tag 字符串描述各列每行喂一组值只支持扁平表。Arrow SchemaArrowWriter 直接以 Arrow schema 建列适合和 Arrow 内存格式衔接的场景。嵌套结构列表、map、结构体数组推荐 JSON schema 写法local_nested.go 和 json_schema.go 是完整参照。 只读需要的列读端不需要搬整表结构。定义一个只含目标字段的子结构体字段名对上文件里的列名即可其余列不会解码type Student2 struct { Name string parquet:namename, typeBYTE_ARRAY, convertedtypeUTF8 Age int32 parquet:nameage, typeINT32 } pr, _ : reader.NewParquetReader(fr, new(Student2), 4)想完全不预定义 schemaNewParquetReader 传 nil用 ReadByNumber(n) 拿原始记录。要拿列的原始值加重复级别/定义级别用 ColumnReader那是做自定义解析的出口。 在 JSON、CSV 与 Parquet 之间转换JSON 转 ParquetJSONWriter 直接灌字符串schema 里声明列名和类型即可。Parquet 转 JSON读端传 nil 建 readerReadByNumber 之后接 encoding/json 序列化两步完成。CSV 同构CSVWriter 写入读端按列拼回字符串。 用命令行检查文件不想写代码验证时仓库自带 parquet-tools源码本地文件和 S3 地址都能查schema 输出结构定义rowcount 看行数size 看压缩前后大小cat 按行导出 JSON。排查文件到底写坏没有先跑一次 cat 最省时间。⚠️ 进阶与避坑没打 tag 的字段不会写字段必须导出且带 parquet tag。列名映射到 Go 字段按首字母处理name 和 Name 这种只差首字母大小写的字段对不允许同时存在新手最常在这里白排查半天。高基数字段别用字典编码PLAIN_DICTIONARY 把所有不同值留在内存里并用 32 位整数存索引ID 类列唯一值一多内存直接失控改用 PLAIN。大文件别一次读完压缩后文件小不代表解压后小用 Read(buf) 小批量读或 SkipRows 跳过避免 OOM。并发参数调上去reader/writer 构造函数的最后一个参数 np 控制并行 marshal 的协程数多核机器上有明显收益。RowGroupSize 和 PageSize 影响最终体积大数组列若用不上统计信息tag 里加 omitstatstrue能省掉被 min/max 重复占用的空间。跑完 example/ 下的示例后用 parquet-tools 的 cat 命令校验一次输出再按真实 schema 替换掉 Student 结构体生产环境换压缩算法snappy、gzip、lz4、zstd 均支持之前先确认读端平台支持同一种。【免费下载链接】parquet-gopure golang library for reading/writing parquet file项目地址: https://gitcode.com/gh_mirrors/pa/parquet-go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表