我试图弄清楚如何使用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"}
这里做错了什么...希望有人可以将我指向正确的方向。
答案 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)}
效果很好!