本文將介紹 Dataform 的概念和程序。
Dataform 這項服務可讓資料分析師在 BigQuery 中開發、測試、控制版本,並安排資料轉換複雜的資料流程。
Dataform 可讓您在擷取、載入和轉換 (ELT) 資料整合程序中管理資料轉換作業。從來源系統擷取原始資料並載入 BigQuery 後,Dataform 可協助您將資料轉換為經過明確定義、測試及記錄的資料表套件。
Dataform 可讓您執行下列資料轉換動作:
- 開發及執行資料轉換工作流程。
- 透過 Git 與團隊成員共同開發工作流程。
- 管理大量資料表及其依附元件。
- 宣告來源資料並管理資料表依附元件。
- 查看工作流程的依附元件樹狀圖。
- 在集中式存放區中使用 SQL 程式碼管理資料。
- 使用 JavaScript 重複使用程式碼。
- 對來源和輸出表格執行品質測試,測試資料是否正確。
- 版本控制 SQL 程式碼。
- 在 SQL 程式碼中記錄資料表。
Dataform 中的資料轉換程序
Dataform 的資料轉換工作流程如下:
- Dataform 可讓您建立存放區來管理程式碼。
- Dataform 可讓您建立開發用工作區。
- Dataform 可讓您在開發工作區中開發工作流程。
- Dataform 會將 Dataform 核心編譯為 SQL。
- Dataform 執行相依性樹狀結構。
您可以使用 Dataform 建立存放區來管理程式碼
在 Dataform 存放區中,您可以使用 Dataform 核心 (SQL 的擴充功能) 來編寫 SQLX 檔案,並在其中定義工作流程。Dataform 存放區支援版本控制。您可以將 Dataform 存放區連結至第三方 Git 供應商。
Dataform 可讓您建立開發用工作區
您可以在 Dataform 存放區中建立開發工作區,用於 Dataform 核心開發作業。在開發工作區中,您可以變更存放區、編譯、測試,然後透過 Git 將這些項目推送至主存放區。
Dataform 可讓您在開發工作區中開發 Dataform 核心
在開發工作區中,您可以定義及記錄資料表、資料表的依附元件和轉換邏輯,以建構工作流程。您也可以在 JavaScript 中設定動作。
Dataform 編譯 Dataform 核心
在編譯期間,Dataform 會執行下列工作:
- 將 Dataform 核心編譯為標準 SQL 工作流程。
- 根據查詢設定,在程式碼中內嵌常用 SQL 陳述式,例如
CREATE TABLE
或INSERT
。 - 將 JavaScript 轉譯 (從來源編譯至來源) 為 SQL。
- 解決依附元件,並檢查錯誤,包括缺少或循環依附元件。
- 為所有要在 BigQuery 中執行的動作建立依附元件樹狀圖。
Dataform 編譯作業是密封的,可驗證編譯作業的一致性,也就是說,相同的程式碼每次都會編譯為相同的 SQL 編譯結果。Dataform 會在無法存取網際網路的沙箱環境中編譯程式碼。編譯期間不會執行其他動作,例如呼叫外部 API。
如要即時偵錯,您可以在開發工作區的互動式圖表中檢查專案的編譯工作流程。
Dataform 執行依附元件樹狀結構
在 BigQuery 中,Dataform 會執行下列工作:
- 依依附元件樹狀結構的順序執行 SQL 指令。
- 針對資料表和檢視表執行斷言查詢,以檢查資料正確性。
- 執行您定義的其他 SQL 作業。
執行後,您就可以將表格和檢視畫面用於所有分析用途。
您可以查看記錄,瞭解系統建立了哪些資料表、斷言是否通過或失敗、各項動作完成所需的時間,以及其他資訊。您也可以查看在 BigQuery 中執行的確切 SQL 程式碼。
Dataform 功能
您可以使用 Dataform 開發資料表、增量資料表或檢視表,並將這些項目部署至 BigQuery。Dataform 提供以下活動的網頁環境:
- 工作流程開發
- 連結至 GitHub、GitLab、Azure DevOps 服務和 Bitbucket
- 持續整合和持續部署
- 工作流程執行作業
以下各節將說明 Dataform 的主要功能。
存放區
每個 Dataform 專案都會儲存在存放區中。Dataform 存放區會收納一系列 JSON 設定檔、SQLX 檔案和 JavaScript 檔案。
Dataform 存放區包含下列類型的檔案:
設定檔
您可以使用設定 JSON 或 SQLX 檔案設定工作流程。這些檔案包含一般設定、執行時程或建立新資料表和檢視表的結構定義。
定義
定義是 SQLX 和 JavaScript 檔案,用於定義在 BigQuery 中執行的新資料表、檢視表和其他 SQL 作業。
包含
Includes 是 JavaScript 檔案,可用於定義專案中要使用的變數和函式。
每個 Dataform 存放區都會連結至服務帳戶。您可以在建立存放區時選取服務帳戶,也可以稍後編輯服務帳戶。
根據預設,Dataform 會使用從專案編號衍生出的服務帳戶,格式如下:
service-YOUR_PROJECT_NUMBER@gcp-sa-dataform.iam.gserviceaccount.com
版本管控
Dataform 會使用 Git 版本管控系統,記錄對專案檔案所做的每項變更,並管理檔案版本。
每個 Dataform 存放區都可以管理自己的 Git 存放區,或連結至遠端第三方 Git 存放區。您可以將 Dataform 存放區連結至 GitHub、GitLab、Azure DevOps Services 或 Bitbucket 存放區。
使用者可在 Dataform 工作區中控管工作流程程式碼版本。在 Dataform 工作區中,您可以從存放區提取變更、提交所有或所選變更,並將其推送至存放區的 Git 分支。
工作流程開發
在 Dataform 中,您可以變更開發工作區中的檔案和目錄。開發工作區是 Git 存放區內容的虛擬可編輯副本。Dataform 會在工作階段之間保留開發工作區中的檔案狀態。
在開發工作區中,您可以使用 Dataform 核心搭配 SQLX 和 JavaScript,或僅使用 JavaScript開發 SQL 工作流程動作。您可以自動設定 Dataform 核心或 JavaScript 程式碼的格式。
Dataform 工作流程的每個元素 (例如資料表或斷言) 都對應至 Dataform 在 BigQuery 中執行的動作。舉例來說,資料表定義檔案就是在 BigQuery 中建立或更新資料表的動作。
在 Dataform 工作區中,您可以開發下列工作流程動作:
- 來源資料宣告
- 資料表和檢視表
- 增量表格
- 資料表分區和叢集
- 動作之間的相依性
- 資料表說明文件
- 自訂 SQL 作業
- BigQuery 標籤
- BigQuery 政策標記
- Dataform 標記
- 資料品質測試,稱為「斷言」
您可以使用 JavaScript 以下列方式重複使用 Dataform 工作流程程式碼:
Dataform 會即時編譯工作區中的工作流程程式碼。您可以在工作區中查看已編譯的查詢,以及每個檔案中的動作詳細資料。您也可以在編輯的檔案或存放區中查看編譯狀態和錯誤。
如要先測試編譯的 SQL 查詢輸出內容,再將查詢執行至 BigQuery,您可以在 Dataform 工作區中執行查詢的預覽畫面。
如要檢查工作區中定義的整個工作流程,您可以查看互動式已編譯圖表,該圖表會顯示工作流程中的所有已編譯動作,以及這些動作之間的關係。
工作流程編譯
Dataform 會使用預設的編譯設定 (在工作流程設定檔中設定),將工作區中的工作流程程式碼即時編譯為 SQL,並建立工作區的編譯結果。
您可以覆寫編譯設定,自訂 Dataform 將工作流程編譯為編譯結果的方式。
您可以使用工作區編譯覆寫設定,為存放區中的所有工作區設定編譯覆寫設定。您可以設定動態工作區覆寫值,為每個工作區建立自訂的編譯結果,將工作區轉換為獨立的開發環境。您可以覆寫 Dataform 執行工作區內容的 Google Cloud 專案,為所有已編譯的資料表名稱加上前置字串,並為預設結構定義加上後置字串。
您可以使用版本設定,設定編譯設定範本,以便建立 Dataform 存放區的編譯結果。在發布設定中,您可以覆寫 Google Cloud 專案,讓 Dataform 執行編譯結果、為所有已編譯資料表的名稱新增前置字串、為預設結構定義新增後置字串,以及新增編譯變數。您也可以設定建立匯整結果的頻率。如要排定在所選版本設定中建立的編譯結果執行作業,您可以建立工作流程設定。
工作流程執行作業
在工作流程執行期間,Dataform 會執行工作流程的編譯結果,在 BigQuery 中建立或更新資產。
如要建立或重新整理在 BigQuery 中工作流程中定義的資料表和視圖,您可以在開發工作區中手動啟動工作流程執行作業,或安排執行作業。
您可以透過下列方式在 BigQuery 中排定 Dataform 執行作業:
- 建立工作流程設定,安排在版本設定中建立的編譯結果執行作業
- 使用 Cloud Composer 排定執行作業
- 使用 Workflows 和 Cloud Scheduler 排定執行時間
如要偵錯錯誤,您可以透過下列方式監控執行作業:
Dataform 核心
Dataform 核心是用來建立 SQL 資料表和工作流程的開放原始碼元語言。Dataform 核心會提供依附元件管理系統、自動化資料品質測試和資料說明文件,進而擴充 SQL。
您可以將 Dataform 核心用於以下用途:
- 定義資料表、檢視表、具體化檢視表或增量資料表。
- 定義資料轉換邏輯。
- 宣告來源資料和管理資料表依附元件。
- 在程式碼中記錄資料表和欄的說明。
- 在不同查詢中重複使用函式和變數。
- 編寫資料斷言,驗證資料一致性。
在 Dataform 中,您可以使用 Dataform 核心開發工作流程,並將資產部署至 BigQuery。
Dataform 核心是開放原始碼 Dataform 資料建模架構的一部分,其中也包含 Dataform CLI。您可以在 Google Cloud以外,透過 Dataform CLI 在本機編譯及執行 Dataform 核心。
如要使用 Dataform 核心,您必須編寫 SQLX 檔案。每個 SQLX 檔案都包含一個查詢,用於定義 Dataform 在 BigQuery 中建立及更新的資料庫關聯。
Dataform 會即時編譯 Dataform 核心程式碼,以便建立可在 BigQuery 中執行的 SQL 編譯結果。
Dataform 編譯作業是密封的,可驗證編譯作業的一致性,也就是說,相同的程式碼每次都會編譯為相同的 SQL 編譯結果。Dataform 會在沒有網路存取權的沙箱環境中編譯程式碼。在編譯期間,您無法執行其他動作 (例如呼叫外部 API)。
SQLX 檔案設定區塊
SQLX 檔案包含設定區塊和主體。所有設定屬性和設定區塊本身皆為選用項目。因此,任何純 SQL 檔案都是 Dataform 可直接執行的有效 SQLX 檔案。
您可以在設定區塊中執行下列動作:
指定查詢中繼資料
您可以設定 Dataform 將查詢實體化至 BigQuery 的方式,例如輸出資料表類型、目標資料庫或標籤,並使用設定中繼資料。
文件資料
您可以直接在設定區塊中記錄表格及其欄位。資料表的文件會直接推送至 BigQuery。您可以剖析這份文件,並將其推送至其他工具。
定義資料品質測試
您可以定義資料品質測試 (稱為「斷言」),用於檢查是否有唯一性、空值或自訂條件。建立資料表後,資料表單會將設定區塊中定義的斷言新增至工作流程依附元件樹狀結構。您也可以在設定區塊外 (在個別的 SQLX 檔案中) 定義斷言。
以下程式碼範例說明如何在 SQLX 檔案的設定區塊中定義輸出資料表類型、記錄資料表,以及定義品質測試。
config {
type: "table",
description: "This table joins orders information from OnlineStore & payment information from PaymentApp",
columns: {
order_date: "The date when a customer placed their order",
id: "Order ID as defined by OnlineStore",
order_status: "The status of an order e.g. sent, delivered",
customer_id: "Unique customer ID",
payment_status: "The status of a payment e.g. pending, paid",
payment_method: "How the customer chose to pay",
item_count: "The number of items the customer ordered",
amount: "The amount the customer paid"
},
assertions: {
uniqueKey: ["id"]
}
}
SQLX 檔案主體
您可以在 SQLX 檔案的內文中執行下列動作:
定義資料表
如要定義新資料表,您可以使用 SQL SELECT
陳述式和 ref
函式。
ref
函式是 SQLX 內建函式,對 Dataform 中的依附元件管理至關重要。ref
函式可讓您參照在 Dataform 專案中定義的資料表,而非硬式編碼資料表的結構定義和名稱。
Dataform 會使用 ref
函式,為所有要建立或更新的資料表建立相依性樹狀結構。編譯完成後,Dataform 會新增 CREATE
、REPLACE
或 INSERT
等樣板陳述式。
下列程式碼範例說明如何使用 ref
函式,在 SQLX 檔案中參照資料表。
config { type: "table" }
SELECT
order_date AS date,
order_id AS order_id,
order_status AS order_status,
SUM(item_count) AS item_count,
SUM(amount) AS revenue
FROM ${ref("store_clean")}
GROUP BY 1, 2, 3
輸出結果會與下列內容相似:
CREATE OR REPLACE TABLE Dataform.orders AS
SELECT
order_date AS date,
order_id AS order_id,
order_status AS order_status,
SUM(item_count) AS item_count,
SUM(amount) AS revenue
FROM Dataform_stg.store_clean
GROUP BY 1, 2, 3
如要進一步瞭解其他依附元件管理功能 (例如,依條件執行程式碼、使用其他 Dataform 核心內建函式),請參閱 Dataform 核心參考資料。
定義其他 SQL 作業
如要設定 Dataform 在建立資料表或檢視畫面之前或之後執行一或多個 SQL 陳述式,您可以指定查詢前和查詢後作業。
以下程式碼範例說明如何在後置查詢作業中設定資料表或檢視畫面的存取權限。
SELECT * FROM ...
post_operations {
GRANT `roles/bigquery.dataViewer` ON TABLE ${self()} TO "group:someusers@dataform.co"
}
封裝 SQL 程式碼
如要定義可重複使用的函式,以產生 SQL 程式碼的重複部分,您可以使用 JavaScript 區塊。您只能在定義區塊的 SLQX 檔案中,重複使用 JavaScript 區塊中定義的程式碼。如要重複使用整個存放區的程式碼,您可以建立包含項目。
如要動態修改查詢,您可以在主體的任何位置使用內嵌式 JavaScript。
以下程式碼範例說明如何在 SQLX 檔案中定義 JavaScript 區塊,並在查詢中內嵌使用:
js {
const columnName = "foo";
}
SELECT 1 AS ${columnName} FROM "..."
限制
資料表單有下列已知限制:
Google Cloud 中的 Dataform 會在一般 V8 執行階段上執行,且不支援 Node.js 提供的其他功能和模組。如果現有的程式碼集需要任何 Node.js 模組,您就必須移除這些依附元件。
在
package.json
中沒有名稱欄位的專案,每次安裝套件時都會在package-lock.json
上產生差異。為避免這種情況,您必須在package.json
中新增name
屬性。系統不支援
package.json
中依附元件的git
+https://
網址。將這些網址轉換為一般
https://
封存網址。例如,將git+https://github.com/dataform-co/dataform-segment.git#1.5
轉換為https://github.com/dataform-co/dataform-segment/archive/1.5.tar.gz
。無法手動執行單元測試。
無法在開發工作區中搜尋檔案內容。
自 Dataform 核心
3.0.0.
起,Dataform 就不會發布 Docker 映像檔。您可以自行建構 Dataform 的 Docker 映像檔,用於執行 Dataform CLI 指令的等效指令。如要自行建構 Docker 映像檔,請參閱 Docker 說明文件中的「將應用程式容器化」。下列 Dataform API 方法不符合 AIP.134 規範,因為它們會將
*
萬用字元項目視為錯誤要求,並在省略field_mask
時更新所有欄位,而非設定欄位:
後續步驟
- 如要進一步瞭解 Dataform 中的程式碼生命週期,請參閱「Dataform 中的程式碼生命週期簡介」。
- 如要進一步瞭解 Dataform 存放區,請參閱「存放區簡介」。
- 如要進一步瞭解 Dataform 工作區,請參閱「在工作區中開發的簡介」。
- 如要進一步瞭解如何在 Dataform 中開發工作流程,請參閱「SQL 工作流程簡介」。
- 如要進一步瞭解 Dataform CLI,請參閱「使用 Dataform CLI」一文。