Bq mk -f --view (принудительная замена существующего представления не работает)

Кажется, что флаг -f или --force = true не работает для представлений. Поскольку он все еще выводит следующую ошибку.

could not be created; a table with this name already exists.

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

bq mk --use_legacy_sql=false -f --description "View on reporting table ..." --view

Используйте bq update, чтобы изменить вид. cloud.google.com/bigquery/docs/managing-views

Graham Polley 31.10.2018 12:32

Спасибо, кажется, я должен использовать обновление bq или вместо DDL Create OR Replace

Anthony Liu 31.10.2018 18:47
1
2
1 454
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

--force or -f
When specified, ignore already exists errors and overwrite the table without prompting. The default value is false.
Ответ принят как подходящий

Вы можете использовать оператор CREATE OR REPLACE VIEW, например

bq query --use_legacy_sql=false "
  CREATE OR REPLACE VIEW dataset.view
  OPTIONS (description='View on reporting table ...') AS
  SELECT ...
"

Дополнительную информацию см. В Документация DDL.

На самом деле, согласно некоторым тестам, которые я проводил, этот параметр не выполняет то, что предлагает документация ([...] and overwrite the table without prompting), даже для таблиц:

$ bq mk test_dataset.test
  Table 'PROJECT:test_dataset.test' successfully created.
$ bq mk test_dataset.test
  BigQuery error in mk operation: Table 'PROJECT:test_dataset.test' could not be created; a table with this name already exists.
$ bq mk -f test_dataset.test
  Table 'PROJECT:test_dataset.test' could not be created; a table with this name already exists.

Кроме того, если посмотреть на описание инструмента CLI, объяснение не такое, как в документации:

$ bq mk --help
  [...]
  -f,--[no]force: Ignore errors reporting that the object already exists.
    (default: 'false')

И на самом деле, если мы посмотрим на статус выхода команды при добавлении или отсутствии флага -f, мы увидим существенную разницу:

$ bq mk test_dataset.test
  BigQuery error in mk operation: Table 'PROJECT:test_dataset.test' could not be created; a table with this name already exists.
$ echo $?
  1
$ bq mk -f test_dataset.test
  Table 'PROJECT:test_dataset.test' could not be created; a table with this name already exists.
$ echo $?
  0

Поэтому я считаю, что в этом случае функциональность правильная (также, как вы можете видеть, когда не добавляется флаг, вывод включает дополнительное сообщение BigQuery error in mk operation, которого нет с флагом), и документация не отражает реальное поведение флага.

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

Что касается способа достижения цели, которую вы пытались достичь с помощью этого флага, вы можете использовать любой из обходных путей, которые были предложены в других ответах и ​​комментариях, и все они кажутся хорошими вариантами.


Просто чтобы предоставить некоторый заключительный контекст для этого сообщения, документация уже был изменен, чтобы отразить реальную функциональность флага -f:

--force or -f

When specified, if a resource already exists, the exit code is 0. The default value is false.

Другие вопросы по теме