Синхронизация с BigQuery в Java «Повторная запись добавлена ​​вне массива» - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь вставить строку в BigQuery, используя Java.У сущности, которую я вставлял, есть поле с двойным вложением.

Генерация сущности, подходящей для BigQuery:

ObjectMapper mapper = new ObjectMapper();
String barcodeDetailsJSON = order.getBarcodeDetailsJSON();
List<StateForBQ> stateForBQList = new ArrayList<StateForBQ>();
for (State state : order.getStates()) {
  StateForBQ stateForBQ = new StateForBQ(state);
  stateForBQ.setSetOn(new Date(stateForBQ.getSetOn().getTime()/1000));
  stateForBQList.add(stateForBQ);
}
  List<BarcodeDetailForBQ> barcodeDetailForBQList = getBarcodeDetailsFromBarcodeDetailsJSON(barcodeDetailsJSON, order.getIsGrouped());

Без следующего состояние устанавливается как нулевое.(State является вложенной сущностью)

  List<Map<String, Object>> stateMap = 
      mapper.convertValue(stateForBQList, new TypeReference<List<Map<String, Object>>>() {});

Без следующего, barcodeDetails устанавливается равным нулю.(BarcodeDetails - это двойная вложенная сущность)

  List<Map<String, Object>> barcodeMapList = 
      mapper.convertValue(barcodeDetailForBQList, new TypeReference<List<Map<String, Object>>>() {});

Без следующего: productPriceDetails, productDetails, cgst, sgst устанавливаются в ноль

  for (Map<String, Object> barcodeMap : barcodeMapList) {
      barcodeMap.put("productPriceDetails", mapper.convertValue(barcodeMap.get("productPriceDetails"), new TypeReference<Map<String, Object>>() {}));
      barcodeMap.put("productDetails", mapper.convertValue(barcodeMap.get("productDetails"), new TypeReference<Map<String, Object>>() {}));
      barcodeMap.put("cgst", mapper.convertValue(barcodeMap.get("cgst"), new TypeReference<Map<String, Object>>() {}));
      barcodeMap.put("sgst", mapper.convertValue(barcodeMap.get("sgst"), new TypeReference<Map<String, Object>>() {}));
}

Подготовка содержимого строки

  Map<String, Object> rowContent = new HashMap<>();
  rowContent.put("orderId", order.getOrderId());
  rowContent.put("customerId", order.getCustomerId());
  rowContent.put("barcodeDetails", barcodeMapList);
  rowContent.put("states", stateMap);

Вставка в BigQuery

Gson gson = new Gson();
BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
String datasetName = "Latest_Data";
String tableName= "ORDER_TEMP";
  // [START bigquery_table_insert_rows]
  TableId tableId = TableId.of(datasetName, tableName);
  // Values of the row to insert

String barcodeDetailsJSON = order.getBarcodeDetailsJSON();
  List<BarcodeDetailForBQ> barcodeDetailForBQList = new OrderForBQ().getBarcodeDetailsFromBarcodeDetailsJSON(barcodeDetailsJSON, order.getIsGrouped());

  String recordsContentString = gson.toJson(rowContent);

  InsertAllResponse response =
      bigquery.insertAll(
          InsertAllRequest.newBuilder(tableId)
              .addRow(""+orderId, rowContent)
              // More rows can be added in the same RPC by invoking .addRow() on the builder
              .build());

  if (response.hasErrors()) {
    // If any of the insertions failed, this lets you inspect the errors
    for (Entry<Long, List<BigQueryError>> entry : response.getInsertErrors().entrySet()) {
      // inspect row error
    }
  }

Ниже приводится ответ, который я получаю.

{
  insertErrors: {
    0: [
      {
        reason: "invalid",
        location: "",
        message: "Repeated record added outside of an array."
      }
    ]
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...