Скопируйте многораздельную таблицу из исходного проекта в другую многораздельную таблицу в целевом проекте в BigQuery - PullRequest
0 голосов
/ 10 января 2020

У меня есть многораздельная таблица (с разделами даты на один год) в моей prod-среде, и я хочу скопировать все эти разделы в другую многораздельную таблицу, находящуюся в моей dev-среде. Как я могу сделать это за один go?

Я пробовал эту команду, но она копирует только один раздел за раз.

bq cp -a ': ._ 20180605':.

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

bq cp -a ': ._ 20180605':.

Как скопировать все разделы из таблицы источника в таблицу назначения в одну go? Есть ли запрос или команда bq, чтобы сделать это?

1 Ответ

0 голосов
/ 10 января 2020

Согласно документации для Копирование нескольких исходных таблиц : "Исходные таблицы должны быть указаны в виде списка через запятую."

Поэтому я могу предложить вам 3 варианта:

Первый: Если в ваших секционированных таблицах есть столбец с датой секционирования, вы можете создать команду bq, чтобы выбрать нужные даты секционирования, сохранить список в файле и выполните его с помощью команды bash. Следовательно, вы сможете добавить все таблицы в нужную таблицу назначения. Синтаксис будет следующим:

bq query --format=csv --nouse_legacy_sql '
SELECT
  CONCAT('bq cp -a <sourceproj>:<dataset>.<table>$', partition_name, ' <testproj>:<dataset>.Partitioned_Destination_Table')
FROM (
  SELECT
    DISTINCT FORMAT_DATETIME('%Y%m%d',
      CAST(_PARTITIONDATE AS datetime)) partition_name
  FROM
    `<sourceproj>.<dataset>.<table>`
  WHERE
    _PARTITIONTIME >= "start_date"
    AND _PARTITIONTIME < "end_date")' > output.csv

Затем выполните файл со всеми командами копирования bq.

bash output.csv

Вы можете прочитать больше о командных строках bq здесь .

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

tables=("20200107"  "20200106"  "20200105"  "20200104")

   for val in ${tables[*]}; do
        bq cp -a <project1>:<dataset1>.<table1_$val> <project2>:<dataset2>.<Partitioned_Destination_Table>
   done

Третий: Если ваш набор данных содержит только таблицы, которые вы хотите скопировать, вы можете скопировать весь набор данных, вы можете узнать больше об этом здесь , это будет выглядеть следующим образом:

 bq mk --transfer_config --project_id=[PROJECT_ID] --data_source=[DATA_SOURCE] --target_dataset=[DATASET] --display_name=[NAME] --params='[PARAMETERS]'

Надеюсь, это поможет.

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