使用goavro创建的Avro文件将数值数据加载到BigQuery中

时间:2018-09-19 06:40:37

标签: go google-bigquery avro

我试图弄清楚如何使用Avro文件将美元值加载到BigQuery的数字列中。我正在使用golang和goavro包来生成avro文件。

看来,处理货币的适当数据类型很大。Rat。

BigQuery documentation表示应该可以使用Avro。

我可以从一些goavro test cases中看到,可以将* big.Rat编码为fixed.decimal类型。

我正在使用goavro.OCFWriter通过简单的avro模式对数据进行编码,如下所示:

{
  "type": "record",
  "name": "MyData",
  "fields": [
    {
      "name": "ID",
      "type": [
        "string"
      ]
    },
    {
      "name": "Cost",
      "type": [
        "null",
        {
          "type": "fixed",
          "size": 12,
          "logicalType": "decimal",
          "precision": 4,
          "scale": 2
        }
      ]
    }
  ]
}

我正在尝试使用“费用”字段附加数据,如下所示:

map[string]interface{}{"fixed.decimal": big.NewRat(617, 50)}

这已成功编码,但是生成的avro文件无法加载到BigQuery中:

Err: load Table MyTable Job: {Location: ""; Message: "Error while reading data, error message: The Apache Avro library failed to parse the header with the following error: Missing Json field \"name\": {\"logicalType\":\"decimal\",\"precision\":4,\"scale\":2,\"size\":12,\"type\":\"fixed\"}"; Reason: "invalid"}

这里做错了什么...希望有人可以将我指向正确的方向。

1 个答案:

答案 0 :(得分:1)

我知道了。我需要使用bytes.decimal而不是fixed.decimal

{
  "type": "record",
  "name": "MyData",
  "fields": [
    {
      "name": "ID",
      "type": [
        "string"
      ]
    },
    {
      "name": "Cost",
      "type": [
        "null",
        {
          "type": "bytes",
          "logicalType": "decimal",
          "precision": 4,
          "scale": 2
        }
      ]
    }
  ]
}

然后进行类似的编码

map[string]interface{}{"bytes.decimal": big.NewRat(617, 50)}

效果很好!