【手把手教學】用 Google Sheets 將複雜的 CSV 檔加載到 BigQuery

商業分析師或資料科學家經常會需要大量時間處理文本資料,以便透過 Google Cloud 強大的資料倉儲 BigQuery 進行分析。而有時資料的形式可能為 CSV 檔,CSV 檔裡面的單個儲存格內,可能又有許多換行或表情符號,造成匯入至 BigQuery 時的麻煩。這時,Google Sheets 試算表就派上用場了!歡迎繼續閱讀,教您手把手將 CSV 檔匯入到 BigQuery,完成你的 ELT 工作。

以 Google Sheets 為中介,建立 ELT pipeline

無論是從 Web 用戶界面還是從命令列執行,BigQuery 都提供了快速導入 CSV 文件的能力:

bq load --source_format CSV --autodetect \
mydataset.mytable ./myfile.csv0

 

延伸閱讀趨勢報告:多雲架構下的智慧型數據分析-BigQuery

自動檢測和導入的局限性

以上導入的方法對普通的 CSV 文件是有效的,但如果您今天處理的是複雜的 CSV 文件,可能會失敗。讓我們以 Kaggle 的紐約市 Airbnb 資料集作為一個失敗的範例。這個資料集有 16 個欄位 (columns),但其中一欄幾乎是由自由格式的文本組成。意思就是說,它可能包含表情符號、換行符號⋯⋯等等。

Kaggle 的紐約市 Airbnb 資料集範例
Kaggle 的紐約市 Airbnb 資料集範例

 

實際示範,當我們試著用 BigQuery 打開這個文件:

bq load --source_format CSV --skip_leading_rows 1 \
   advdata.airbnb_nyc_2019 AB_NYC_2019.csv \
id:string,name:string,host_id:string,host_name:string,neighbourhood_group:string,neighbourhood:string,latitude:float,longitude:float,room_type:string,price:float,minimum_nights:integer,number_of_reviews:integer,last_review:string,reviews_per_month:float,calculated_host_listings_count:integer,availability_365:integer

就會得到這樣的錯誤:

Error while reading data, error message: Error detected while
parsing row starting at position: 104942. Error: Missing close
double quote (") character.

這是因為一列 (row) 資料分佈在很多行之中,所以每行文字的起始引號 (starting quote) 不會被關閉。這不是一個容易解決的問題— 一般都滿難處理 CSV 文件的儲存格內有換行的字串。

Google Sheets 神救援!匯入資料超輕鬆

事實上,Google Sheets 在這方面有更好的 CSV 導入機制,打開 Google Sheets,導入 CSV文件,就這樣,完成!

使用 Google Sheets 匯入 CSV 檔
使用 Google Sheets 匯入 CSV 檔

 

更酷的是,藉由 Google Sheets,你可以在匯入到 BigQuery 前先在表單中進行交互式的資料準備。

首先,從表單中刪除第一列(表頭),因為我們不希望在我們的資料中出現它。

從 Google Sheets 做 ELT (擷取 extract、加載 load、轉換 transform)

一旦資料已經在 Google Sheets 中,我們可以使用一個方便的小技巧 — BigQuery 可以直接查詢 Google Sheets!要做到這一點,我們將 Google Sheets 定義為 BigQuery 中的一個表格 (table)。

我們要到 BigQuery 用戶界面完成這幾個步驟:

  • 選擇一個資料集,然後點擊「建立表格 (Create Table)」
  • 選擇 Drive 作為資料來源,指定一個 Drive URL 給 Google Sheets
  • 設置 Google Sheets 為文件檔案格式
  • 幫這個 table 命名,目前我們先把它命名為 airbnb_raw_googlesheet
  • 指定這個 schema:
id:string,name:string,host_id:string,host_name:string,neighbourhood_group:string,neighbourhood:string,latitude:float,longitude:float,room_type:string,price:float,minimum_nights:integer,number_of_reviews:integer,last_review:string,reviews_per_month:float,calculated_host_listings_count:integer,availability_365:integer

BigQuery 介面上的操作步驟:匯入 CSV 檔
BigQuery 介面上的操作步驟:匯入 CSV 檔

 

這個 table 並不是從工作表中複製資料,而是即時地查詢工作表的內容。

所以,讓我們把資料原樣的複製到 BigQuery 中(當然,我們也可以在這裡做一些轉換):

CREATE OR REPLACE TABLE advdata.airbnb_nyc_2019 AS
SELECT * FROM advdata.airbnb_raw_googlesheet

如何實現自動化

你還可以將這些步驟以自動化進行:

  1. 這篇文章教您關於如何使用 Python 將 CSV 文件讀進 Google Sheets。
  2. 至此你就可以使用 dataform.co 或以 BigQuery 腳本來定義 BigQuery table,並執行 ELT。

如上所述,您可以用 Google Sheets 作為中介去建立 ELT pipeline,把複雜的 CSV 文件導入到 BigQuery,幫助您輕鬆處理帶有「換行」和「其他特殊字符」的 CSV 文件。

(本文翻譯改編自 Google Cloud。)

延伸閱讀:現代化的商業智慧 ─ 如何結合 BigQuery 與 Looker 發揮資料最大的商業價值?