Загрузка данных JSON в несколько таблиц в BigQuery

#json #google-cloud-platform #google-bigquery

# #json #google-облачная платформа #google-bigquery

Вопрос:

Мой JSON выглядит следующим образом:

 {
    "Key1":"Value1","Key2":"Value2","Key3":"Value3","List1":
    [
        {
            "SubKey1":"SubValue1_1","SubKey2":"SubValue1_2","SubKey3":"SubValue1_3"
        },
        {
            "SubKey1":"SubValue2_1","SubKey2":"SubValue2_2","SubKey3":"SubValue2_3"
        },
        {
            "SubKey1":"SubValue3_1","SubKey2":"SubValue3_2","SubKey3":"SubValue3_3"
        }
    ]
}
 

Он загружается в одну таблицу BigQuery следующим образом:


введите описание изображения здесь


Но я хочу, чтобы мои данные загружались в 2 отдельные таблицы, например:


введите описание изображения здесь


и


введите описание изображения здесь


Пожалуйста, подскажите, что мне следует делать.

Ответ №1:

Я не думаю, что это возможно сделать напрямую при загрузке данных.

Я бы посоветовал загружать данные как есть, а затем выполнять следующие запросы для создания таблиц с данными в нужном вам формате. «cs_test» — это имя набора данных для ваших таблиц, «so» — это имя таблицы с загруженными данными:

 CREATE TABLE cs_test.so_2 AS SELECT key1, list FROM cs_test.so AS s, unnest(s.list1) AS list;
 

Данные в «so_2» будут выглядеть следующим образом:

введите описание изображения здесь

И создать таблицу с данными в формате, подобном этому:

введите описание изображения здесь

Вам необходимо выполнить следующий запрос:

 CREATE TABLE cs_test.so_1 AS SELECT key1, key2, key3 FROM cs_test.so;
 

Ответ №2:

Это было бы возможно, если бы вы могли использовать командную строку bq.

Предполагая, что ваш файл JSON (my_json_file.json) находится в корзине GCS (например, my_gcs_bucket) и целевой таблице my_dataset.my_destination_table, вы можете выполнить следующую команду

 bq load --ignore_unknown_values --source_format=NEWLINE_DELIMITED_JSON my_dataset.my_destination_table "gs://my_gcs_bucket/my_json_file.json" ./schema.json
 

где в schema.json вы уже выбрали схему целевой таблицы. Например, следующие две схемы будут загружать данные, как и ожидалось:

schema_1.json

 [
  {
    "mode": "NULLABLE",
    "name": "Key1",
    "type": "STRING"
  },
  {
    "mode": "NULLABLE",
    "name": "Key2",
    "type": "STRING"
  },
  {
    "mode": "NULLABLE",
    "name": "Key3",
    "type": "STRING"
  }
]
 

и schema_2.json

 [
  {
    "mode": "NULLABLE",
    "name": "Key1",
    "type": "STRING"
  },
  {
    "fields": [
      {
        "mode": "NULLABLE",
        "name": "SubKey1",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "SubKey2",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "SubKey3",
        "type": "STRING"
      }
    ],
    "mode": "REPEATED",
    "name": "List1",
    "type": "RECORD"
  }
]
 

и затем

 bq load --ignore_unknown_values --source_format=NEWLINE_DELIMITED_JSON my_dataset.my_destination_table_1 "gs://my_gcs_bucket/my_json_file.json" ./schema_1.json

bq load --ignore_unknown_values --source_format=NEWLINE_DELIMITED_JSON my_dataset.my_destination_table_2 "gs://my_gcs_bucket/my_json_file.json" ./schema_2.json
 

Загрузит две разные таблицы на основе одного и того же файла JSON