管理分區資料表

這份文件說明如何在 BigQuery 中管理分區資料表。擷取時間分區與分區資料表的管理方式相同。您可以針對分區資料表執行下列管理工作:

  • 更新時間分區資料表的:
    • 說明
    • 資料表到期時間
    • 分區到期時間
    • 分區篩選器必要條件
    • 結構定義
    • 標籤
  • 重新命名 (複製) 時間分區資料表
  • 複製時間分區資料表
  • 複製分區
  • 刪除時間分區資料表
  • 刪除時間分區資料表中的分區

有關建立及使用分區資料表的詳情,包括取得資料表資訊、列出資料表,以及控管資料表中資料的存取權等,請參閱建立及使用擷取時間分區資料表建立及使用分區資料表等文章。

更新分區資料表屬性

您可以更新分區資料表的:

  • 說明
  • 資料表到期時間
  • 分區到期時間
  • 結構定義
  • 標籤

所需權限

如要更新資料表屬性,至少必須具備 bigquery.tables.updatebigquery.tables.get 權限。以下是具有 bigquery.tables.updatebigquery.tables.get 權限的預先定義 Cloud IAM 角色:

  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

此外,具備 bigquery.datasets.create 權限的使用者在建立資料集時,會獲得 bigquery.dataOwner 存取權。 bigquery.dataOwner 存取權可讓使用者更新資料集裡的資料表屬性。

如要進一步瞭解 BigQuery 中的 Cloud IAM 角色和權限,請參閱預先定義的角色和權限一文。

更新分區資料表的說明

更新分區資料表說明的程序與更新標準資料表說明的程序相同。如要深入瞭解如何新增或變更資料表的說明,請參閱更新資料表的說明

目前,您無法為個別分區建立說明。

更新資料表到期時間

更新分區資料表到期時間的程序與更新標準資料表到期時間的程序相同。如要深入瞭解如何新增或變更資料表的到期時間,請參閱更新資料表的到期時間

更新分區到期時間

建立資料表時,您可以藉由以下方式來指定分區資料表的分區到期時間:

  • 使用 DDL ALTER TABLE 陳述式
  • 使用指令列工具的 bq mk 指令
  • 呼叫 API 方法 tables.insert
  • 使用用戶端程式庫

目前 GCP Console 或傳統 BigQuery 網頁版 UI 不支援指定分區到期時間。

如果您在建立資料表時指定了分區的到期時間,分區到期時間會覆寫資料集層級的預設分區到期時間。當您設定資料表層級分區到期時間時,所有分區都會受到到期時間的限制。您無法將不同的到期時間套用至個別分區。

建立資料表之後,您可以隨時使用 CLI 的 bq update 指令或 API 的 tables.patch 方法更新資料表的分區到期時間。GCP Console 或傳統 BigQuery 網頁版 UI 目前不支援更新分區到期時間。不過,您可以利用 DDL 陳述式在任一種 UI 中更新分區到期時間。

更新資料表的分區到期時間時,相關設定會套用至所有分區,無論分區何時建立都一樣。

更新資料表的分區到期時間時,您必須以世界標準時間分區日期的午夜為準計算分區到期時間。

如果分區資料表也設定了資料表到期時間,系統會依據資料表到期時間設定刪除資料表與其中的所有分區。資料表到期時間的優先順序高於分區到期時間。

例如,如果分區資料表的到期時間設定為 5 天,而分區的到期時間設定為 7 天,會在 5 天之後刪除資料表與其中的所有分區。

對於在 2016 年 12 月 13 日之前建立分區資料表的專案,分區到期時間以最後一次修改分區的日期為準。這個行為也適用於在這些專案中建立的新資料表。如要將專案遷移到新行為,請在 BigQuery 問題追蹤工具中開啟要求。

更新分區資料表的分區到期時間:

DDL

資料定義語言 (DDL) 陳述式可讓您使用標準 SQL 查詢語法建立和修改資料表及檢視表。

詳情請參閱使用資料定義語言陳述式一文。

更新分區資料表的分區到期時間:

  1. 在 GCP Console 中開啟 BigQuery 網頁版 UI。
    前往 GCP Console

  2. 按一下 [Compose new query] (撰寫新查詢)

  3. 將您的 DDL 陳述式輸入到「Query editor」(查詢編輯器) 的文字區域。

     ALTER TABLE mydataset.mytable
     SET OPTIONS (
       -- Sets partition expiration to 5 days
       partition_expiration_days=5
     )
     

  4. 按一下 [Run] (執行)

CLI

發出 bq update 指令並搭配使用 --time_partitioning_expiration 標記。如果您要更新非預設專案中的分區資料表,請使用下列格式將專案 ID 新增至資料集名稱:project_id:dataset

bq update \
--time_partitioning_expiration integer \
project_id:dataset.table

其中:

  • 「integer」是資料表分區的預設生命週期 (以秒為單位),這個值沒有下限。到期時間為分區日期加整數值。如果您指定 0,就會移除分區到期時間,分區將永遠不會過期。沒有到期時間的分區必須手動刪除。
  • 「project_id」是您的專案 ID。
  • 「dataset」是含有您要更新之資料表的資料集名稱。
  • 「table」是您要更新的資料表名稱。

範例:

輸入下列指令,將 mydataset.mytable 中的分區到期時間更新為 5 天 (432000 秒)。mydataset 位於預設專案中。

bq update --time_partitioning_expiration 432000 mydataset.mytable

輸入下列指令,將 mydataset.mytable 中的分區到期時間更新為 5 天 (432000 秒)。mydataset 位於 myotherproject 而非預設專案中。

bq update \
--time_partitioning_expiration 432000 \
myotherproject:mydataset.mytable

API

呼叫 tables.patch 方法,並使用 timePartitioning.expirationMs 屬性更新分區到期時間 (以毫秒為單位)。tables.update 方法會取代整個資料表資源,因此建議使用 tables.patch 方法。

更新分區篩選器必要條件

建立分區資料表時,可啟用 [Require partition filter] (需要分區篩選器) 選項,要求使用述詞篩選條件。套用此選項時,嘗試在未指定 WHERE 子句的情況下查詢分區資料表會產生下列錯誤:Cannot query over table 'project_id.dataset.table' without a filter that can be used for partition elimination

有關如何在建立分區資料表時新增 [Require partition filter] (需要分區篩選器) 選項的詳情,請參閱建立分區資料表一節。

如果您在建立分區資料表時未啟用 [Require partition filter] (需要分區篩選器) 選項,可以更新該資料表以新增選項。

更新必要分區篩選器選項

如要更新分區資料表以要求進行包含縮減分區的 WHERE 子句的查詢:

主控台

建立分區資料表後,您無法使用 GCP Console 要求啟用分區篩選器。

傳統版 UI

建立分區資料表後,您就無法使用網頁版 UI 來要求使用分區篩選器。

CLI

如要使用 CLI 更新分區資料表表以要求啟用分區篩選器,請輸入 bq update 指令並加上 --require_partition_filter標記。

如要更新非預設專案中的分區資料表,請使用下列格式將專案 ID 新增到資料集:project_id:dataset

例如:

如要在預設專案中更新 mydataset 中的 mypartitionedtable,請輸入:

bq update --require_partition_filter mydataset.mytable

如要在 myotherproject 中更新 mydataset 中的 mypartitionedtable,請輸入:

bq update --require_partition_filter myotherproject:mydataset.mytable

API

呼叫 tables.patch 方法並將 requirePartitionFilter 屬性設定為 true 以要求啟用分區篩選器。tables.update 方法會取代整個資料表資源,因此建議使用 tables.patch 方法。

更新結構定義

更新分區資料表的結構定義和更新標準資料表的結構定義均採用相同的程序。詳情請參閱修改資料表結構定義一文。

將分區資料表重新命名

目前,您無法變更現有分區資料表的名稱。如果您需要變更資料表名稱,請依照步驟複製資料表。當您在複製操作中指定目的地資料表時,請使用新資料表名稱。

複製分區資料表

複製單一分區資料表

複製分區資料表的程序與複製標準資料表的程序相同。如需詳細資訊,請參閱複製資料表

複製分區資料表時,請注意以下幾點:

  • 來源與目的地資料表都必須位於資料集中的相同位置

  • 將分區資料表複製到新的分區目的地資料表
    如果您將時間分區資料表複製到新資料表,所有分區資訊都會隨資料表一起複製。新資料表與舊資料表的分區相同。
  • 將非分區資料表複製到分區資料表
    如果將非分區資料表複製到分區資料表,BigQuery 會將來源資料複製到表示目前日期的分區。
  • 將分區資料表複製到其他分區資料表
    如要將分區資料表複製到其他分區資料表,來源與目的地資料表的分區指定必須相符。 您可以指定要附加還是覆寫目的地資料表。
  • 將分區資料表複製到非分區資料表
    如果您將分區資料表複製到非分區資料表,目的地資料表仍為非分區。視您的設定而定,資料會附加到非分區資料表或用來覆寫非分區資料表。

複製多個分區資料表

複製多個分區資料表的程序與複製多個標準資料表的程序相同。如需詳細資訊,請參閱複製多個來源資料表

複製多個分區資料表時,請注意以下幾點:

  • 如果您將多個來源資料表複製到相同工作中的分區資料表,來源資料表不能包含分區與非分區資料表的混合結果。
  • 如果所有來源資料表都是分區資料表,所有來源資料表的分區指定必須符合目的地資料表的分區指定。您的設定決定了是附加還是覆寫目的地資料表。
  • 來源與目的地資料表都必須位於資料集中的相同位置

複製分區

您可以透過下列方式複製一或多個分區:

  • 使用指令列工具的 bq cp 指令
  • 呼叫 API 方法 jobs.insert 並設定 copy 工作
  • 使用用戶端程式庫

目前 GCP Console 或傳統 BigQuery 網頁版 UI 不支援複製分區。

所需權限

如要複製資料表和分區資料,您至少需具備以下權限。

針對來源資料集

  • bigquery.tables.get
  • bigquery.tables.getData

針對目的地資料集

  • bigquery.tables.create 用以在目的地資料集中建立資料表和分區的複本。

以下是具有 bigquery.tables.createbigquery.tables.getbigquery.tables.getData 權限的預先定義 Cloud IAM 角色:

  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

此外,您必須擁有 bigquery.jobs.create 權限,才能執行複製工作

以下是具有 bigquery.jobs.create 權限的預先定義 Cloud IAM 角色:

  • bigquery.user
  • bigquery.jobUser
  • bigquery.admin

此外,具備 bigquery.datasets.create 權限的使用者在建立資料集時,會獲得 bigquery.dataOwner 存取權。 bigquery.dataOwner 存取權可讓使用者複製資料集中的資料表和分區,但也需要目的地資料集的存取權,除非使用者同時建立目的地資料集。

如要進一步瞭解 BigQuery 中的 Cloud IAM 角色和權限,請參閱預先定義的角色和權限一文。

複製單一分區

主控台

GCP Console 不支援複製分區。

傳統版 UI

傳統 BigQuery 網頁版 UI 不支援複製分區。

CLI

如要複製分區,請使用指令列工具的 bq cp (複製) 指令與分區修飾符 ($date),例如 $20160201

選用標記可用來控管目的地分區的寫入配置:

  • -a 或 --append_table 可將資料從來源分區附加至目的地資料集的現有資料表或分區。
  • -f--force 可覆寫目的地資料集中的現有資料表或分區,並且不會提示您確認。
  • 如果資料表或分區存在於目的地資料集中,-n--no_clobber 會傳回下列錯誤訊息:「Table 'project_id:dataset.table or table$date' already exists, skipping. 」。If -n` 未指定,預設行為是提示您選擇是否取代目的地資料表或分區。
  • --destination_kms_key 是客戶管理的 Cloud KMS 金鑰,可用來加密目的地資料表或分區。

cp 指令不支援 --time_partitioning_field--time_partitioning_type 標記。您無法使用複製工作將擷取時間分區資料表轉換為分區資料表。

本文不示範 --destination_kms_key。詳情請參閱使用 Cloud KMS 金鑰保護資料一文。

如果來源或目的地資料集位於非預設專案中,請採用下列格式將專案 ID 新增至該資料集的名稱:project_id:dataset

(選用) 提供 --location 標記,並將值設為您的位置

bq --location=location cp \
-a -f -n \
project_id:dataset.source_table$source_partition \
project_id:dataset.destination_table$destination_partition

其中:

  • 「location」是您位置的名稱,--location 是選用標記。舉例來說,如果您在東京地區使用 BigQuery,請將標記的值設為 asia-northeast1。您可以使用 .bigqueryrc 檔案設定位置的預設值。
  • 「project_id」是您的專案 ID。
  • 「dataset」是來源或目的地資料集的名稱。
  • 「source_table」是您要複製的資料表。
  • 「source_partition」是來源分區的分區修飾符。
  • 「destination_table」是目的地資料集中資料表的名稱。
  • 「destination_partition」是目的地分區的分區修飾符。

範例:

將分區複製到新資料表

輸入下列指令,將 2018 年 1 月 30 日的分區從 mydataset.mytable 複製到新資料表:mydataset.mytable2mydataset 位於預設專案中。

bq cp -a 'mydataset.mytable$20180130' mydataset.mytable2

將分區複製到非分區資料表

輸入下列指令,將 2018 年 1 月 30 日的分區從 mydataset.mytable 複製到非分區資料表:mydataset2.mytable2-a 捷徑可用來將分區的資料附加至非分區目的地資料表。兩個資料集都位於預設專案中。

bq cp -a 'mydataset.mytable$20180130' mydataset2.mytable2

輸入下列指令,將 2018 年 1 月 30 日的分區從 mydataset.mytable 複製到非分區資料表:mydataset2.mytable2-f 捷徑可用來在無提示的情況下覆寫非分區目的地資料表。

bq --location=US cp -f 'mydataset.mytable$20180130' mydataset2.mytable2

將分區複製到其他分區資料表

輸入下列指令,將 2018 年 1 月 30 日的分區從 mydataset.mytable 複製到另一個分區資料表:mydataset2.mytable2-a 捷徑可用來將分區的資料附加至目的地資料表。由於目的地資料表上未指定分區修飾符,因此會保留來源分區索引鍵,並將資料複製到目的地資料表中 2018 年 1 月 30 號的分區。您亦可以在目的地資料表上指定分區修飾符,將資料複製到指定的分區。mydataset 位於預設的專案中。mydataset2 位於 myotherproject 而非預設專案中。

bq --location=US cp \
-a \
'mydataset.mytable$20180130' \
myotherproject:mydataset2.mytable2

輸入下列指令,將 2018 年 1 月 30 日的分區從 mydataset.mytable 複製到另一個分區資料表:mydataset2.mytable2 (2018 年 2 月 20 日的分區)。-f 捷徑可用來在無提示的情況下覆寫目的地資料表中 2018 年 2 月 20 日的分區。如未使用分區修飾符,則會覆寫目的地資料表中的所有資料。mydataset 在您的預設專案中。 mydataset2 位於 myotherproject 而非預設專案中。

bq cp \
-f \
'mydataset.mytable$20180130' \
'myotherproject:mydataset2.mytable2$20180220'

輸入下列指令,將 2018 年 1 月 30 日的分區從 mydataset.mytable 複製到另一個分區資料表:mydataset2.mytable2mydataset 位於您的預設專案中。mydataset2 位於 myotherproject,而非預設專案。如果目的地資料表中有資料,則預設行為是提示您進行覆寫。

bq cp \
'mydataset.mytable$20180130' \
myotherproject:mydataset2.mytable2

API

呼叫 jobs.insert 方法,並設定 copy 工作。(選用) 在工作資源jobReference 區段中,於 location 屬性指定您的地區。

在工作設定中指定下列屬性:

  • sourceTables 屬性中輸入來源資料集、資料表和分區。
  • destinationTable 屬性中輸入目的地資料集與資料表。
  • writeDisposition 屬性指定要附加還是覆寫目的地資料表或分區。

複製多個分區

複製多個分區:

主控台

目前 GCP Console 不支援複製分區。

傳統版 UI

目前傳統 BigQuery 網頁版 UI 不支援複製分區。

CLI

複製多個分區的程序與複製單一分區的程序相同,但您會以逗號分隔清單的形式指定多個來源分區:

bq cp \
'mydataset.mytable$20180130,mydataset.mytable$20180131' \
myotherproject:mydataset.mytable2

API

呼叫 jobs.insert 方法,並設定 copy 工作。在工作資源jobReference 區段中,於 location 屬性指定您的地區。

在工作設定中指定下列屬性:

  • sourceTables 屬性中輸入多個來源分區 (包括資料集與資料表名稱)。
  • destinationTable 屬性中輸入目的地資料集與資料表。
  • writeDisposition 屬性指定要附加還是覆寫目的地資料表或分區。

刪除分區資料表

刪除時間分區資料表和其中所有分區的程序與刪除標準資料表的程序相同。如需刪除資料表的相關資訊,請參閱刪除資料表

刪除分區資料表中的分區

您可以使用指令列工具的 bq rm 指令,或透過呼叫 API 方法 tables.delete 刪除分區資料表中的分區。傳統 BigQuery 網頁版 UI 目前不支援刪除分區。

您可以使用分區修飾符來刪除特定分區。例如,名為 mydataset.mytable 之分區資料表中的 2016 年 3 月 1 日分區 ($20160301) 可以使用以下指令刪除:

bq rm 'mydataset.mytable$20160301'

如要擷取分區資料表中的分區清單,請參閱列出擷取時間分區資料表中的分區列出分區資料表中的分區各節。

目前,您一次只能刪除一個分區。

所需權限

如要刪除分區,您至少需具備 bigquery.tables.deletebigquery.tables.get 權限。以下是具有 bigquery.tables.deletebigquery.tables.get 權限的預先定義 Cloud IAM 角色:

  • bigquery.dataOwner
  • bigquery.dataEditor
  • bigquery.admin

此外,具備 bigquery.datasets.create 權限的使用者在建立資料集時,會獲得 bigquery.dataOwner 存取權。 bigquery.dataOwner 存取權可讓使用者刪除資料集內的資料表和分區。

如要進一步瞭解 BigQuery 中的 Cloud IAM 角色和權限,請參閱預先定義的角色和權限一文。

刪除分區資料表中的分區

您可以指定分區的修飾符來刪除分區,除非它是兩個特殊分區之一。 目前您無法刪除 __NULL____UNPARTITIONED__ 分區。

如要刪除分區資料表中的分區:

主控台

GCP Console 不支援刪除分區。

傳統版 UI

傳統 BigQuery 網頁版 UI 不支援刪除分區。

CLI

使用 bq rm 指令並搭配使用 --table 標記 (或 -t 捷徑),以及參照分區修飾符 ($date) 來刪除分區資料表中的特定分區。當您使用 CLI 移除分區時,必須確認操作。您可以使用 --force 標記 (或 -f 捷徑) 來略過確認程序。

如果分區資料表位於非預設專案的資料集中,請使用下列格式將專案 ID 新增至資料集名稱:project_id:dataset

bq rm -f -t project_id:dataset.table$date

其中:

  • 「project_id」是您的專案 ID。
  • 「dataset」是資料表所屬的資料集名稱。
  • 「table」是資料表名稱。
  • 「$date」是您要刪除之分區的分區修飾符。

範例:

輸入下列指定,刪除名為 mydataset.mytable 之分區資料表中 2016 年 3 月 1 日的分區 ($20160301)。mydataset 位於預設專案中。

bq rm 'mydataset.mytable$20160301'

輸入下列指令,刪除名為 mydataset.mytable 之分區資料表中 2017 年 1 月 1 日的分區 ($20170101)。mydataset 位於 myotherproject 而非預設專案中。

bq rm 'myotherproject:mydataset.mytable$20170101'

輸入下列指令,刪除名為 mydataset.mytable 之分區資料表中 2018 年 1 月 18 日的分區 ($20180118)。mydataset 位於 myotherproject 而非預設專案中。-f 捷徑可用來略過確認程序。

bq rm -f 'myotherproject:mydataset.mytable$20180118'

API

呼叫 tables.delete 方法,並使用 tableId 參數指定資料表與分區修飾符。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
需要協助嗎?請前往我們的支援網頁