Загрузка JSON в Bigquery неспецифическая ошибка - PullRequest
0 голосов
/ 23 мая 2018

Я только начинаю работать с Python BigQuery API (https://github.com/GoogleCloudPlatform/google-cloud-python/tree/master/bigquery) после краткого опробования (https://github.com/pydata/pandas-gbq) и понимания того, что pandas-gbq не поддерживает тип RECORD, то есть никаких вложенных полей.

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

from google.cloud import bigquery
from google.cloud.bigquery import Dataset
from google.cloud.bigquery import LoadJobConfig
from google.cloud.bigquery import SchemaField

SCHEMA = [
    SchemaField('full_name', 'STRING', mode='required'),
    SchemaField('age', 'INTEGER', mode='required'),
    SchemaField('address', 'RECORD', mode='REPEATED', fields=(
        SchemaField('test', 'STRING', mode='NULLABLE'),
        SchemaField('second','STRING', mode='NULLABLE')
    ))
]

table_ref = client.dataset('TestApartments').table('Test2')

table = bigquery.Table(table_ref, schema=SCHEMA)
table = client.create_table(table)

При попыткечтобы загрузить очень простой JSON в bigquery, я получаю довольно неоднозначную ошибку

400 Ошибка при чтении данных, сообщение об ошибке: в таблице JSON возникло слишком много ошибок, отказывающих. Строки: 1; ошибки: 1.Пожалуйста, посмотрите в поток ошибок для получения более подробной информации.

Помимо того, что мне немного грустно, что это разочаровывает меня :), очевидно, что описание ошибки не очень помогает ... Пожалуйста, найдитениже показано, как я пытаюсь загрузить JSON и примеры.

job_config = bigquery.LoadJobConfig()
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON

with open('testjson.json', 'rb') as source_file:
    job = client.load_table_from_file(
        source_file,
        table_ref,
        location='US',  # Must match the destination dataset location.
        job_config=job_config)  # API request

job.result()  # Waits for table load to complete.

print('Loaded {} rows into {}:{}.'.format(
    job.output_rows, dataset_id, table_id))

Это мой объект JSON

"[{'full_name': 'test', 'age':2, 'адрес': [{ 'тест': 'Привет',' second ':' hi2 '}]}] "

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

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Я воспроизводил ваш сценарий с использованием того же кода и содержимого JSON, которым вы поделились, и я подозреваю, что проблема заключается только в том, что вы определяете содержимое JSON между кавычками (" или '), в то время как оно должноне имеют этого формата.

Правильный формат - это тот, который @ElliottBrossard уже поделился с вами в своем ответе:

{'full_name':'test', 'age':2, 'address': [{'test':'hi', 'second':'hi2'}]}

Если я запускаю ваш код, используя этот контент в testjson.jsonфайл, я получаю ответ Loaded 1 rows into MY_DATASET:MY_TABLE и содержимое загружается в таблицу.Если в противном случае я использую приведенный ниже формат (который вы используете в соответствии с вашим вопросом и комментариями в другом ответе), я получу результат google.api_core.exceptions.BadRequest: 400 Error while reading data, error message: JSON table encountered too many errors, giving up. Rows: 1; errors: 1. Please look into the error stream for more details.

"{'full_name':'test','age':2,'address':[{'test':'hi','second':'hi2'}]}"

Кроме того, вы можете перейти кна странице «Задания» в пользовательском интерфейсе BigQuery (по ссылке https://bigquery.cloud.google.com/jobs/YOUR_PROJECT_ID),) и там вы найдете дополнительную информацию о сбойном задании загрузки. Например, когда я запускаю ваш код с неправильным форматом JSON, это то, что я получаю:

enter image description here

Как вы увидите, здесь более актуально сообщение об ошибке:

error message: JSON parsing error in row starting at position 0: Value encountered without start of object

Указывает, что оно можетне найден какой-либо действительный запуск объекта JSON (т. е. скобка { в самом начале объекта).

TL; DR: удалить цитатуотметок в вашем JSON-объекте, и задание загрузки должно быть в порядке.

0 голосов
/ 23 мая 2018

Я думаю, что ваш контент JSON должен быть:

{'full_name':'test','age':2,'address':[{'test':'hi','second':'hi2'}]}

(без скобок.) В качестве примера использования клиента командной строки:

$ echo "{'full_name':'test','age':2,'address':[{'test':'hi','second':'hi2'}]}" \
    > example.json
$ bq query --use_legacy_sql=false \
    "CREATE TABLE tmp_elliottb.JsonExample (full_name STRING NOT NULL, age INT64 NOT NULL, address ARRAY<STRUCT<test STRING, second STRING>>);"
$ bq load --source_format=NEWLINE_DELIMITED_JSON \
    tmp_elliottb.JsonExample example.json
$ bq head tmp_elliottb.JsonExample
+-----------+-----+--------------------------------+
| full_name | age |            address             |
+-----------+-----+--------------------------------+
| test      |   2 | [{"test":"hi","second":"hi2"}] |
+-----------+-----+--------------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...