【问题标题】:Go converting data to parquet将数据转换为镶木地板
【发布时间】:2020-05-15 12:55:45
【问题描述】:

我正在从 dynamodb 获取数据并将数据转换为 parquet 文件。

为了转换为镶木地板文件,我使用https://github.com/xitongsys/parquet-go 库。但由于某种原因,我收到了runtime error: invalid memory address or nil pointer dereference

我知道这个错误意味着指针为 nil,我正在尝试使用它或取消引用它。

不知道为什么 pw.WriteStop() 给出内存无效错误

代码:

fw, err := local.NewLocalFileWriter(parquetFile)
if err != nil {
    log.Errorf("local.NewLocalFileWriter() error - %s", err)
    return err
}

pw, err := writer.NewParquetWriter(fw, new(Struct), int64(len(tenantList)))
if err != nil {
    log.Errorf("writer.NewParquetWriter() error - %s", err)
    return err
}

pw.RowGroupSize = 128 * 1024 * 1024 //128M
pw.CompressionType = parquet.CompressionCodec_SNAPPY

for _, data := range tenantList {
    if err = pw.Write(data); err != nil {
        return err
    }
}

// this line gives memory invalid error
if err = pw.WriteStop(); err != nil {
    return err
}

fw.Close()

我得到的唯一错误是“运行时错误:无效的内存地址或 nil 指针取消引用”。通过在“if”语句中打印语句,我发现无效的内存地址来自“pw.WriteStop()”

附上错误截图;只是为了表明我真的只得到“运行时错误:无效的内存地址或零指针取消引用”

【问题讨论】:

  • 堆栈的完整错误应该显示错误发生的位置。将堆栈添加到您的帖子中。
  • 运行时报告发生恐慌的代码行。编辑问题以显示该行代码。
  • 我得到的唯一错误是这个“运行时错误:无效的内存地址或零指针取消引用”,通过在“if”语句中打印语句我发现无效的内存地址来自“pw.写停止”
  • @jackysatpal 运行时错误又名恐慌也打印堆栈跟踪,这就是上面的 cmets 所说的,该跟踪可用于查找导致问题的代码。
  • @jackysatpal 参见这里的例子:play.golang.com/p/oseauSuhEMV panic: runtime error: invalid memory address or nil pointer dereference 之后的所有文本都是堆栈跟踪,你能看到它是如何提到问题的文件和行的吗?即../prog.go:12?将堆栈跟踪添加到问题中,或者自己使用它来跟踪问题。

标签: go parquet


【解决方案1】:

我也遇到过这种情况。发现这是因为我没有为结构标签中的布尔字段指定'type = BOOLEAN',例如parquet:"name=MyFieldName, type=BOOLEAN"。对我来说,为 bool 提供 BOOLEAN,为 int64 提供 INT64,为字符串 Go 类型提供 UTF8 是可行的。

理想情况下,库应该自动获取数据类型,但可能是一个未实现的功能,或者它涉及太多开销,这就是故意不实现的原因。

【讨论】:

    猜你喜欢
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 2014-11-25
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多