Автоопределение BigQuery не работает с несовместимыми json? - PullRequest
0 голосов
/ 30 марта 2020

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

К сожалению, я получаю следующую ошибку:

Upload complete.
Waiting on bqjob_r1aa6e3302cfc399a_000001712c8ea62b_1 ... (1s) Current status: DONE
BigQuery error in load operation: Error processing job '[...]:bqjob_r1aa6e3302cfc399a_000001712c8ea62b_1': Error while reading data, error message: JSON table encountered too many errors, giving up.
Rows: 1209; errors: 1. Please look into the errors[] collection for more details.
Failure details:
- Error while reading data, error message: JSON processing
encountered too many errors, giving up. Rows: 1209; errors: 1; max
bad: 0; error percent: 0
- Error while reading data, error message: JSON parsing error in row
starting at position 829980: No such field:
mc.marketDefinition.settledTime.

Вот данные, которые я загружаю: https://gist.github.com/max-sixty/c717e700a2774ba92547c7585b2b21e3

Может быть, при автоопределении используются первые n строк, а затем происходит сбой, если строки после n отличаются? Если это так, есть ли способ решить эту проблему?

Можно ли использовать какой-либо инструмент для извлечения схемы из всего файла и последующей явной передачи BigQuery?

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Я нашел два инструмента, которые могут помочь:

  • генератор больших запросов 0.5.1 , который использует все данные для получения схемы вместо 100 выборок такие строки, как BigQuery.

  • Spark SQL, вам нужно настроить dev env или, по крайней мере, установить Spark и вызвать инструмент spark-shell.

Однако я заметил, что файл предназначен для сбоя, см. Этот текст в ссылке, которой вы поделились: «Пример сбоя автоматического определения BigQuery». Итак, я не совсем уверен, что такие инструменты могут работать для файла json, предназначенного для сбоя.

Последнее, но не менее важное, я импортировал json после того, как вручную удалил проблематику c поле: "resolledTime": "2020-03-01T02: 55: 47.000Z".

Надеюсь, эта информация поможет.

1 голос
/ 30 марта 2020

Да, см. Документацию здесь: https://cloud.google.com/bigquery/docs/schema-detect

Когда автоопределение включено, BigQuery запускает процесс вывода, выбирая случайный файл в источнике данных и сканируя до 100 строк данных для использования в качестве репрезентативной выборки. Затем BigQuery проверяет каждое поле и пытается назначить тип данных этому полю на основе значений в образце.

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

0 голосов
/ 01 апреля 2020

Автоопределение может не работать должным образом, так как оно просматривает только первые 100 строк для обнаружения схемы. Использование обнаружения схемы для JSON может быть дорогостоящим делом.

Как насчет использования BqTail с опцией AllowFieldAddition , позволяющей экономически эффективно развернуть схему.

Вы можете просто использовать следующий рабочий процесс приема с CLI или без сервера

bqtail -r=rule.yaml -s=sourceURL

@rule.yaml

When:
  Prefix: /data/somefolder
  Suffix: .json
Async: false

Dest:
  Table: mydataset.mytable
  AllowFieldAddition: true
  Transient:
    Template: mydataset.myTableTempl
    Dataset: temp

Batch:
  MultiPath: true
  Window:
    DurationInSec: 15
OnSuccess:
  - Action: delete

См. JSON с разрешением добавления поля e2e контрольный пример

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