Создать кластерную таблицу в BigQuery из существующей таблицы с помощью _PARTITIONTIME - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь создать новую кластеризованную таблицу db.new_table, имеющую те же данные и схему, что и существующая таблица db.old_table, в BigQuery.Существующая таблица имеет псевдостолбец _PARTITIONTIME, и я хотел бы, чтобы новая таблица также имела этот псевдостолбец _PARTITIONTIME.

Я попытался использовать DDL с запросом, подобным:

CREATE TABLE `db.new_table`
PARTITION BY DATE(_PARTITIONTIME)
CLUSTER BY field1, field2
AS SELECT * FROM `db.old_table`
WHERE _PARTITIONTIME > '1990-01-01'

Однако это не удалось, потому что мы не можем использовать PARTITION BY DATE(_PARTITIONTIME), за которым следует AS SELECT ....как указано в https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language

Есть ли способы сделать это?(создайте новую кластеризованную таблицу с той же точной схемой и данными из старой таблицы, разделенной псевдостолбцом _PARTITIONTIME)

Любой ответ и комментарий приветствуются, спасибо.


Примечания: Iможно создать аналогичную таблицу без _PARTITIONTIME с запросом, подобным следующему:

CREATE TABLE `db.new_table`
PARTITION BY partition_date
CLUSTER BY field1, field2
AS SELECT DATE(_PARTITIONTIME) AS partition_date, * FROM `db.old_table`
WHERE _PARTITIONTIME > '1990-01-01'

Однако, поскольку многое в системе зависит от db.old_table, изменение поля раздела с _PARTITIONTIME на partition_date приведет кмного изменений запросов ... Поэтому было бы гораздо предпочтительнее, если бы мы могли создать кластеризованную таблицу с точно такой же схемой и данными.

1 Ответ

0 голосов
/ 19 ноября 2018

Вы можете просто предварительно создать разделенную на день кластеризованную таблицу (на любые поля) с именем db.new_table, используя либо BQ UI, либо команду bq.

Как только таблица будет на месте, вы можете заполнить «для каждого дня» следующим образом:

bq query --allow_large_results --append_table --noflatten_results --destination_table 'db.new_table$19900101' "select field1, field2, field3 from db.old_table where _PARTITIONTIME = '1990-01-01'";

Обратите внимание на две вещи:

  • Вы должны выполнить этот запросза каждый день отдельно (который будет стоить вам примерно столько же, так что не беспокойтесь об этом).
  • db.new_table$19900101 указывает на раздел 1990-01-01 в db.new_table.
...