Как вставить сложный динамический вложенный JSON в BigQuery, используя Java - PullRequest
0 голосов
/ 14 января 2019

Я использую JSON, исходящий из системы xAPI, и JSON выглядит аналогично тому, который доступен в ссылке в BigQuery, где схема BigQuery слегка изменена.

Пример: в JSON для дочернего элемента verb

"verb":{  
    "id":"http://adlnet.gov/expapi/verbs/failed",
    "display":{  
      "en-US":"failed"
    }
  }

Схема, как показано ниже:

verb                        RECORD  NULLABLE    
verb.id                     STRING  NULLABLE    
verb.display                RECORD  REPEATED    
verb.display.stringValue    STRING  NULLABLE    
verb.display.languageCode   STRING  NULLABLE

Если я использую Джексон ObjectMapper, JSON анализируется, но не вставляется в BigQuery, потому что в JSON display является только записью, но в BigQuery это список записей, поэтому Кажется, есть несоответствие, и я не могу вставить такие настраиваемые поля.

Пожалуйста, предоставьте любые решения для решения этой проблемы, вкратце, в JSON по ссылке выше, если есть "en", я сталкиваюсь с этой проблемой.

Любая помощь приветствуется.

ObjectMapper objectmapper = new ObjectMapper();  
objectmapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false); 
objectmapper.setSerializationInclusion(Include.NON_NULL);
ashMap<String, Object> tempResult = objectmapper.readValue(stageJson, HashMap.class);

1 Ответ

0 голосов
/ 31 января 2019

Узел display также является записью в BigQuery. Вот как должна быть установлена ​​схема:

[
 {
   "name": "verb",
   "type": "RECORD",
   "mode": "NULLABLE",
   "fields": [
       {
         "name": "id",
         "type": "STRING",
         "mode": "NULLABLE"
       },
       {
         "name": "display",
         "type": "RECORD",
         "mode": "REPEATED",
         "fields": [
            {
              "name": "enUS",
              "type": "STRING",
              "mode": "NULLABLE"
            }
         ]
       }
    ]
 }
]

проблема с вашим примером verb заключается в отсутствии квадратных скобок, содержащих поле; кроме того, есть еще одна проблема с дефисом "-" в en-US: имена полей могут содержать только буквы, цифры и подчеркивания. должно быть установлено, например, enUS.

- это схема, отображаемая в пользовательском интерфейсе, если ваш пример verb (после исправления enUs) импортирован с использованием автоматического определения схемы :

verb                RECORD  NULLABLE    
verb.display        RECORD  NULLABLE    
verb.display.enUS   STRING  NULLABLE    
verb.id             STRING  NULLABLE    

Типы верны, однако режим display определяется как NULLABLE, поскольку [ ].

нет.

, поскольку формат импорта BigQuery JSON разделен символом новой строки, тогда этот импорт должен иметь следующий формат:

{"verb":{"id":"http://adlnet.gov/expapi/verbs/failed","display":[{"enUS":"failed"}]}}

затем режим display определяется как REPEATED.

как только ваша схема будет отсортирована и у вас будет правильно сформированный и действительный файл JSON, затем просто используйте BigQuery Java API для ее загрузки, без необходимости в сложном потоке и сторонней библиотеке для Заранее сериализуйте JSON.

Источник:

Указание схемы

Указание вложенных и повторяющихся столбцов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...