🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付

這是有關資料工程的文章,如果您在 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)  
  1. 序言

我不得不承認:每當有人提到資料工程,我都會置之不理。它聽起來總是複雜得不可思議——幾乎像魔法一樣。

這週,我終於決定深入研究。我以為這會相當簡單,但沒多久我就意識到這個兔子洞有多深。

這個領域不僅僅是一些腳本或 SQL 查詢;它是一個由相互關聯的工具、概念和職責組成的整個生態系統,構成了現代資料系統的支柱。

概念如下:

  • 資料目錄與治理:了解誰擁有資料、如何確保品質以及如何追蹤譜系。

  • 編排:使用Apache AirflowDagster等工具協調依賴關係和工作流程。

  • 轉換(ETL/ELT):使用dbtFivetran等工具清理和標準化資料。

  • 擷取與串流:使用KafkaAirbyteConfluent Cloud連接來源並即時移動資料。

  • 可觀察性和品質:使用Monte CarloDatafold等解決方案監控資料健康狀況。

每點擊一篇文章,就會開啟一個充滿工具、詞彙、框架、架構和最佳實踐的新世界。

而且,所有這些都必須以某種方式協同工作——治理、編排、轉換、攝取、可觀察性、基礎設施。

作為一名開發人員,我習慣於學習一門語言和一個框架,然後開始工作。

但在資料工程中,情況有所不同。

它是關於了解整個生態系統以及每個部分如何與下一個部分連結。

經過數小時閱讀文件、追蹤 GitHub 儲存庫以及在工具、文章和無數定義之間跳轉後,我終於找到了讓一切順利的工具— — Bruin

想像一個框架:

  • 管道即程式碼-所有內容都儲存在版本控制的文字中(YAML、SQL、Python)。沒有隱藏的 UI 或資料庫。可複製、可審查、可自動化。

  • 天生的多語言——原生支援 SQL 和 Python,並能夠插入二進位檔案或容器以滿足更複雜的用例。

  • 可組合管道——將技術、來源和目的地結合在一個無縫流程中——無需黏合程式碼,無需駭客攻擊。

  • 無鎖定-100% 開源(Apache 授權)CLI,可在任何地方運作:本地、CI 或生產環境。您可以完全控制您的管道和資料。

  • 專為開發者和資料品質打造-快速本地執行、整合檢查和快速回饋循環。經過測試、值得信賴且易於交付的資料產品。

....它符合我之前提到的所有核心資料工程概念

我承認──我是那種喜歡高效率懶惰的人。如果有辦法用更少的工具、更少的摩擦做更多的事情,我就會去做。

因此,在我們開始之前,請先了解以下計劃:

在大多數設定中,資料流從 OLTP 資料庫→擷取→資料湖/倉庫→轉換→市集→分析儀表板。

Airbyte等工具負責處理資料擷取, dbt負責處理資料轉換, Airflow負責協調依賴關係,而 Bruin 則負責將這些層結合起來

成為一個統一的框架。

本文將介紹資料工程的基本原理,同時探索Bruin如何透過簡單的、真實的管道將它們整合在一起。

  1. 第一印象:探索 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/`**

  • 包含所有資產-資料管道的建構塊。

  • 每項資產處理不同的任務:擷取原始資料、轉換資料或產生分析表。

  • 由於每個資產都是一個文件,因此它是版本控制的、可測試的和可重複使用的——就像程式碼一樣。

僅此而已,我們就能執行完整的流程了。不過,我仍然認為我們需要逐一檢查每個步驟並單獨歸檔——我保證會很快!

2.1. 核心檔案: .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 -定義多個設定(例如, devstagingprod ),每個設定都有自己的配置。

  • connections -列出 Bruin 可以連接的每個系統,例如 Postgres 或 DuckDB。

每個連線都有一個名稱(例如, pg-default ),您可以在管道和資產中引用該名稱。

  • 環境變數支援-任何包裹在${...}中的值都會自動從您的系統環境中讀取。

這表示您可以在本機或 CI/CD 環境中執行時將憑證保留在原始碼控制之外。

這種設計使一切保持集中、安全和版本控制,同時讓您可以靈活地透過環境變數動態注入機密 - 非常適合在不接觸程式碼的情況下在本地、暫存和生產之間切換。

2.2. Pipeline:一種更簡單的方式 Apache Airflow

對於您擁有的每個功能,它都必須附帶一個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"

2.3. 資產:資料產品的基石

Bruin中的每個資料管道都由資產組成 - 模組化、獨立的單元,定義特定的操作:提取、轉換或產生資料集。

每個資產都作為assets/目錄下的檔案存在,其檔案名稱兼作管道圖中的標識。

如果你還記得開頭展示的文件結構,你一定記得我在流程中有多種類型的資源。這是最酷的部分,因為你可以用多種語言記錄,而且仍然很簡單。以下是一些可能性:

| 類型 | 描述 | 檔案名稱(在檔案樹中)|

| ------ | ---------------------------------------------------------------------------------- | --------------------------- |

| YAML | 用於提取或元資料密集型資產的聲明式配置 | raw.customers.asset.yml |

| SQL | 純轉換邏輯 — 思考 dbt 風格的模式 | stg.orders.sql |

| Python | 自訂邏輯或整合(例如 API、驗證或機器學習步驟)| mart.sales_daily.asset.py |

您可以自由地以自己喜歡的方式組織資產—沒有嚴格的層級結構需要遵循。

關鍵的見解是,編排透過依賴關係隱式地進行,而不是透過像 Airflow 這樣的外部 DAG 引擎進行。

每個資產都聲明了它所依賴的內容, Bruin 會自動為您建立並執行依賴圖

例子:

  1. 原始訂單資產.yml
# 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
  1. 原始.order_items.asset.yml
# 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 不僅僅執行管道 - 它還作為同一工作流程的一部分對其進行審核記錄管理

2.4. 政策:加強品質和治理

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 轉變為一個自治資料平台——在這個平台上,最佳實踐不是可選的,而是強制執行的。

透過將規則提交到版本控制,您可以使資料治理成為開發工作流程的一部分,而不是事後才想到的。

2.5. 詞彙表:說同一種語言

在資料專案中,最困難的問題之一不是技術問題,而是溝通問題

不同的團隊經常使用同一個字來表示不同的意思。

這就是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

這會自動繼承詞彙表中的typedescription

這是一個簡單的想法,但卻很強大——您的資料定義將變得像程式碼一樣受版本控制和共享

  1. 建構我們的第一個管道

現在我們已經探索了Bruin背後的結構和理念,現在是時候建立端到端管道了。

我們將從原始攝取乾淨的暫存層,最後到可供分析的市場——所有這些都定義為程式碼。

我們假設您已經擁有:

  • Postgres資料庫作為您的資料來源。

  • DuckDB資料庫作為您的分析儲存。

  • 配置了兩個連接的工作.bruin.yml文件

3.1 步驟 1:從來源擷取資料到資料湖

第一步是將資料從 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 │
└────┴───────────────────┴───────────────────────────┴───────────┴──────────────────┴──────────────────────────────────────┴──────────────────────────────────────┘

您的原始層現已建立並驗證。


3.2 步驟 2:格式化和驗證資料(暫存層)

接下來,我們將清理和標準化所獲得的資料,然後再用於分析。

這一層稱為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

此時,您已擁有一個乾淨的、經過驗證的資料集,可供分析。

3.3 步驟3:設計分析(Mart)層

最後一步是建立您的Mart Layer ,其中存放可用於業務的資料。

這是分析師和儀表板直接查詢的層。

每個 Mart 資產都會將暫存資料聚合或重塑為有意義的資料集,以供報告和分析。

3.3.1 資產: 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               │
└───────────────┴───────────────────┘

3.3.2 資產: 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               │
└─────────────┴───────────────────┘

4. 完整預覽資料流

希望如果我理解正確的話,一開始解釋的概念不會那麼混亂,而且我們實際上只使用 Bruin 和幾個查詢就讓管道變成了真實的東西!

我們的範例管道如下所示:

graph TD
    raw.customers --> stg.customers
    stg.customers --> mart.customers_by_country
    stg.customers --> mart.customers_by_age

在此階段,您已經使用 Bruin 建立了一個完全聲明性的端對端資料管道(提取、暫存和分析),所有這些都經過管理、驗證和可重現,而無需任何外部編排層。

  1. 超強的 VS Code 擴展

VS Code 擴充

當我第一次安裝Bruin VS Code Extension時,我不知道自己在做什麼。

那時,我並不真正了解Bruin —— 甚至資料工程—— 是如何運作的。

我點擊了一下,看到了一堆 YAML 和元資料標記,然後很快就放棄了。

一週後,在最終了解了生態系統(攝取、暫存、市場和治理)之後,我決定再次打開擴展程序,這時一切都豁然開朗了

它不只是一個助手,更是缺少的一塊拼圖

該擴展將 Bruin CLI 的相同聲明能力帶入可視化、開發人員友好的環境中。

它會自動掃描您的資產、驗證配置、直接對您的資料庫執行查詢,甚至即時管理您的 YAML。

一切都發生在 VS Code 內部——驗證、沿襲探索、元資料檢查和查詢預覽。

VS Code 擴充詳細訊息

最讓我印象深刻的是它的流暢性和開放性。這裡沒有供應商鎖定——它是完全開源的。

您可以像 CLI 本身一樣對其進行分叉、擴展或回饋社區。

簡而言之,Bruin VS Code 擴充不僅僅是一個伴侶,更是工作流程的自然演進。一旦你了解 Bruin,這個工具就像魔法終於被詮釋了一樣。

  1. 結論

這項研究是我第一次真正嘗試理解Bruin以及資料工程在實務上的意義。在一步步分解、實驗和串聯之後,曾經感覺抽象複雜的東西開始變得清晰。

我不能說我已經完全理解了所有內容——遠非如此——但我終於明白了各個部分是如何組合在一起的:採集、暫存、集市、驗證和治理。 Bruin 以一種平易近人的方式幫助我親身體驗了這些概念,而不是讓我感到不知所措。

探索、失敗、閱讀和重建的過程最終成為了最有價值的部分。雖然還有很多東西需要學習,但這是邁向真正理解資料如何移動、轉換以及如何講述故事(就像這篇文章一樣)的堅實的第一步。

GitHub 演示:使用 Bruin 的電子商務管道

布朗網站


原文出處:https://dev.to/danielhe4rt/data-engineering-101-a-real-beginners-approach-25a8


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝22   💬9   ❤️6
604
🥈
我愛JS
📝4   💬14   ❤️7
273
🥉
御魂
💬1  
3
#4
2
#5
1
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付