從 Firestore 匯出檔案載入資料
BigQuery 支援從使用 Firestore 代管的匯入與匯出服務建立的 Firestore 匯出檔案來載入資料。代管的匯入與匯出服務會將 Firestore 文件匯出至 Cloud Storage 值區,之後您可以將匯出的資料載入到 BigQuery 表格中。
限制
將資料從 Firestore 匯出檔案載入 BigQuery 時,請注意下列限制:
- 您的資料集必須位於與匯出檔案所在的 Cloud Storage 值區相同的位置。
- 您只能指定一個 Cloud Storage URI,且無法使用 URI 萬用字元。
- Firestore 匯出資料中的文件必須有一致的結構定義,且其中不重複的欄位名稱數量未逾 10,000 個,這樣才能順利載入匯出資料。
- 您可以建立新資料表來儲存資料,也可以覆寫現有資料表,但無法在現有資料表中附加 Firestore 匯出資料。
- 您的匯出指令必須指定
collection-ids
篩選器。未指定集合 ID 篩選器的匯出資料無法載入 BigQuery。
事前準備
授予身分與存取權管理 (IAM) 角色,讓使用者取得執行本文件中各項工作的必要權限。
所需權限
如要將資料載入 BigQuery,您必須具備 IAM 權限,才能執行載入工作,並將資料載入 BigQuery 資料表和分區。如要從 Cloud Storage 載入資料,您也需要 IAM 權限存取包含資料的值區。
將資料載入 BigQuery 的權限
如要將資料載入新的 BigQuery 資料表或分區,或是附加或覆寫現有資料表或分區,您需要具備下列 IAM 權限:
bigquery.tables.create
bigquery.tables.updateData
bigquery.tables.update
bigquery.jobs.create
以下每個預先定義的 IAM 角色都包含將資料載入 BigQuery 資料表或分區所需的權限:
roles/bigquery.dataEditor
roles/bigquery.dataOwner
roles/bigquery.admin
(包含bigquery.jobs.create
權限)bigquery.user
(包含bigquery.jobs.create
權限)bigquery.jobUser
(包含bigquery.jobs.create
權限)
此外,如果您具備 bigquery.datasets.create
權限,就可以在您建立的資料集中使用載入工作建立及更新資料表。
如要進一步瞭解 BigQuery 中的 IAM 角色和權限,請參閱「預先定義的角色與權限」一文。
從 Cloud Storage 載入資料的權限
如要取得從 Cloud Storage 值區載入資料所需的權限,請要求管理員為您授予該值區的 Storage 管理員 (roles/storage.admin
) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這個預先定義的角色包含從 Cloud Storage 值區載入資料所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:
所需權限
您必須具備下列權限,才能從 Cloud Storage 值區載入資料:
-
storage.buckets.get
-
storage.objects.get
-
storage.objects.list (required if you are using a URI wildcard)
載入 Firestore 匯出服務資料
您可以使用 Google Cloud 主控台、bq 指令列工具或 API,從 Firestore 匯出中繼資料檔案載入資料。
Google Cloud 主控台和 bq 指令列工具有時會使用 Datastore 術語,但下列程序與 Firestore 匯出檔案相容。Firestore 和 Datastore 共用一種匯出格式。
主控台
前往 Google Cloud 控制台的「BigQuery」頁面。
- 在「Explorer」窗格中展開專案,然後選取資料集。
- 在「資料集資訊」部分,按一下 「建立資料表」。
- 在「Create table」面板中,指定下列詳細資料:
- 在「Source」部分,選取「Create table from」清單中的「Google Cloud Storage」。接著,按照下列步驟操作:
- 從 Cloud Storage 值區選取檔案,或輸入 Cloud Storage URI。您無法在 Google Cloud 控制台中輸入多個 URI,但支援使用萬用字元。Cloud Storage 值區的位置必須與要建立、附加或覆寫的表格所屬的資料集位置相同。
Firestore 匯出檔案的 URI 結尾必須為KIND_COLLECTION_ID.export_metadata
。例如,在default_namespace_kind_Book.export_metadata
中,Book
是集合 ID,而default_namespace_kind_Book
是 Firestore 產生的檔案名稱。如果 URI 結尾不是KIND_COLLECTION_ID.export_metadata
,您會收到以下錯誤訊息:does not contain valid backup metadata. (錯誤代碼:無效)。 - 在「File format」部分,選取「Cloud Datastore Backup」。Firestore 和 Datastore 共用匯出格式。
- 從 Cloud Storage 值區選取檔案,或輸入 Cloud Storage URI。您無法在 Google Cloud 控制台中輸入多個 URI,但支援使用萬用字元。Cloud Storage 值區的位置必須與要建立、附加或覆寫的表格所屬的資料集位置相同。
- 在「Destination」(目的地) 部分中,指定下列詳細資料:
- 在「Dataset」(資料集) 部分,選取要建立資料表的資料集。
- 在「Table」(資料表) 欄位中,輸入要建立的資料表名稱。
- 確認「Table type」欄位已設為「Native table」。
- 在「Schema」(結構定義) 區段中,無需採取任何行動。系統會推測 Firestore 匯出檔案的結構定義。
- 選用步驟:指定「分區與叢集設定」。如需更多資訊,請參閱「建立分區資料表」和「建立及使用叢集資料表」。
- 按一下「進階選項」,然後執行下列操作:
- 讓「Write preference」(寫入偏好設定) 的 [Write if empty] (空白時寫入) 選項維持在已選取狀態。這個選項能建立新的資料表,並將您的資料載入其中。
- 如果您想忽略資料列中不在資料表結構定義中的值,請選取「不明的值」。
- 針對「Encryption」(加密),請按一下「Customer-managed key」(客戶管理的金鑰),以使用 Cloud Key Management Service 金鑰。如果您保留 Google-managed key 設定,BigQuery 會加密靜態資料。
- 點選「建立資料表」。
bq
在 source_format
設為 DATASTORE_BACKUP
的情況下使用 bq load
指令。加上 --location
標記,並該標記值設為您的位置。如果您要覆寫現有資料表,請加上 --replace
旗標。
如果只要載入特定欄位,請使用 --projection_fields 旗標。
bq --location=LOCATION load \
--source_format=FORMAT \
DATASET.TABLE \
PATH_TO_SOURCE
更改下列內容:
LOCATION
:您的位置。--location
是選用旗標。FORMAT
:DATASTORE_BACKUP
。[Datastore Backup] (Datastore 備份) 是 Firestore 的所需選項。Firestore 與 Datastore 共用一種匯出格式。DATASET
:資料集包含您要載入資料的資料表。TABLE
:您要載入資料的資料表。如果該資料表不存在,系統就會建立新資料表。PATH_TO_SOURCE
:Cloud Storage URI。
舉例來說,下列指令會在名為 book_data
的資料表中載入 gs://mybucket/20180228T1256/default_namespace/kind_Book/default_namespace_kind_Book.export_metadata
Firestore 匯出檔案。mybucket
和 mydataset
是在 US
多地區位置建立的。
bq --location=US load \
--source_format=DATASTORE_BACKUP \
mydataset.book_data \
gs://mybucket/20180228T1256/default_namespace/kind_Book/default_namespace_kind_Book.export_metadata
API
設定下列屬性,以便使用 API 載入 Firestore 匯出資料。
建立
load
工作設定指向 Cloud Storage 中的來源資料。在載入工作設定中,
sourceUris
屬性必須完整且符合下列格式:gs://BUCKET/OBJECT
。檔案 (物件) 名稱的結尾必須是KIND_NAME.export_metadata
。您只能針對 Firestore 匯出檔案指定一個 URI,且不得使用萬用字元。在載入工作設定中,將
sourceFormat
屬性設為DATASTORE_BACKUP
以指定資料格式。[Datastore Backup] (Datastore 備份) 是 Firestore 的所需選項。Firestore 與 Datastore 共用一種匯出格式。如要僅載入特定欄位,請設定
projectionFields
屬性。如果您要覆寫現有資料表,請將
writeDisposition
屬性設為WRITE_TRUNCATE
以指定寫入配置。
Python
在嘗試這個範例之前,請先按照 BigQuery 快速入門:使用用戶端程式庫中的 Python 設定說明進行操作。詳情請參閱 BigQuery Python API 參考說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Firestore 選項
如要變更 BigQuery 剖析 Firestore 匯出資料的方式,請指定下列選項:
Google Cloud 主控台選項 | `bq` 標記 | BigQuery API 屬性 | 說明 |
---|---|---|---|
無法使用 | --projection_fields |
projectionFields
(Java、Python) |
(選用) 逗號分隔的清單,用來指定要從 Firestore 匯出檔案載入的文件欄位。根據預設,BigQuery 會載入所有欄位。欄位名稱區分大小寫,且必須存在於匯出檔案中。您無法在 map.foo 等對應欄位內指定欄位路徑。 |
資料類型轉換
BigQuery 會將 Firestore 匯出檔案中各個文件的資料轉換成 BigQuery 的資料類型。下表說明支援的資料類型之間的轉換方式。
Firestore 資料類型 | BigQuery 資料類型 |
---|---|
陣列 | RECORD |
布林值 | BOOLEAN |
參考資料 | RECORD |
日期和時間 | TIMESTAMP |
對應 | RECORD |
浮點數 | FLOAT |
地理點 |
RECORD [{"lat","FLOAT"}, {"long","FLOAT"}] |
整數 | INTEGER |
字串 | STRING (截斷至 64 KB) |
Firestore 金鑰屬性
Firestore 中每個文件都有專屬金鑰,當中包含文件 ID 和文件路徑等資訊。BigQuery 會為金鑰建立 RECORD
資料類型 (也稱為 STRUCT
),並透過巢狀欄位整理不同類型的資訊,如下表所示。
金鑰屬性 | 說明 | BigQuery 資料類型 |
---|---|---|
__key__.app |
Firestore 應用程式名稱。 | STRING |
__key__.id |
文件的 ID;如有設定 __key__.name ,則為 null 。 |
INTEGER |
__key__.kind |
文件的集合 ID。 | STRING |
__key__.name |
文件的名稱;如有設定 __key__.id ,則為 null 。 |
STRING |
__key__.namespace |
Firestore 不支援自訂命名空間。預設命名空間會以空白字串表示。 | 字串 |
__key__.path |
文件的路徑:文件的序列與根集合的集合配對。例如 "Country",
"USA", "PostalCode", 10011, "Route", 1234 。 |
STRING |