管理分區資料表

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

如要進一步瞭解如何建立及使用分區資料表,包括取得資料表資訊、列出資料表、控管資料表資料的存取權等,請參閱建立及使用擷取時間分區資料表建立及使用分區資料表

更新分區資料表屬性

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

所需權限

如要更新資料表屬性,您必須擁有資料集層級的 WRITER 權限,或是取得具備 bigquery.tables.update 權限的專案層級身分與存取權管理 (IAM) 角色。以下是擁有 bigquery.tables.update 權限的預先定義專案層級身分與存取權管理角色:

此外,因為 bigquery.user 角色擁有 bigquery.datasets.create 權限,所以接受 bigquery.user 角色指派的使用者可以更新那位使用者在資料集中建立的任何資料表。當接受 bigquery.user 角色指派的使用者建立資料集時,那位使用者即被授予資料集的 OWNER 存取權。資料集的 OWNER 存取權可讓使用者完全控管該資料集,以及其中的所有資料表和視圖。

如要深入瞭解 BigQuery 中的 IAM 角色和權限,請參閱 存取權控管一文。

更新分區資料表的說明

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

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

更新資料表到期時間

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

更新分區到期時間

建立資料表時,您可以使用指令列工具的 bq mk 指令或透過呼叫 tables.insert API 方法來指定分區資料表的分區到期時間。目前 GCP 主控台或傳統 BigQuery 網頁版 UI 不支援指定分區到期時間。

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

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

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

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

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

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

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

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

主控台

  1. 在 GCP 主控台中開啟 BigQuery 網頁版 UI。
    前往 BigQuery 網頁版 UI

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

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

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

傳統版 UI

  1. 前往 BigQuery 網路 UI。

    前往 BigQuery 網頁版 UI

  2. 按一下 [撰寫查詢]。

  3. 將您的 DDL 陳述式輸入到「New Query」(新查詢) 文字區域中。

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

指令列

發出 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 方法。

更新結構定義

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

將分區資料表重新命名

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

複製分區資料表

複製單一分區資料表

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

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

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

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

複製多個分區資料表

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

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

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

複製分區

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

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

所需權限

如要在資料集層級複製分區,您需要擁有這些分區所屬來源資料集的 READER 存取權,以及目的地資料集的 WRITER 存取權。

如果不使用資料集層級權限,您可以使用擁有 bigquery.tables.createbigquery.tables.getData 權限的專案層級身分與存取權管理角色。必須要擁有 bigquery.tables.create 權限才能在目標資料集裡建立分區的副本 (如果目的地資料表是新的)。必須要擁有 bigquery.tables.getData 權限才能在要複製的分區中讀取資料。

下列預先定義的專案層級 IAM 角色擁有專案中每個資料集的 bigquery.tables.createbigquery.tables.getData 權限:

您還必須取得 bigquery.jobs.create 權限才可執行複製工作。 以下預先定義的專案層級 IAM 角色擁有 bigquery.jobs.create 權限:

此外,因為 bigquery.user 角色擁有 bigquery.datasets.create 權限,所以接受 bigquery.user 角色指派的使用者就能讀取或複製使用者建立的任一資料表或分區中的資料。當接受 bigquery.user 角色指派的使用者建立資料集時,那位使用者即被授予資料集的 OWNER 存取權。資料集的 OWNER 存取權可讓使用者完全控管該資料集,以及其中的所有資料表和分區。

如要深入瞭解 BigQuery 中的 IAM 角色和權限,請參閱存取權控管一文。如要深入瞭解資料集層級角色,請參閱資料集的原始角色一節。

複製單一分區

主控台

GCP 主控台不支援複製分區。

傳統版 UI

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

指令列

如要複製分區,請使用指令列工具的 bq cp (複製) 指令與分區裝飾器 ($[DATE]),例如 $20160201

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

  • -a 或 --append_table 可將資料從來源分區附加至目的地資料集的現有資料表或分區。
  • -f--force 可覆寫目的地資料集中的現有資料表或分區,並且不會提示您確認。
  • 如果資料表或分區存在於目的地資料集中,-n--no_clobber 會傳回下列錯誤訊息:Table '[PROJECT_ID]:[DATASET].[TABLE] or [TABLE]$[DATE]' already exists, skipping。若未指定 -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 位於預設專案中。mydatasetUS 多區域中建立。

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

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

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

bq --location=asia-northeast1 cp -a 'mydataset.mytable$20180130' mydataset2.mytable2

輸入下列指令,將 2018 年 1 月 30 日分區從 mydataset.mytable 複製到非分區資料表 — mydataset2.mytable2-f 捷徑可用來在無提示的情況下覆寫非分區目的地資料表。 兩個資料集都在您的預設專案中,並且都在 US 多區域位置建立。

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

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

輸入下列指令,將 2018 年 1 月 30 日分區從 mydataset.mytable 複製到另一個分區資料表 — mydataset2.mytable2-a 捷徑可用來將分區的資料附加至目標資料表。由於目標資料表上未指定分區裝飾器,因此將來源分區鍵保留,且將資料複製到目標資料表中 2018 年 1 月 30 號的分區。您亦可以在目標資料表上指定分區裝飾器,將資料複製到指定的分區。mydataset 位於預設的專案中。 mydataset2 位於 myotherproject 而非預設專案中。兩個資料集都建立於 US 多區域位置。

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 而非預設專案中。兩個資料集都建立於 US 多區域位置。

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

輸入下列指令,將 2018 年 1 月 30 日分區從 mydataset.mytable 複製到另一個分區資料表 — mydataset2.mytable2mydataset 位於預設專案中。mydataset2 位於 myotherproject 而非預設專案中。若目標資料表中有資料,則預設行為是提示您進行覆寫。兩個資料集都建立於 asia-northeast1 多區域位置。

bq --location=asia-northeast1 cp 'mydataset.mytable$20180130' myotherproject:mydataset2.mytable2

API

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

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

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

複製多個分區

複製多個分區:

主控台

目前 GCP 主控台不支援複製分區。

傳統版 UI

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

指令列

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

bq --location=[LOCATION] cp 'mydataset.mytable$20180130,mydataset.mytable$20180131' myotherproject:mydataset.mytable2

API

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

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

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

刪除分區資料表

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

刪除分區資料表中的分區

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

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

bq rm 'mydataset.mytable$20160301'

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

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

所需權限

如要刪除分區,您必須具備資料集層級的 OWNER 存取權,或取得具備 bigquery.tables.delete 權限的專案層級身分與存取權管理角色。以下是擁有 bigquery.tables.delete 權限的預先定義專案層級身分與存取權管理角色:

取得預先定義專案層級角色指派的使用者可以刪除專案內任何分區資料表中的分區。在資料集層級取得 OWNER 權限指派的使用者只能刪除那個資料集中資料表中的分區。

此外,因為 bigquery.user 角色具備 bigquery.datasets.create 權限,所以取得 bigquery.user 角色指派的使用者可以在那位使用者建立的任何資料集中刪除資料表與分區。當接受 bigquery.user 角色指派的使用者建立資料集時,那位使用者即被授予資料集的 OWNER 存取權。資料集的 OWNER 存取權可讓使用者完全控管該資料集,以及其中的所有資料表和資料表分區。

如要深入瞭解 BigQuery 中的 IAM 角色和權限,請參閱存取權控管一文。如要深入瞭解資料集層級角色,請參閱資料集的原始角色一節。

刪除分區資料表中的分區

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

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

主控台

GCP 主控台不支援刪除分區。

傳統版 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 參數指定資料表與分區修飾符。

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

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

這個網頁