[GCP 教學] 如何把 BigQuery 的大量分析結果同步到地端本機

有人問如何把 BigQuery 檔案同步到地端,

他的檔案好幾 GB,剛好我查到這篇文章提到,

不能匯出超過1GB的檔案,必須要分開儲存。

那我就來試試看,首先去 BigQuery 找一個超過 1GB 的 Table。

注意到它的 Dataset 是在 US,所以為了把它的資料存到我的 Dataset,我必須也在 US 建立一個 Dataset。

接下來開始查詢整張表格,然後點擊「儲存結果」=> 「BigQuery」資料表。

選擇我剛建立的 Dataset

幾秒鐘後,完成了。

預覽一下資料

看一下詳細資訊,沒錯有1.76GB

那我接著把它儲到 Cloud Storage Bucket。

設好 Dataset

報錯了,因為超過 1GB

不該用 UI,要用語法

可以了,但是…

50個檔案,不是1GB一個檔案,另一個0.76GB嗎?

這裡有教你先分割表格,再依照分割區逐一匯出

https://cloud.google.com/bigquery/docs/exporting-data#limit_the_exported_file_size

以下我對原始表分做兩個分割

CREATE TABLE rsync_test_us.processed_table
PARTITION BY RANGE_BUCKET(export_id, GENERATE_ARRAY(0, 2, 1))
CLUSTER BY export_id
AS (
  SELECT *, CAST(FLOOR(2*RAND()) AS INT64) AS export_id
  FROM rsync_test_us.games_wide
);

分割後的表格資訊

你可以看到,表格多一欄,一半的 record 的 export_id 為 0,另一半 record 的 export_id 為 1.

然後我把第二分割匯出到 Cloud Storage,目前看到 906 MB,這樣匯出,應該只會有一個檔案?

EXPORT DATA
  OPTIONS (
    uri = 'gs://dong-dong-gcp-rsync/games_wide-*.csv',
    format = 'CSV',
    overwrite = true,
    header = true,
    field_delimiter = ';')
AS (
  SELECT *
  FROM rsync_test_us.processed_table WHERE export_id = 1
);

結果竟然又被它分成3個檔案,太奇怪了?

應該是說,我不應該用上面的語法,我應該直接 Select 出來,直接儲存到 Cloud Storage 嗎?

其實上面語法,把 “*” 拿掉即可,這裡有說明,這裡改用 Web UI 來示範。

要注意,要存到美國的 Dataset。

成功了。

然後再匯到 Cloud Storage

設定檔案名稱

開始匯出

看到了,最下面那個檔,沒有被切成3個。

接下來用 gcloud rsync 指令,-r 表示它可以一直監控,有新檔案上來,會同步 ,接下來是來源 bucket 最後面是我本機電腦的資料來

gsutil rsync -r gs://dong-dong-gcp-rsync rsync_local

因為我本來就有3個檔案在地端,所以指令下去,現在只會同步最新的那個檔案。

最新檔案在同步中,副檔名是 .gstmp

再等一下,我家網路還算快,每秒 5 MiB,相當於 0.6 MB。

完成了,整個 846MB檔案已在本機。

順便實驗一下,如果把3個小檔刪除,那我本機檔案會跟著刪嗎?

不會,應該用這個指令

gsutil rsync -d -r gs://dong-dong-gcp-rsync rsync_local/

刪除了

那我再隨便上傳一個檔案上去 GCS,可以再同步下來嗎?

目前測試,不會同步,以後再測試看看囉!

順便置入一下,關於更多 GCP 相關的概念和實作教學,都在東東的 GCP 線上課程《雲端架構師養成班》,有需要可以進來看喔!

Table of Contents
返回頂端