這是有關資料工程的文章,如果您在 Google 上搜尋該主題並在點擊「感覺幸運」後重定向,就會找到它。
此外,本文是一位經驗豐富的 Web 開發工程師的觀點,他開啟了職業生涯的新領域,這意味著:這是我的學習,我的研究,如果您有任何補充,請在下面的評論中隨時指正!我很樂意學習更多!
- [2.1. Core File: `.bruin.yml`](#21-core-file-bruinyml)
- [2.2. Pipeline: A Way Easier Apache Airflow](#22-pipeline-a-way-easier-apache-airflow)
- [2.3. Assets: The Building Blocks of Data Products](#23-assets-the-building-blocks-of-data-products)
- [2.4. Policies: Enforcing Quality and Governance](#24-policies-enforcing-quality-and-governance)
- [2.5. Glossary: Speaking the Same Language](#25-glossary-speaking-the-same-language)
- [3.1. Step 1: Ingest from Your Source to a Data Lake](#31-step-1-ingest-from-your-source-to-a-data-lake)
- [3.2. Step 2: Formatting and Validating the Data (Staging Layer)](#32-step-2-formatting-and-validating-the-data-staging-layer)
- [3.3. Step 3: Designing the Analytics (Mart) Layer](#33-step-3-designing-the-analytics-mart-layer)
我不得不承認:每當有人提到資料工程,我都會置之不理。它聽起來總是複雜得不可思議——幾乎像魔法一樣。
這週,我終於決定深入研究。我以為這會相當簡單,但沒多久我就意識到這個兔子洞有多深。
這個領域不僅僅是一些腳本或 SQL 查詢;它是一個由相互關聯的工具、概念和職責組成的整個生態系統,構成了現代資料系統的支柱。
概念如下:
資料目錄與治理:了解誰擁有資料、如何確保品質以及如何追蹤譜系。
編排:使用Apache Airflow或Dagster等工具協調依賴關係和工作流程。
轉換(ETL/ELT):使用dbt或Fivetran等工具清理和標準化資料。
擷取與串流:使用Kafka 、 Airbyte或Confluent Cloud連接來源並即時移動資料。
可觀察性和品質:使用Monte Carlo和Datafold等解決方案監控資料健康狀況。
每點擊一篇文章,就會開啟一個充滿工具、詞彙、框架、架構和最佳實踐的新世界。
而且,所有這些都必須以某種方式協同工作——治理、編排、轉換、攝取、可觀察性、基礎設施。
作為一名開發人員,我習慣於學習一門語言和一個框架,然後開始工作。
但在資料工程中,情況有所不同。
它是關於了解整個生態系統以及每個部分如何與下一個部分連結。
經過數小時閱讀文件、追蹤 GitHub 儲存庫以及在工具、文章和無數定義之間跳轉後,我終於找到了讓一切順利的工具— — Bruin 。
管道即程式碼-所有內容都儲存在版本控制的文字中(YAML、SQL、Python)。沒有隱藏的 UI 或資料庫。可複製、可審查、可自動化。
天生的多語言——原生支援 SQL 和 Python,並能夠插入二進位檔案或容器以滿足更複雜的用例。
可組合管道——將技術、來源和目的地結合在一個無縫流程中——無需黏合程式碼,無需駭客攻擊。
無鎖定-100% 開源(Apache 授權)CLI,可在任何地方運作:本地、CI 或生產環境。您可以完全控制您的管道和資料。
專為開發者和資料品質打造-快速本地執行、整合檢查和快速回饋循環。經過測試、值得信賴且易於交付的資料產品。
....它符合我之前提到的所有核心資料工程概念。
我承認──我是那種喜歡高效率懶惰的人。如果有辦法用更少的工具、更少的摩擦做更多的事情,我就會去做。
因此,在我們開始之前,請先了解以下計劃:
在大多數設定中,資料流從 OLTP 資料庫→擷取→資料湖/倉庫→轉換→市集→分析儀表板。
Airbyte等工具負責處理資料擷取, dbt負責處理資料轉換, Airflow負責協調依賴關係,而 Bruin 則負責將這些層結合起來
成為一個統一的框架。
本文將介紹資料工程的基本原理,同時探索Bruin如何透過簡單的、真實的管道將它們整合在一起。
說實話,我以前對資料科學/工程專案有點偏見。每次看到這類專案,總覺得雜亂無章,文件和筆記本散落在各處。身為軟體開發出身的人,這種混亂總是讓我很困擾。
但當我開始研究Bruin 的專案結構時,這種看法就完全改變了。一切都突然變得井然有序、有目的性。
這個框架透過其層自然地強制執行結構 - 一旦你遵循它們,一切都開始變得有意義。
├── duckdb.db
├── ecommerce-mart
│ ├── assets
│ │ ├── ingestion
│ │ │ ├── raw.customers.asset.yml
│ │ │ ├── raw.order_items.asset.yml
│ │ │ ├── raw.orders.asset.yml
│ │ │ ├── raw.products.asset.yml
│ │ │ └── raw.product_variants.asset.yml
│ │ ├── mart
│ │ │ ├── mart.customers-by-age.asset.py
│ │ │ ├── mart.customers-by-country.asset.yml
│ │ │ ├── mart.product_performance.sql
│ │ │ ├── mart.sales_daily.sql
│ │ │ └── mart.variant_profitability.sql
│ │ └── staging
│ │ ├── stg.customers.asset.yml
│ │ ├── stg.order_items.sql
│ │ ├── stg.orders.sql
│ │ ├── stg.products.sql
│ │ └── stg.product_variants.sql
│ └── pipeline.yml
├── glossary.yml
├── policy.yml
└── .bruin.yml
.bruin.yml
您的 Bruin 環境的主要設定檔。
定義所有管道的全域設置,如預設連接、變數和行為。
policy.yml
您的資料治理和驗證政策文件。
定義 Bruin 可以在傳送資料產品之前自動執行的資料品質規則、存取控制和合規性檢查。
glossary.yml
作為您專案的輕量級資料目錄。
記錄術語、指標和資料集,以便團隊中的每個人都使用同一種語言。
也有助於血統、文件和可發現性。
some-feature/pipeline.yml
為網域或專案(在本例中為電子商務)定義特定的管道。
描述端到端資料流—執行哪些資產、它們的依賴關係和時間表。
管道是模組化的,因此您可以為不同的業務領域維護單獨的管道。
*`some-feature/assets/`**
包含所有資產-資料管道的建構塊。
每項資產處理不同的任務:擷取原始資料、轉換資料或產生分析表。
由於每個資產都是一個文件,因此它是版本控制的、可測試的和可重複使用的——就像程式碼一樣。
僅此而已,我們就能執行完整的流程了。不過,我仍然認為我們需要逐一檢查每個步驟並單獨歸檔——我保證會很快!
.bruin.yml
將.bruin.yml
視為專案的根配置- 該文件告訴 Bruin如何以及在何處執行所有內容。
Bruin 不會將設定分散到腳本或環境變數中,而是將它們集中在這裡:連接、憑證和特定於環境的配置都集中在一個地方。
它還可以作為 Bruin 的預設秘密後端,因此您的管道可以安全、一致地存取資料庫或倉庫。
bruin run ecommerce/pipeline.yml --config-file /path/to/.bruin.yml
一個簡單的例子:
default_environment: default
environments:
default:
connections:
postgres:
- name: pg-default
username: postgres # (hardcoded as well)
password: ${PG_PASSWORD}
host: ${PG_HOST}
port: ${PG_PORT}
database: ${PG_DATABASE}
duckdb:
- name: duckdb-default
path: duckdb.db
default_environment
— 設定 Bruin 將使用的環境,除非另有說明。
environments
-定義多個設定(例如, dev 、 staging 、 prod ),每個設定都有自己的配置。
connections
-列出 Bruin 可以連接的每個系統,例如 Postgres 或 DuckDB。
每個連線都有一個名稱(例如, pg-default
),您可以在管道和資產中引用該名稱。
${...}
中的值都會自動從您的系統環境中讀取。這表示您可以在本機或 CI/CD 環境中執行時將憑證保留在原始碼控制之外。
這種設計使一切保持集中、安全和版本控制,同時讓您可以靈活地透過環境變數動態注入機密 - 非常適合在不接觸程式碼的情況下在本地、暫存和生產之間切換。
對於您擁有的每個功能,它都必須附帶一個pipeline.yml
檔案。
該文件將對您的所有資產進行分組,並了解它不是正在執行的單一資產,而是資產的鍊式清單。
- ecommerce-mart/
├─ pipeline.yml -> you're here
└─ assets/
├─ some-asset.sql
├─ definitely-an-asset.yml
└─ another-asset.py
您也可以設定要在特定管道上使用的每個連線:
name: product_ecommerce_marts
schedule: daily # relevant for Bruin Cloud deployments
default_connections:
duckdb: "duckdb-default"
postgres: "pg-default"
Bruin中的每個資料管道都由資產組成 - 模組化、獨立的單元,定義特定的操作:提取、轉換或產生資料集。
每個資產都作為assets/
目錄下的檔案存在,其檔案名稱兼作管道圖中的標識。
如果你還記得開頭展示的文件結構,你一定記得我在流程中有多種類型的資源。這是最酷的部分,因為你可以用多種語言記錄,而且仍然很簡單。以下是一些可能性:
| 類型 | 描述 | 檔案名稱(在檔案樹中)|
| ------ | ---------------------------------------------------------------------------------- | --------------------------- |
| YAML | 用於提取或元資料密集型資產的聲明式配置 | raw.customers.asset.yml
|
| SQL | 純轉換邏輯 — 思考 dbt 風格的模式 | stg.orders.sql
|
| Python | 自訂邏輯或整合(例如 API、驗證或機器學習步驟)| mart.sales_daily.asset.py
|
您可以自由地以自己喜歡的方式組織資產—沒有嚴格的層級結構需要遵循。
關鍵的見解是,編排透過依賴關係隱式地進行,而不是透過像 Airflow 這樣的外部 DAG 引擎進行。
每個資產都聲明了它所依賴的內容, Bruin 會自動為您建立並執行依賴圖。
例子:
# raw.orders.asset.yml
name: raw.orders
type: ingestr
description: Ingest OLTP orders from Postgres into the DuckDB raw layer.
parameters:
source_connection: pg-default
source_table: "public.orders"
destination: duckdb
# raw.order_items.asset.yml
name: raw.order_items
type: ingestr
description: Ingest OLTP order_items from Postgres into the DuckDB raw layer.
depends:
- raw.orders # declares a dependency on the 'raw.orders' asset
parameters:
source_connection: pg-default
source_table: "public.order_items"
destination: duckdb
.... 變成:
graph TD
raw.orders --> raw.order_items;
透過像這樣連結資產,您可以描述資料操作之間的邏輯關係,而不是手動安排步驟。
結果是一個聲明性的、可組合的和可維護的管道——就像應用程式程式碼一樣易於閱讀、版本控制和擴展。
Bruin 最強大的功能之一是它如何將資料品質和治理直接連接到您的資產。
透過在每一列下定義檢查,您不僅可以驗證資料,還可以記錄所有權、期望和約束——所有這些都在執行時進行版本控制和強制執行。
這意味著 Bruin 不僅僅執行管道 - 它還作為同一工作流程的一部分對其進行審核、記錄和管理。
Bruin中的策略可作為規則手冊,可確保您的資料管道保持一致、合規且高品質。
他們確保每項資產和管道都遵循最佳實踐——從命名約定和所有權到驗證和元資料完整性。
從本質上講,策略是在位於專案根目錄的單一policy.yml
檔案中定義的。
此文件可讓您在管道執行之前自動進行lint 、驗證和強制執行標準。
rulesets:
- name: standard
selector:
- path: .*/ecommerce/.*
rules:
- asset-has-owner
- asset-name-is-lowercase
- asset-has-description
每個規則集定義:
規則適用的位置( selector
→依路徑、標籤或名稱相符),
要強制執行的內容( rules
→內建或自訂驗證規則)。
一旦定義,您就可以驗證整個專案:
bruin validate ecommerce
# Validating pipelines in 'ecommerce' for 'default' environment...
# Pipeline: ecommerce_pg_to_duckdb (.)
# raw.order_items (assets/ingestion/raw.order_items.asset.yml)
# └── Asset must have an owner (policy:standard:asset-has-owner)
Bruin 會在執行之前自動檢查資產——確保不合規的管道永遠不會運作。
| 規則 | 目標 | 說明 |
|------------------------- | -------- | ------------------------------------- |
| asset-has-owner
| asset | 每個資產必須定義一個所有者。 |
| asset asset-has-description
描述。 |
| asset asset-name-is-lowercase
。 |
| pipeline-has-retries
| pipeline | 管道必須定義重試設定。 |
您也可以定義自己的規則:
custom_rules:
- name: asset-has-owner
description: every asset should have an owner
criteria: asset.Owner != ""
規則可以針對資產或管道,並使用邏輯表達式來確定合規性。
政策將 Bruin 轉變為一個自治資料平台——在這個平台上,最佳實踐不是可選的,而是強制執行的。
透過將規則提交到版本控制,您可以使資料治理成為開發工作流程的一部分,而不是事後才想到的。
在資料專案中,最困難的問題之一不是技術問題,而是溝通問題。
不同的團隊經常使用同一個字來表示不同的意思。
這就是Bruin 詞彙表的作用所在。
詞彙表在專案根目錄下的glossary.yml
中定義。
它充當業務概念(如客戶或訂單)及其屬性的共享詞典,使團隊在各個管道之間保持一致。
entities:
Customer:
description: A registered user or business in our platform.
attributes:
ID:
type: integer
description: Unique customer identifier.
您可以使用extends
在資產中引用這些定義,避免重複並確保一致性:
# raw.customers.asset.yml
name: raw.customers
type: ingestr
columns:
- name: customer_id
extends: Customer.ID
這會自動繼承詞彙表中的type
和description
。
這是一個簡單的想法,但卻很強大——您的資料定義將變得像程式碼一樣受版本控制和共享。
現在我們已經探索了Bruin背後的結構和理念,現在是時候建立端到端管道了。
我們將從原始攝取到乾淨的暫存層,最後到可供分析的市場——所有這些都定義為程式碼。
我們假設您已經擁有:
Postgres資料庫作為您的資料來源。
DuckDB資料庫作為您的分析儲存。
配置了兩個連接的工作.bruin.yml
文件
第一步是將資料從 Postgres 移到 DuckDB。
這將建立您的原始圖層——以最少的轉換從來源複製的資料。
建立攝取資產文件:
touch assets/ingestion/raw.customers.asset.yml
然後定義資產:
# assets/ingestion/raw.customers.asset.yml
name: raw.customers
type: ingestr
description: Ingest OLTP customers from Postgres into the DuckDB raw layer.
parameters:
source_connection: pg-default
source_table: "public.customers"
destination: duckdb
columns:
- name: id
type: integer
primary_key: true
checks:
- name: not_null
- name: unique
- name: email
type: string
checks:
- name: not_null
- name: unique
- name: country
type: string
checks:
- name: not_null
這會告訴 Bruin 從 Postgres 表public.customers
中提取資料,驗證列質量,並將其儲存在 DuckDB 原始層中。
bruin run ecommerce/assets/ingestion/raw.customers.asset.yml
預期輸出:
Analyzed the pipeline 'ecommerce_pg_to_duckdb' with 13 assets.
Running only the asset 'raw.customers'
Pipeline: ecommerce_pg_to_duckdb (../../..)
No issues found
✓ Successfully validated 13 assets across 1 pipeline, all good.
Interval: 2025-10-12T00:00:00Z - 2025-10-12T23:59:59Z
Starting the pipeline execution...
PASS raw.customers ........
bruin run completed successfully in 2.095s
✓ Assets executed 1 succeeded
現在您可以查詢已取得的資料:
bruin query --connection duckdb-default --query "SELECT * FROM raw.customers LIMIT 5"
結果:
┌────┬───────────────────┬───────────────────────────┬───────────┬──────────────────┬──────────────────────────────────────┬──────────────────────────────────────┐
│ ID │ FULL_NAME │ EMAIL │ COUNTRY │ CITY │ CREATED_AT │ UPDATED_AT │
├────┼───────────────────┼───────────────────────────┼───────────┼──────────────────┼──────────────────────────────────────┼──────────────────────────────────────┤
│ 1 │ Allison Hill │ [email protected] │ Uganda │ New Roberttown │ 2025-10-10 18:19:13.083281 +0000 UTC │ 2025-10-10 00:42:59.71112 +0000 UTC │
│ 2 │ David Guzman │ [email protected] │ Cyprus │ Lawrencetown │ 2025-10-10 07:52:47.643619 +0000 UTC │ 2025-10-10 06:23:42.864287 +0000 UTC │
│ 3 │ Caitlin Henderson │ [email protected] │ Hong Kong │ West Melanieview │ 2025-10-10 21:06:02.639412 +0000 UTC │ 2025-10-10 19:23:17.540169 +0000 UTC │
│ 4 │ Monica Herrera │ [email protected] │ Niger │ Barbaraland │ 2025-10-11 01:33:43.032929 +0000 UTC │ 2025-10-10 02:29:27.22515 +0000 UTC │
│ 5 │ Darren Roberts │ [email protected] │ Fiji │ Reidstad │ 2025-10-10 12:05:18.734246 +0000 UTC │ 2025-10-10 00:51:13.406526 +0000 UTC │
└────┴───────────────────┴───────────────────────────┴───────────┴──────────────────┴──────────────────────────────────────┴──────────────────────────────────────┘
您的原始層現已建立並驗證。
接下來,我們將清理和標準化所獲得的資料,然後再用於分析。
這一層稱為Staging (stg) — 您可以在這裡強制執行模式、列一致性並套用業務規則。
建立文件:
touch ecommerce/assets/staging/stg.customers.asset.sql
並定義如下:
/* @bruin
name: stg.customers
type: duckdb.sql
materialization:
type: table
depends:
- raw.customers
checks:
columns:
id:
- not_null
email:
- not_null
- unique
country:
- not_null
@bruin */
SELECT id::INT AS customer_id,
COALESCE(TRIM(email), '') AS email,
COALESCE(TRIM(country), 'Unknown') AS country,
created_at,
updated_at
FROM raw.customers
WHERE email IS NOT NULL;
以下是正在發生的事情:
Bruin 註解區塊( @bruin
)定義資產的元資料。
depends
鍵確保此暫存步驟僅在raw.customers
完成後執行- Bruin 自動管理依賴鏈。
列檢查確保轉換前後的資料品質。
SQL 查詢本身執行輕度清理並強制類型一致性。
這種設計模仿了Airflow等編排工具,但沒有外部調度程序——依賴項和檢查都在程式碼內部宣告。
執行之前,驗證資產:
bruin validate ecommerce/assets/staging/stg.customers.asset.sql
預期輸出:
Pipeline: ecommerce_pg_to_duckdb (.)
No issues found
✓ Successfully validated 13 assets across 1 pipeline, all good.
現在執行它:
bruin run ecommerce/assets/staging/stg.customers.asset.sql
結果:
bruin run ecommerce/assets/staging/stg.customers.asset.sql
Analyzed the pipeline 'ecommerce_pg_to_duckdb' with 15 assets.
Running only the asset 'stg.customers'
Pipeline: ecommerce_pg_to_duckdb (../../..)
No issues found
✓ Successfully validated 15 assets across 1 pipeline, all good.
Interval: 2025-10-12T00:00:00Z - 2025-10-12T23:59:59Z
Starting the pipeline execution...
[21:28:16] Running: stg.customers
[21:28:16] Finished: stg.customers (41ms)
==================================================
PASS stg.customers
bruin run completed successfully in 41ms
✓ Assets executed 1 succeeded
確認轉換有效:
bruin query "SELECT country, COUNT(*) AS customers FROM stg.customers GROUP BY country ORDER BY customers DESC;"
範例輸出:
country | customers
--------------+-----------
BRAZIL | 420
GERMANY | 255
UNITED STATES | 198
ARGENTINA | 190
SOUTH KOREA | 182
此時,您已擁有一個乾淨的、經過驗證的資料集,可供分析。
最後一步是建立您的Mart Layer ,其中存放可用於業務的資料。
這是分析師和儀表板直接查詢的層。
每個 Mart 資產都會將暫存資料聚合或重塑為有意義的資料集,以供報告和分析。
mart.customers_by_country.asset.sql
建立以下文件:
touch ecommerce/assets/mart/mart.customers_by_country.asset.sql
然後定義資產:
/* @bruin
name: mart.customers_by_country
type: duckdb.sql
materialization:
type: table
depends:
- stg.customers
@bruin */
SELECT
country,
COUNT(*) AS total_customers
FROM stg.customers
GROUP BY country
ORDER BY total_customers DESC;
此 SQL 資產按國家/地區匯總客戶並依賴stg.customers
,確保暫存層首先運作。
它具體化為 DuckDB 內部的一個表。
執行它:
bruin run ecommerce/assets/mart/mart.customers_by_country.asset.sql
預期輸出:
Pipeline: ecommerce_pg_to_duckdb (.)
Running mart.customers_by_country
✓ Table materialized successfully in DuckDB
驗證結果:
bruin query --connection duckdb-default --query "SELECT * FROM mart.customers_by_country LIMIT 5;"
結果:
┌───────────────┬───────────────────┐
│ COUNTRY │ TOTAL_CUSTOMERS │
├───────────────┼───────────────────┤
│ BRAZIL │ 420 │
│ GERMANY │ 255 │
│ UNITED STATES │ 198 │
│ ARGENTINA │ 190 │
│ SOUTH KOREA │ 182 │
└───────────────┴───────────────────┘
mart.customers_by_age.asset.sql
現在,讓我們建立第二個市場,將客戶按年齡層進行細分。
建立文件:
touch ecommerce/assets/mart/mart.customers_by_age.asset.sql
定義如下:
/* @bruin
name: mart.customers_by_age
type: duckdb.sql
materialization:
type: table
depends:
- stg.customers
@bruin */
WITH src AS (
SELECT
CASE
WHEN age < 25 THEN '18-24'
WHEN age BETWEEN 25 AND 34 THEN '25-34'
WHEN age BETWEEN 35 AND 49 THEN '35-49'
ELSE '50+'
END AS age_group
FROM stg.customers
)
SELECT
age_group,
COUNT(*) AS total_customers
FROM src
GROUP BY age_group
ORDER BY total_customers DESC;
此資產使用簡單的CASE
表達式計算按年齡段劃分的客戶分佈並彙總結果。
執行它:
bruin run ecommerce/assets/mart/mart.customers_by_age.asset.sql
預期輸出:
bruin run ecommerce/assets/mart/mart.customers_by_age.asset.sql
Analyzed the pipeline 'ecommerce_pg_to_duckdb' with 15 assets.
Running only the asset 'mart.customers_by_age'
Pipeline: ecommerce_pg_to_duckdb (../../..)
No issues found
✓ Successfully validated 15 assets across 1 pipeline, all good.
Interval: 2025-10-12T00:00:00Z - 2025-10-12T23:59:59Z
Starting the pipeline execution...
[21:10:24] Running: mart.customers_by_age
[21:10:24] Finished: mart.customers_by_age (39ms)
==================================================
PASS mart.customers_by_age
bruin run completed successfully in 39ms
✓ Assets executed 1 succeeded
確認市場已正確填充:
bruin query --connection duckdb-default --query "SELECT * FROM mart.customers_by_age;"
結果:
┌─────────────┬───────────────────┐
│ AGE_GROUP │ TOTAL_CUSTOMERS │
├─────────────┼───────────────────┤
│ 25-34 │ 460 │
│ 35-49 │ 310 │
│ 18-24 │ 250 │
│ 50+ │ 225 │
└─────────────┴───────────────────┘
希望如果我理解正確的話,一開始解釋的概念不會那麼混亂,而且我們實際上只使用 Bruin 和幾個查詢就讓管道變成了真實的東西!
我們的範例管道如下所示:
graph TD
raw.customers --> stg.customers
stg.customers --> mart.customers_by_country
stg.customers --> mart.customers_by_age
在此階段,您已經使用 Bruin 建立了一個完全聲明性的端對端資料管道(提取、暫存和分析),所有這些都經過管理、驗證和可重現,而無需任何外部編排層。
當我第一次安裝Bruin VS Code Extension時,我不知道自己在做什麼。
那時,我並不真正了解Bruin —— 甚至資料工程—— 是如何運作的。
我點擊了一下,看到了一堆 YAML 和元資料標記,然後很快就放棄了。
一週後,在最終了解了生態系統(攝取、暫存、市場和治理)之後,我決定再次打開擴展程序,這時一切都豁然開朗了。
它不只是一個助手,更是缺少的一塊拼圖。
該擴展將 Bruin CLI 的相同聲明能力帶入可視化、開發人員友好的環境中。
它會自動掃描您的資產、驗證配置、直接對您的資料庫執行查詢,甚至即時管理您的 YAML。
一切都發生在 VS Code 內部——驗證、沿襲探索、元資料檢查和查詢預覽。
最讓我印象深刻的是它的流暢性和開放性。這裡沒有供應商鎖定——它是完全開源的。
您可以像 CLI 本身一樣對其進行分叉、擴展或回饋社區。
簡而言之,Bruin VS Code 擴充不僅僅是一個伴侶,更是工作流程的自然演進。一旦你了解 Bruin,這個工具就像魔法終於被詮釋了一樣。
這項研究是我第一次真正嘗試理解Bruin以及資料工程在實務上的意義。在一步步分解、實驗和串聯之後,曾經感覺抽象複雜的東西開始變得清晰。
我不能說我已經完全理解了所有內容——遠非如此——但我終於明白了各個部分是如何組合在一起的:採集、暫存、集市、驗證和治理。 Bruin 以一種平易近人的方式幫助我親身體驗了這些概念,而不是讓我感到不知所措。
探索、失敗、閱讀和重建的過程最終成為了最有價值的部分。雖然還有很多東西需要學習,但這是邁向真正理解資料如何移動、轉換以及如何講述故事(就像這篇文章一樣)的堅實的第一步。
原文出處:https://dev.to/danielhe4rt/data-engineering-101-a-real-beginners-approach-25a8