Загрузка числовых данных в BigQuery с помощью файлов Avro, созданных с помощью goavro - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь выяснить, как загрузить долларовые значения в числовой столбец в BigQuery с помощью файла Avro.Я использую golang и пакет goavro для генерации файла avro.

Похоже, что соответствующий тип данных в go для обработки денег большой. Крыса.

BigQuery документация указывает на возможность использования Avro для этого.

Я вижу из нескольких тестов goavro , что кодирование * 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 голосов
/ 20 сентября 2018

Я понял это.Мне нужно использовать 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)}

И это прекрасно работает!

...