將 Cloud Storage 資料載入 BigQuery
您可以使用 Cloud Storage 連接器的 BigQuery 資料移轉服務,將資料從 Cloud Storage 載入 BigQuery。使用 BigQuery 資料移轉服務,您可以排定週期性移轉工作,將 Cloud Storage 中的最新資料新增至 BigQuery。
如要瞭解 Cloud Storage 移轉作業的運作方式,請參閱「Cloud Storage 資料移轉簡介」。
限制
從 Cloud Storage 到 BigQuery 的週期性資料移轉作業有下列限制:
- 凡是符合萬用字元或資料移轉執行階段參數所定義模式的檔案都必須共用您為目的地資料表定義的架構,否則移轉作業會失敗。如果執行作業期間資料表結構定義有變更,也會導致移轉作業失敗。
- 由於 Cloud Storage 物件可以建立版本,因此請務必注意,BigQuery 資料移轉作業不支援封存的 Cloud Storage 物件。物件必須處於使用中狀態才能轉移。
- 與從 Cloud Storage 到 BigQuery 的個別資料載入不同,對於持續進行的資料移轉,您必須先建立目的地資料表,再設定移轉作業。如果是 CSV 和 JSON 檔案,您也必須預先定義資料表結構定義。BigQuery 無法在週期性資料移轉程序中建立資料表。
- 從 Cloud Storage 移轉資料時,系統預設會將「Write preference」(寫入偏好設定) 參數設為
APPEND。在這個模式下,未經修改的檔案只能載入 BigQuery 一次。如果檔案的last modification time屬性更新,系統會重新載入檔案。 - 如果 Cloud Storage 檔案在資料移轉期間經過修改,BigQuery 資料移轉服務無法保證所有檔案都會移轉,或只移轉一次。
從 Cloud Storage bucket 將資料載入 BigQuery 時,會受到下列限制:
- BigQuery 無法保證外部資料來源的資料一致性。查詢執行期間,基礎資料的變更可能會導致非預期的行為。
- BigQuery 不支援 Cloud Storage 物件版本管理。如果您在 Cloud Storage URI 中加入版本編號,載入工作就會失敗。
視 Cloud Storage 來源資料的格式而定,可能會有其他限制。詳情請參閱下列資源:
間隔下限
- 系統會立即選取來源檔案進行資料移轉,沒有檔案存在時間下限。
- 週期性資料移轉作業之間的最短間隔時間為 15 分鐘。定期資料移轉的預設間隔為每 24 小時一次。
- 您可以設定事件觸發的移轉,自動排定資料移轉時間,縮短間隔。
事前準備
建立 Cloud Storage 資料移轉作業前,請先完成下列事項:
- 確認您已完成「啟用 BigQuery 資料移轉服務」中的所有必要動作。
- 請擷取您的 Cloud Storage URI。
- 請建立 BigQuery 資料集來儲存您的資料。
- 建立資料移轉目的地資料表,並指定結構定義。您可以建立 BigQuery 資料表或建立 Iceberg 代管資料表。
- 如果您打算指定客戶自行管理的加密金鑰 (CMEK),請確認服務帳戶具備加密和解密權限,且您擁有使用 CMEK 所需的 Cloud KMS 金鑰資源 ID。如要瞭解 CMEK 如何與 BigQuery 資料移轉服務搭配運作,請參閱「指定移轉作業加密金鑰」。
所需權限
將資料載入 BigQuery 時,您必須具備相關權限才能將資料載入新的或現有的 BigQuery 資料表和分區。如要載入 Cloud Storage 中的資料,您也必須具備資料所屬值區的存取權。請確認您已擁有下列必要權限:
必要的 BigQuery 角色
如要取得建立 BigQuery 資料移轉服務資料移轉作業所需的權限,請要求管理員授予您專案的 BigQuery 管理員 (roles/bigquery.admin) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
這個預先定義的角色具備建立 BigQuery 資料移轉服務資料移轉作業所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:
所需權限
您必須具備下列權限,才能建立 BigQuery 資料移轉服務資料移轉作業:
-
BigQuery 資料移轉服務權限:
-
bigquery.transfers.update -
bigquery.transfers.get
-
-
BigQuery 權限:
-
bigquery.datasets.get -
bigquery.datasets.getIamPolicy -
bigquery.datasets.update -
bigquery.datasets.setIamPolicy -
bigquery.jobs.create
-
詳情請參閱「授予 bigquery.admin 存取權」。
必要的 Cloud Storage 角色
您必須具備個別 bucket 的 storage.objects.get 權限或更高權限。如果使用 URI 萬用字元,則必須具備 storage.objects.list 權限。如要在每次成功移轉資料後刪除來源檔案,您也需要 storage.objects.delete 權限。storage.objectAdmin 預先定義的 IAM 角色包含所有這些權限。
設定 Cloud Storage 轉移作業
如要在 BigQuery 資料移轉服務中建立 Cloud Storage 資料移轉作業,請按照下列步驟操作:
控制台
前往 Google Cloud 控制台的「Data transfers」(資料移轉) 頁面。
按一下「建立轉移作業」。
在「Source type」(來源類型) 部分,「Source」(來源) 請選取「Google Cloud Storage」。
在「Transfer config name」(轉移設定名稱) 部分,「Display name」(顯示名稱) 請輸入資料移轉作業的名稱,例如
My Transfer。移轉作業名稱可以是任意值,日後需要修改移轉作業時能夠據此識別。
在「Schedule options」(排程選項) 部分選取「Repeat frequency」(重複執行頻率):
如果選取「Hours」(小時)、「Days」(天)、「Weeks」(週)或「Months」(月),必須一併指定頻率。您也可以選取「Custom」(自訂),自行指定重複頻率。您可以選取「Start now」(立即開始) 或「Start at set time」(在所設時間開始執行),並提供開始日期和執行時間。
如果選取「On-demand」,這項資料移轉作業會在您手動觸發後執行。
如果選取「Event-driven」(以事件為依據),則須一併指定Pub/Sub 訂閱項目。請選取訂閱項目名稱,或是點選「Create a subscription」(建立訂閱項目)。這個選項會啟用以事件為依據的移轉作業,事件傳送至 Pub/Sub 訂閱項目時,就會觸發移轉作業。
在「Destination settings」(目的地設定) 部分:
- 在「Dataset」(資料集) 部分,選取您為了儲存資料而建立的資料集。
- 如要移轉至 BigQuery 資料表,請選取「Native table」(原生資料表)。
- 如要移轉至 Iceberg 代管資料表,請選取「Iceberg Managed」。
- 在「Dataset」(資料集) 部分,選取您為了儲存資料而建立的資料集。
在「Data source details」(資料來源詳細資料) 區段:
- 在「Destination table」(目標資料表) 中輸入目標資料表的名稱。 目的地資料表的名稱必須符合資料表命名規則,並支援參數。
- 在「Cloud Storage URI」輸入 Cloud Storage URI。可以使用萬用字元和參數。如果 URI 與所有檔案都不相符,不會覆寫目的地資料表中任何資料。
「Write preference」(寫入偏好設定) 提供下列選項:
- 「APPEND」(附加):逐步將新的資料附加至現有目的地資料表。「Write preference」(寫入偏好設定) 的預設值為「APPEND」(附加)。
- 「MIRROR」(建立鏡像):每次資料移轉時,覆寫目的地資料表資料。
如要進一步瞭解 BigQuery 資料移轉服務如何使用「APPEND」(附加) 或「MIRROR」(建立鏡像) 來擷取資料,請參閱 Cloud Storage 移轉作業資料擷取的相關說明。 如要進一步瞭解
writeDisposition欄位,請參閱JobConfigurationLoad。如要在每次成功移轉資料後刪除來源檔案,請勾選「Delete source files after transfer」方塊。系統會盡可能執行刪除工作,但不保證一定達成。如果第一次刪除來源檔案失敗,不會再重試。
在「Transfer Options」部分執行下列操作:
- 在「All Formats」底下:
- 在「Number of errors allowed」(允許的錯誤數量) 欄位中,輸入 BigQuery 在執行工作時可忽略的錯誤記錄數量上限。如果損壞記錄數量超過這個值,該項工作就會失敗,並在結果傳回
invalid錯誤。預設值為0。 - (選用步驟) 在「Decimal target types」部分,輸入以半形逗號分隔的清單,內含來源小數值可能轉換成的 SQL 資料類型。系統會依據下列條件,選取要轉換的 SQL 資料類型:
- 系統會按照
NUMERIC、BIGNUMERIC和STRING的順序,選取下列清單中第一個支援來源資料有效位數和小數位數的資料類型,用來轉換。 - 如果清單中的資料類型都不支援有效位數和小數位數,則會選取指定清單中支援範圍最廣的資料類型。如果讀取來源資料時,值超過支援的範圍,就會擲回錯誤。
- 資料類型
STRING支援所有有效位數和小數位數值。 - 如果將這個欄位留空,ORC 的預設資料類型為
NUMERIC,STRING,其他檔案格式則為NUMERIC。 - 這個欄位不得含有重複的資料類型。
- 您在這個欄位提供資料類型時採用的順序不會有影響。
- 系統會按照
- 在「Number of errors allowed」(允許的錯誤數量) 欄位中,輸入 BigQuery 在執行工作時可忽略的錯誤記錄數量上限。如果損壞記錄數量超過這個值,該項工作就會失敗,並在結果傳回
- 如要在移轉資料時,捨棄不符合目的地資料表結構定義的資料,請勾選「JSON, CSV」(JSON、CSV) 底下的「Ignore unknown values」(略過不明的值) 方塊。
- 如果您希望資料移轉作業將 Avro 邏輯類型轉換為對應的 BigQuery 資料類型,請在「AVRO」底下勾選「Use avro logical types」方塊。預設會忽略多數類型的
logicalType屬性,並改用基礎 Avro 類型。 在「CSV」CSV 下方:
- 在「Field delimiter」(欄位分隔符號) 部分輸入分隔欄位的字元。預設值為半形逗號。
- 在「Quote character」(引用字元) 輸入 CSV 檔案中用來引用資料區段的字元,預設值為英文雙引號 (
")。 - 如果您不想匯入來源檔案中的標題列,請在「Header rows to skip」(要略過的標題列) 輸入不要匯入的標題列數。預設值為
0。 - 如果要允許在引用欄位中使用換行符號,請勾選 [Allow quoted newlines] (允許引用換行符號) 的方塊。
- 若允許移轉缺少
NULLABLE資料欄的資料列,請勾選「Allow jagged rows (CSV)」(允許空值資料列 (CSV)) 方塊。
請參閱此處,進一步瞭解 CSV 適用選項。
- 在「All Formats」底下:
在「Service Account」(服務帳戶) 選單,選取與貴組織 Google Cloud 專案相關聯的服務帳戶。您可以將服務帳戶與資料移轉作業建立關聯,這樣就不需要使用者憑證。如要進一步瞭解如何搭配使用服務帳戶與資料移轉作業,請參閱使用服務帳戶。
選用步驟:在「Notification options」(通知選項) 部分執行下列操作:
選用步驟:如果您使用 CMEK,請在「Advanced options」(進階選項) 部分選取「Customer-managed key」(客戶管理的金鑰),畫面隨即會列出可用的 CMEK 供您選擇。如要瞭解 CMEK 如何與 BigQuery 資料移轉服務搭配運作,請參閱指定移轉作業加密金鑰的相關說明。
按一下 [儲存]。
bq
輸入 bq mk 指令並提供移轉建立標記 - --transfer_config。還需加上以下旗標:
--data_source--display_name--target_dataset--params
選用標記:
--destination_kms_key:如果您使用客戶自行管理的加密金鑰 (CMEK) 進行這項資料移轉作業,請指定 Cloud KMS 金鑰的金鑰資源 ID。如要瞭解 CMEK 如何與 BigQuery 資料移轉服務搭配運作,請參閱「指定移轉作業加密金鑰」。--service_account_name:指定要用於 Cloud Storage 移轉驗證的服務帳戶,而非使用者帳戶。
使用 bq 指令列工具設定 Cloud Storage 資料移轉作業時,須遵守下列限制:
您無法使用 bq 指令列工具設定移轉排程。 使用 bq 指令列工具建立 Cloud Storage 資料移轉作業時,系統會使用「Schedule」(排程) 的預設值 (每 24 小時) 設定移轉設定。
您無法使用 bq 指令列工具設定通知。
下列範例顯示使用所有必要參數建立 Cloud Storage 資料移轉作業的指令:
bq mk \ --transfer_config \ --project_id=PROJECT_ID \ --data_source=DATA_SOURCE \ --display_name=NAME \ --target_dataset=DATASET \ --destination_kms_key="DESTINATION_KEY" \ --params='PARAMETERS' \ --service_account_name=SERVICE_ACCOUNT_NAME
更改下列內容:
- PROJECT_ID 是您的專案 ID。如未提供
--project_id指定特定專案,系統會使用預設專案。 - DATA_SOURCE 是資料來源,例如
google_cloud_storage。 - NAME 是資料移轉設定的顯示名稱。移轉作業名稱可以是任意值,日後需要修改移轉作業時,能夠據此識別即可。
- DATASET 是移轉設定的目標資料集。
- DESTINATION_KEY:Cloud KMS 金鑰資源 ID,例如
projects/project_name/locations/us/keyRings/key_ring_name/cryptoKeys/key_name。 - PARAMETERS 包含所建立移轉設定的參數,格式為 JSON。例如:
--params='{"param":"param_value"}'。destination_table_name_template:目的地 BigQuery 資料表的名稱。data_path_template:包含要轉移檔案的 Cloud Storage URI。可以使用萬用字元和參數。write_disposition:決定是否將相符的檔案附加至目的地資料表,或完全鏡像處理。支援的值為APPEND或MIRROR。如要瞭解 BigQuery 資料移轉服務如何在 Cloud Storage 移轉作業中附加或建立資料鏡像,請參閱「Cloud Storage 移轉作業資料擷取」。file_format:要移轉的檔案格式。格式可以是CSV、JSON、AVRO、PARQUET或ORC。預設值為CSV。max_bad_records:對於任何file_format值,可忽略的不良記錄數量上限。預設值為0。decimal_target_types:針對任何file_format值,以半形逗號分隔的清單,列出來源小數值可能轉換成的 SQL 資料類型。如未提供這個欄位,ORC的資料類型預設為"NUMERIC,STRING",其他檔案格式則為"NUMERIC"。ignore_unknown_values:針對任何file_format值,設為TRUE即可接受含有與結構定義不符值的資料列。詳情請參閱JobConfigurationLoad參考表格中的「ignoreUnknownvalues」欄位詳細資料。use_avro_logical_types:如果是AVROfile_format值,請設為TRUE,將邏輯類型解讀為對應類型 (例如TIMESTAMP),而非僅使用原始類型 (例如INTEGER)。parquet_enum_as_string:針對PARQUETfile_format值,請設為TRUE,將PARQUETENUM邏輯型別推斷為STRING,而非預設的BYTES。parquet_enable_list_inference:如為PARQUETfile_format值,請設為TRUE,以便專門針對PARQUETLIST邏輯型別使用結構定義推論。reference_file_schema_uri:參考檔案的 URI 路徑,其中包含讀取器結構定義。field_delimiter:如果是CSVfile_format值,則為分隔欄位的字元。預設值為半形逗號。quote:適用於CSVfile_format值,CSV 檔案中用來引用資料區段的字元。預設值為英文雙引號 (")。skip_leading_rows:如果是CSVfile_format值,請指出不想匯入的開頭標題列數。預設值為 0。allow_quoted_newlines:如果是CSVfile_format值,請設為TRUE,允許在引用欄位中使用換行符號。allow_jagged_rows:針對CSVfile_format值,請設為TRUE,接受缺少結尾選用欄的資料列。系統會以NULL填入缺少的欄位值。preserve_ascii_control_characters:如果是CSVfile_format值,請設為TRUE,保留任何內嵌的 ASCII 控制字元。encoding:指定CSV編碼類型。支援的值為UTF8、ISO_8859_1、UTF16BE、UTF16LE、UTF32BE和UTF32LE。delete_source_files:設為TRUE,在每次成功移轉後刪除來源檔案。如果第一次刪除來源檔案失敗,不會再重試。預設值為FALSE。
- SERVICE_ACCOUNT_NAME 是用於驗證移轉作業的服務帳戶名稱。服務帳戶應由用於建立轉移作業的
project_id擁有,且應具備所有必要權限。
舉例來說,下列指令會使用 data_path_template 值 gs://mybucket/myfile/*.csv、目標資料集 mydataset 和 file_format
CSV,建立名為 My Transfer 的 Cloud Storage 資料移轉作業。這個範例包含與 CSV file_format 相關聯的選用參數非預設值。
資料移轉作業會在預設專案中建立:
bq mk --transfer_config \
--target_dataset=mydataset \
--project_id=myProject \
--display_name='My Transfer' \
--destination_kms_key=projects/myproject/locations/mylocation/keyRings/myRing/cryptoKeys/myKey \
--params='{"data_path_template":"gs://mybucket/myfile/*.csv",
"destination_table_name_template":"MyTable",
"file_format":"CSV",
"max_bad_records":"1",
"ignore_unknown_values":"true",
"field_delimiter":"|",
"quote":";",
"skip_leading_rows":"1",
"allow_quoted_newlines":"true",
"allow_jagged_rows":"false",
"delete_source_files":"true"}' \
--data_source=google_cloud_storage \
--service_account_name=abcdef-test-sa@abcdef-test.iam.gserviceaccount.com projects/862514376110/locations/us/transferConfigs/ 5dd12f26-0000-262f-bc38-089e0820fe38
執行指令後,您會收到如下的訊息:
[URL omitted] Please copy and paste the above URL into your web browser and
follow the instructions to retrieve an authentication code.
請按照指示進行操作,並在指令列中貼上驗證碼。
API
請使用 projects.locations.transferConfigs.create 方法,並提供 TransferConfig 資源的執行個體。
Java
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Java 設定操作說明進行操作。詳情請參閱 BigQuery Java API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
指定轉移作業的加密金鑰
您可以指定客戶自行管理的加密金鑰 (CMEK),為移轉作業執行的資料加密。您可以使用 CMEK 支援從 Cloud Storage 轉移資料。使用移轉作業指定 CMEK 時,BigQuery 資料移轉服務會將 CMEK 套用至任何擷取資料的中繼磁碟快取,確保整個資料移轉工作流程符合 CMEK 規範。
如果移轉作業原本並非使用 CMEK 建立,則無法更新現有移轉作業來新增 CMEK。舉例來說,您無法將原本預設加密的目的地資料表,變更為以 CMEK 加密。反之,您也無法將 CMEK 加密的目的地資料表變更為其他加密類型。
如果移轉設定最初是以 CMEK 加密建立,則可更新移轉作業的 CMEK。更新移轉設定的 CMEK 時,BigQuery 資料移轉服務會在下次執行移轉作業時,將 CMEK 傳播至目的地資料表,並在移轉作業執行期間,以新的 CMEK 取代任何過時的 CMEK。詳情請參閱「更新轉移作業」。
您也可以使用專案預設金鑰。指定移轉作業的專案預設金鑰時,BigQuery 資料移轉服務會將專案預設金鑰,設為任何新移轉設定的預設金鑰。
手動觸發轉移
除了從 Cloud Storage 自動排定資料移轉作業,您也可以手動觸發移轉作業,載入其他資料檔案。
如果移轉設定在執行階段參數化,您必須指定日期範圍,系統才會啟動額外的移轉作業。
如要觸發資料移轉作業,請按照下列步驟操作:
控制台
前往 Google Cloud 控制台的「BigQuery」頁面。
按一下「 資料移轉」。
從清單中選取資料移轉作業。
按一下「Run transfer now」(立即執行移轉作業) 或「Schedule backfill」(排定補充作業) (適用於執行階段參數化移轉設定)。
如果點選「Run transfer now」(立即執行移轉作業),請視情況選取「Run one time transfer」(執行一次性移轉作業) 或「Run for specific date」(執行特定日期的移轉作業)。如果選取「在特定日期執行」,請選取特定日期和時間:
如果按一下「Schedule backfill」(安排補充作業),請視情況選取「Run one time transfer」(執行一次性移轉作業) 或「Run for a date range」(在指定的日期範圍內執行)。如果選取「Run for a date range」(在指定的日期範圍內執行),請選取開始和結束日期與時間:
按一下 [確定]。
bq
輸入 bq mk 指令,並提供 --transfer_run 旗標。您可以使用 --run_time 旗標,或 --start_time 和 --end_time 旗標。
bq mk \ --transfer_run \ --start_time='START_TIME' \ --end_time='END_TIME' \ RESOURCE_NAME
bq mk \ --transfer_run \ --run_time='RUN_TIME' \ RESOURCE_NAME
其中:
START_TIME 和 END_TIME 是以
Z結尾的時間戳記,或包含有效的時區偏移量。例如:2017-08-19T12:11:35.00Z2017-05-25T00:00:00+00:00
RUN_TIME 是時間戳記,用於指定排定資料移轉作業的時間。如要執行目前時間的一次性移轉作業,可以使用
--run_time旗標。RESOURCE_NAME 是移轉作業的資源名稱 (也稱為移轉設定),例如
projects/myproject/locations/us/transferConfigs/1234a123-1234-1a23-1be9-12ab3c456de7。如果您不知道移轉作業的資源名稱,請執行bq ls --transfer_config --transfer_location=LOCATION指令來找出資源名稱。
API
使用 projects.locations.transferConfigs.startManualRuns 方法,並透過 parent 參數提供移轉設定資源。
後續步驟
- 瞭解 Cloud Storage 移轉作業中的執行階段參數。
- 進一步瞭解 BigQuery 資料移轉服務。