登录
首页 >  Golang >  Go问答

解决用 Julia 和/或 Python 编写的文件读取问题:segmentio/parquet

来源:stackoverflow

时间:2024-02-10 23:27:18 115浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《解决用 Julia 和/或 Python 编写的文件读取问题:segmentio/parquet》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

下面的代码几乎是从segmentio/arrow中逐字获取的,无法读取用python和/或julia库编写的.parquet文件。当代码从对 parquet.readfile("file") 的调用返回时,行包含 0 值(对于 int64"" 对于字符串)。读取失败,codec = {zstd、gzip 或 snappy}

type firowtype struct{ x1, x2, x3 int64 }
func rdfifile() {
    rows, err := parquet.readfile[firowtype]("filename_zstd.parquet")
    if err != nil {
        log.fatal(err)
    }
    for _, c := range rows {
        fmt.printf("%+v\n", c)
    }
}

type fsrowtype struct{ x1, x2, x3 string }
func rdfsfile() {
    rows, err := parquet.readfile[fsrowtype]("filename_zstd.parquet")
    if err != nil {
        log.fatal(err)
    }
    for _, c := range rows {
        fmt.printf("%+v\n", c)
    }
}

golang 代码不会返回错误,即 err == nil。 代码返回正确的行数和列数,元数据中的一些信息似乎是正确的(例如文件的创建者、创建日期等)。我使用 julia 创建了这些文件:

using Parquet
function WrForGo( )
  min = 1 
  max = 10
  # arrays of size (10,3). ai is int and as is 
String 
  ai = Array{Int64, 2}(undef, 10,3)
  as = Array{String, 2}(undef, 10,3)
  for i =1:max
      for j=1:3
        as[i,j] = string(i, pad=2) * "_" * string(j,pad=2)
        ai[i,j] = (j-1)*10 + i
      end
    end

    dfi = DataFrame(ai, :auto) ; dfs = DataFrame(as, :auto)
    print( dfi ) ;  print( dfs )
    Parquet.write_parquet( prqDir * "fi_ZSTD.parquet", compression_codec = "ZSTD", dfi)
    Parquet.write_parquet( prqDir * "fs_ZSTD.parquet", compression_codec = "ZSTD", dfs)

    Parquet.write_parquet( prqDir * "fi_GZIP.parquet", compression_codec = "GZIP", dfi)
    Parquet.write_parquet( prqDir * "fs_GZIP.parquet", compression_codec = "GZIP", dfs)

    Parquet.write_parquet( prqDir * "fi_SNAPPY.parquet", compression_codec = "SNAPPY", dfi)
    Parquet.write_parquet( prqDir * "fs_SNAPPY.parquet", compression_codec = "SNAPPY", dfs)

end

正确答案


在 go 中,以小写字符 not exported 开头的变量无法从其他包更新(例如 segmentio/parquet-go)。尝试以下方法:

package main

import (
    "fmt"
    "log"

    "github.com/segmentio/parquet-go"
)

type FiRowType struct {
    X1 int64 `parquet:"x1,optional"`
    X2 int64 `parquet:"x2,optional"`
    X3 int64 `parquet:"x3,optional"`
}

func RdFiFile() {
    rows, err := parquet.ReadFile[FiRowType]("fi_ZSTD.parquet")
    if err != nil {
        log.Fatal(err)
    }
    for i, c := range rows {
        fmt.Printf("%d %+v\n", i, c)
    }
}

func main() {
    RdFiFile()
}

今天关于《解决用 Julia 和/或 Python 编写的文件读取问题:segmentio/parquet》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>