Đây là bài viết về Kỹ thuật Dữ liệu mà bạn tìm thấy khi tìm kiếm chủ đề trên Google và được chuyển hướng sau khi nhấp vàoCảm thấy May mắn.

Ngoài ra, bài viết này là quan điểm của một kỹ sư phát triển web có kinh nghiệm bắt đầu một chủ đề mới trong sự nghiệp của mình, điều đó có nghĩa:
đây là nghiên cứu của tôi, nếu bạn có điều gì muốn thêm, hãy thoải mái dạy tôi trong phần bình luận bên dưới!
Tôi rất muốn học hỏi thêm!

Mục lục

1. Lời mở đầu

Tôi phải thừa nhận:
bất cứ khi nào ai đó nhắc đếnKỹ thuật Dữ liệu, tôi thường bỏ qua.
Nó luôn nghe có vẻ như một thứ gì đó phức tạp đến mức không tưởng — gần nhưkỳ diệu.

Tuần này, tôi cuối cùng đã quyết định lao vào.
Tôi nghĩ nó sẽ khá đơn giản, nhưng không mất nhiều thời gian để nhận ra cái hố thỏ sâu đến mức nào.

Lĩnh vực này không chỉ là một vài tập lệnh hoặc truy vấn SQL;
đó là toàn bộhệ sinh tháicủa các công cụ, khái niệm và trách nhiệm liên kết với nhau tạo thành xương sống của các hệ thống dữ liệu hiện đại.

Các khái niệm như:

  • Danh mục và Quản trị Dữ liệu:hiểu ai sở hữu dữ liệu, cách đảm bảo chất lượng và cách theo dõi nguồn gốc.
  • Điều phối:phối hợp các phụ thuộc và quy trình làm việc với các công cụ nhưApache AirflowhoặcDagster.
  • Biến đổi (ETL/ELT):làm sạch và chuẩn hóa dữ liệu bằng các công cụ nhưdbthoặcFivetran.
  • Thu thập và Truyền phát:kết nối các nguồn và di chuyển dữ liệu trong thời gian thực vớiKafka,Airbyte, hoặcConfluent Cloud.
  • Khả năng quan sát và Chất lượng:giám sát sức khỏe dữ liệu với các giải pháp nhưMonte CarloDatafold.

Đối với mỗi bài viết được nhấp, chỉ cần mở ra một thế giới mới của các công cụ, từ ngữ, khung, kiến trúc và phương pháp hay nhất.
Và bằng cách nào đó, tất cảphải hoạt động cùng nhau— quản trị, điều phối, biến đổi, thu thập, khả năng quan sát, cơ sở hạ tầng.

Là một nhà phát triển, tôi quen với việc học mộtngôn ngữvà mộtkhungvà sau đó bắt tay vào làm việc.
Nhưng trong kỹ thuật dữ liệu, nó khác.

Đó là về việc hiểu toàn bộhệ sinh tháivà cách mỗi phần kết nối với phần tiếp theo.

Sau nhiều giờ đọc tài liệu, theo đuổi các kho lưu trữ GitHub và nhảy qua lại giữa các công cụ, bài viết và vô số định nghĩa, cuối cùng tôi đã tìm thấycông cụlàm mọi thứ trở nên rõ ràng —Bruin.

Hãy tưởng tượng một khung duy nhất mà:

  • Pipeline dưới dạng Mã— Mọi thứ tồn tại trong văn bản được kiểm soát phiên bản (YAML, SQL, Python).
    Không có giao diện người dùng hoặc cơ sở dữ liệu ẩn.
    Có thể tái tạo, xem xét và tự động hóa.
  • Đa Ngôn ngữ Tự nhiên— Hỗ trợ gốc cho SQL và Python, cộng với khả năng cắm các tệp nhị phân hoặc container cho các trường hợp sử dụng phức tạp hơn.
  • Pipeline Có thể Kết hợp— Kết hợp các công nghệ, nguồn và đích trong một luồng liền mạch — không có mã kết dính, không có thủ thuật.
  • Không Ràng buộc— 100% mã nguồn mở (được cấp phép Apache) CLI chạy ở mọi nơi:
    cục bộ, trong CI hoặc trong sản xuất.
    Bạn giữ toàn quyền kiểm soát pipeline và dữ liệu của mình.
  • Được xây dựng cho Nhà phát triển và Chất lượng Dữ liệu— Chạy cục bộ nhanh, kiểm tra tích hợp và vòng phản hồi nhanh chóng.
    Các sản phẩm dữ liệu được kiểm tra, đáng tin cậy và dễ dàng triển khai.

…và nóphù hợp với tất cả các khái niệm cốt lõi về Kỹ thuật Dữ liệumà tôi vừa đề cập trước đó.

Tôi thừa nhận — tôi là kiểu người chấp nhậnsự lười biếng hiệu quả.
Nếu có cách để làm nhiều hơn với ít công cụ hơn và ít ma sát hơn, tôi sẽ tham gia.

Vì vậy, trước khi chúng ta bắt đầu, đây là kế hoạch:

Trong hầu hết các thiết lập, dữ liệu chảy từ cơ sở dữ liệu OLTP → thu thập → hồ/kho dữ liệu → biến đổi → mart → bảng điều khiển phân tích.

Các công cụ nhưAirbytexử lý việc thu thập,dbtxử lý biến đổi,Airflowđiều phối các phụ thuộc — và Bruin kết hợp các lớp đó
thành một khung thống nhất.

Bài viết này sẽ hướng dẫn quacác nguyên tắc cơ bản của Kỹ thuật Dữ liệu, đồng thời khám phá cáchBruinkết hợp tất cả chúng lại với nhau thông qua một pipeline đơn giản, trong thế giới thực.

2. Ấn tượng đầu tiên: Khám phá Cấu trúc của Bruin

Tôi thành thật — tôi từng có một chút định kiến với các dự án Khoa học/Kỹ thuật Dữ liệu.
Mỗi khi tôi nhìn vào một dự án, nó cảm thấy lộn xộn và không có cấu trúc, với các tệp và sổ ghi chép nằm rải rác khắp nơi.
Xuất thân từ nền tảng phát triển phần mềm, sự hỗn loạn đó luôn làm tôi khó chịu.

Nhưng một khi tôi bắt đầu nhìn vàocấu trúc dự án của Bruin, nhận thức đó hoàn toàn thay đổi.
Mọi thứ đột nhiên cảm thấycó tổ chức và có chủ đích.
Khung tự nhiên thực thi cấu trúc thông qua các lớp của nó — và một khi bạn tuân theo chúng, mọi thứ bắt đầu có ý nghĩa.

Ví dụ:
Cấu trúc Dự án

├── 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 
Vào chế độ toàn màn hìnhThoát chế độ toàn màn hình

Chức Năng Của Từng Phần

  • .bruin.yml
    • Tệp cấu hình chính cho môi trường Bruin của bạn.
    • Xác địnhcài đặt toàn cụcnhưkết nốimặc định, biến số vàhành vicho tất cả các pipeline.
  • policy.yml
    • Tệp chính sách quản trị và xác thực dữ liệu của bạn.
    • Xác định các quy tắc chất lượng dữ liệu, kiểm soát truy cập và kiểm tra tuân thủ mà Bruin có thể tự động thực thi trước khi triển khai các sản phẩm dữ liệu.
  • glossary.yml
    • Hoạt động như một danh mục dữ liệu nhẹ cho dự án của bạn.
    • Ghi chép các thuật ngữ, số liệu và tập dữ liệu để mọi người trong nhóm sử dụng cùng một ngôn ngữ.
    • Cũng hỗ trợ việc truy xuất nguồn gốc, tài liệu hóa và khả năng khám phá.
  • some-feature/pipeline.yml
    • Xác định một pipeline cụ thể cho một miền hoặc dự án (trong ví dụ này làthương mại điện tử).
    • Mô tả luồng dữ liệu từ đầu đến cuối — các tài sản cần chạy, phụ thuộc của chúng và lịch trình.
  • Các pipeline có tính mô-đun, vì vậy bạn có thể duy trì các pipeline riêng biệt cho các lĩnh vực kinh doanh khác nhau.
  • some-feature/assets/*
    • Chứa tất cả các tài sản
      – các khối xây dựng của đường dẫn dữ liệu của bạn.
    • Mỗi tài sản xử lý một nhiệm vụ riêng biệt:
      thu thập dữ liệu thô, chuyển đổi nó hoặc tạo bảng phân tích.
    • Vì mỗi tài sản là một tệp, nóđược kiểm soát phiên bản, có thể kiểm tra và tái sử dụng— giống như mã.
  • Chỉ với điều đó, chúng ta đã có thể chạy một pipeline đầy đủ.
    Tuy nhiên, tôi vẫn nghĩ chúng ta cần xem xét từng bước và từng tệp riêng lẻ — tôi hứa sẽ rất nhanh!

    2.1.
    Tệp Lõi:.bruin.yml

    Hãy coi.bruin.ymlnhưcấu hình gốccủa dự án bạn — tệp cho Bruin biếtcách thứcđịa điểmđể chạy mọi thứ.

    Thay vì phân tán cài đặt trên các tập lệnh hoặc biến môi trường, Bruin tập trung chúng ở đây:
    kết nối, thông tin xác thực và cấu hình cụ thể theo môi trường đều nằm ở một nơi.
    Nó cũng đóng vai trò làbackend bí mật mặc địnhcủa Bruin, vì vậy các pipeline của bạn có thể truy cập cơ sở dữ liệu hoặc kho dữ liệu một cách an toàn và nhất quán.

    bruin run ecommerce/pipeline.yml --config-file /path/to/.bruin.yml 
    Chuyển sang chế độ toàn màn hìnhThoát chế độ toàn màn hình

    Một ví dụ đơn giản:

    môi_trường_mặc_định:mặc_địnhcác_môi_trường:mặc_định:các_kết_nối:postgres:-tên:pg-mặc_địnhtên_người_dùng:postgres# (cũng được mã hóa cứng)mật_khẩu:${PG_PASSWORD}máy_chủ:${PG_HOST}cổng:${PG_PORT}cơ_sở_dữ_liệu:${PG_DATABASE}duckdb:-tên:duckdb-mặc_địnhđường_dẫn:duckdb.db
    Vào chế độ toàn màn hìnhThoát chế độ toàn màn hình

    Điều Gì Đang Diễn Ra Ở Đây

    • môi_trường_mặc_định— thiết lập môi trường mà Bruin sẽ sử dụng trừ khi được chỉ định khác.
    • các_môi_trường— định nghĩa nhiều thiết lập (ví dụ:phát_triển,staging,sản_xuất), mỗi cái có cấu hình riêng.
    • các_kết_nối— liệt kê mọi hệ thống Bruin có thể kết nối, như Postgres hoặc DuckDB.
      Mỗi kết nối có một tên (ví dụ:pg-mặc_định) mà bạn sẽ tham chiếu qua các pipeline và tài sản.
    • Hỗ trợ biến môi trường— bất kỳ giá trị nào được bao trong${...}sẽ tự động được đọc từ môi trường hệ thống của bạn.

    Điều này có nghĩa bạn có thể giữ thông tin xác thực ngoài kiểm soát nguồn trong khi vẫn chạy cục bộ hoặc trong môi trường CI/CD.

    Thiết kế này giữ mọi thứtập trung, bảo mật và được kiểm soát phiên bản, đồng thời cho bạn sự linh hoạt để tiêm các bí mật động thông qua biến môi trường — hoàn hảo để chuyển đổi giữa môi trường cục bộ, staging và sản xuất mà không cần chạm vào mã.

    2.2.
    Pipeline:
    MỘT APACHE AIRFLOW DỄ DÀNG HƠN NHIỀU

    Với mỗi tính năng bạn có, nó sẽ phải đi kèm với tệppipeline.yml.
    Đây là tệp sẽ nhóm tất cả tài sản của bạn và hiểu rằng đó không phải là một tài sản đơn lẻ chạy, mà là một danh sách tài sản được liên kết.

    - ecommerce-mart/ ├─ pipeline.yml -> bạn đang ở đây └─ assets/ ├─ some-asset.sql ├─ definitely-an-asset.yml └─ another-asset.py 
    Vào chế độ toàn màn hìnhThoát chế độ toàn màn hình

    Tại đó bạn cũng cấu hình mỗi kết nối bạn muốn sử dụng trên pipeline cụ thể:

    name:product_ecommerce_martsschedule:daily# liên quan đến triển khai Bruin Clouddefault_connections:duckdb:"duckdb-default"postgres:"pg-default"
    Vào chế độ toàn màn hìnhThoát chế độ toàn màn hình

    2.3.
    Assets:
    Các Khối Xây Dựng của Sản Phẩm Dữ Liệu

    Mỗi pipeline dữ liệu trongBruinđược cấu thành từassets— các đơn vị mô-đun, độc lập định nghĩa một hoạt động cụ thể:
    thu thập, biến đổi hoặc tạo ra một tập dữ liệu.

    Mỗi asset tồn tại dưới dạng một tệp trong thư mụcassets/, và tên tệp của nó đồng thời là định danh của nó trong đồ thị pipeline.

    Nếu bạn nhớ cấu trúc tệp được hiển thị ở phần đầu, bạn phải nhớ rằng tôi có nhiều loại tài sản trong pipeline.
    Đó là phần tuyệt vời nhất, vì bạn có thể viết bằng nhiều ngôn ngữ và vẫn là một thứ gì đó đơn giản.
    Đây là một số khả năng:

    Loại Mô tả Tên tệp (trong cây thư mục)
    YAML Cấu hình khai báo cho việc thu thập dữ liệu hoặc tài sản có nhiều siêu dữ liệu raw.customers.asset.yml
    SQL Logic biến đổi thuần túy — giống như các mô hình kiểu dbt stg.orders.sql
    Python Logic tùy chỉnh hoặc tích hợp (ví dụ:
    API, xác thực, hoặc các bước học máy)
    mart.sales_daily.asset.py

    Bạn có thể tự do tổ chức các tài sản theo cách mình muốn — không có hệ thống phân cấp cứng nhắc nào cần tuân theo.
    Điểm mấu chốt làviệc điều phối xảy ra ngầm thông qua các phụ thuộc, không thông qua một công cụ DAG bên ngoài như Airflow.

    Mỗi tài sản khai báo những gì nó phụ thuộc vào, vàBruin tự động xây dựng và thực thi đồ thị phụ thuộccho bạn.

    Ví dụ:

    1. raw.orders.asset.yml
    # raw.orders.asset.ymlname:raw.orderstype:ingestrdescription:Ingest OLTP orders from Postgres into the DuckDB raw layer.parameters:source_connection:pg-defaultsource_table:"public.orders"destination:duckdb
    Enter fullscreen modeExit fullscreen mode
    1. raw.order_items.asset.yml
    # raw.order_items.asset.ymlname:raw.order_itemstype:ingestrdescription:Ingest OLTP order_items from Postgres into the DuckDB raw layer.depends:-raw.orders# declares a dependency on the 'raw.orders' assetparameters:source_connection:pg-defaultsource_table:"public.order_items"destination:duckdb
    Enter fullscreen modeExit fullscreen mode


    biến thành:

    graph TD raw.orders --> raw.order_items; 
    Enter fullscreen modeExit fullscreen mode

    Bằng cách kết nối các tài sản như thế này, bạn mô tảmối quan hệ logicgiữa các thao tác dữ liệu thay vì điều phối các bước một cách thủ công.
    Kết quả là mộtđường ống khai báo, có thể kết hợp và bảo trì được— dễ đọc, phiên bản hóa và mở rộng giống như mã ứng dụng.

    Một trong những khía cạnh mạnh mẽ nhất của Bruin là cách nó kết nốichất lượng dữ liệuquản trịtrực tiếp vào các tài sản của bạn.
    Bằng cách định nghĩa các kiểm tra dưới mỗi cột, bạn không chỉ xác thực dữ liệu của mình mà còn ghi nhận quyền sở hữu, kỳ vọng và ràng buộc — tất cả đều được kiểm soát phiên bản và có thể thực thi tại thời điểm chạy.

    Điều này có nghĩa là Bruin không chỉchạycác đường ống — nókiểm tra,ghi nhận, vàquản trịchúng như một phần của cùng một quy trình làm việc.

    2.4.
    Chính sách:
    Thực thi Chất lượng và Quản trị

    Chính sách trongBruinđóng vai trò như sách quy tắc giúp các đường ống dữ liệu của bạn nhất quán, tuân thủ và chất lượng cao.
    Chúng đảm bảo mọi tài sản và đường ống tuân theo các phương pháp hay nhất — từ quy ước đặt tên và quyền sở hữu đến xác thực và tính đầy đủ của siêu dữ liệu.

    Về cốt lõi, chính sách được định nghĩa trong một tệppolicy.ymlduy nhất nằm ở thư mục gốc của dự án của bạn.
    Tệp này cho phép bạnkiểm tra lỗi,xác thực, vàthực thi các tiêu chuẩnmột cách tự động trước khi một đường ống chạy.

    Tổng quan Nhanh

    rulesets:-name:standardselector:-path:.*/ecommerce/.*rules:-asset-has-owner-asset-name-is-lowercase-asset-has-description
    Enter fullscreen modeExit fullscreen mode

    Mỗibộ quy tắcđịnh nghĩa:

    • nơiquy tắc áp dụng (selector→ khớp theo đường dẫn, thẻ hoặc tên),
    • điều gìcần thực thi (rules→ các quy tắc xác thực có sẵn hoặc tùy chỉnh).

    Sau khi được định nghĩa, bạn có thể xác thực toàn bộ dự án của mình:

    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)
    Enter fullscreen modeExit fullscreen mode

    Bruin tự động kiểm tra lỗi các tài sản trước khi thực thi — đảm bảo rằngcác đường ống không tuân thủ sẽ không bao giờ chạy.

    Quy tắc Tích hợp và Tùy chỉnh

    Quy tắc Mục tiêu Mô tả
    asset-has-owner tài sản Mỗi tài sản phải định nghĩa một chủ sở hữu.
    asset-has-description tài sản Tài sản phải bao gồm một mô tả.
    asset-name-is-lowercase tài sản Tên tài sản phải là chữ thường.
    pipeline-has-retries đường ống Đường ống phải định nghĩa cài đặt thử lại.

    Bạn cũng có thể định nghĩa các quy tắc của riêng mình:

    custom_rules:-name:asset-has-ownerdescription:every asset should have an ownercriteria:asset.Owner != ""
    Enter fullscreen modeExit fullscreen mode

    Các quy tắc có thể nhắm mục tiêu vàotài sảnhoặcđường ống, và chúng sử dụng các biểu thức logic để xác định tính tuân thủ.

    Chính sách biến Bruin thành mộtnền tảng dữ liệu tự quản— nơi các phương pháp hay nhất không phải là tùy chọn, mà được thực thi.
    Bằng cách cam kết các quy tắc của bạn với kiểm soát phiên bản, bạn biến quản trị dữ liệu thành một phần của quy trình phát triển, không phải là suy nghĩ sau này.

    2.5.
    Bảng thuật ngữ:
    Cùng Nói Một Ngôn ngữ

    Trong các dự án dữ liệu, một trong những vấn đề khó khăn nhất không phải là kỹ thuật — mà làgiao tiếp.
    Các nhóm khác nhau thường sử dụng cùng một từ để chỉ những điều khác nhau.
    Đó là lúcBruin’s Glossaryxuất hiện.

    Một bảng thuật ngữ được định nghĩa trongglossary.ymltại thư mục gốc của dự án của bạn.
    Nó hoạt động như mộttừ điển chia sẻvề các khái niệm kinh doanh (nhưKhách hànghoặcĐơn hàng) và các thuộc tính của chúng, giúp các nhóm liên kết với nhau xuyên suốt các pipeline.

    entities:Customer:description:A registered user or business in our platform.attributes:ID:type:integerdescription:Unique customer identifier.
    Chế độ toàn màn hìnhThoát chế độ toàn màn hình

    Bạn có thể tham chiếu các định nghĩa này bên trong các tài sản bằng cách sử dụngextends, tránh trùng lặp và đảm bảo tính nhất quán:

    # raw.customers.asset.ymlname:raw.customerstype:ingestrcolumns:-name:customer_idextends:Customer.ID
    Chế độ toàn màn hìnhThoát chế độ toàn màn hình

    Điều này tự động kế thừatypedescriptiontừ bảng thuật ngữ.
    Đó là một ý tưởng đơn giản, nhưng mạnh mẽ —các định nghĩa dữ liệu của bạn trở thành được kiểm soát phiên bản và chia sẻ, giống như mã.

    3. Xây Dựng Pipeline Đầu Tiên Của Chúng Ta

    Bây giờ chúng ta đã khám phá cấu trúc và triết lý đằng sauBruin, đã đến lúc xây dựng một pipeline đầu-cuối.

    Chúng ta sẽ đi từthu thập dữ liệu thôđến mộtlớp staging sạch, và cuối cùng, đếncác kho dữ liệu sẵn sàng cho phân tích— tất cả được định nghĩa dưới dạng mã.

    Chúng tôi giả định bạn đã có:

    • Một cơ sở dữ liệuPostgreslàm nguồn dữ liệu của bạn.
    • Một cơ sở dữ liệuDuckDBlàm kho lưu trữ phân tích của bạn.
    • Một tệp.bruin.ymlhoạt động được cấu hình với cả hai kết nối ### 3.1 Bước 1 :
      Thu Thập Dữ Liệu Từ Nguồn Của Bạn Đến Hồ Dữ Liệu

    Bước đầu tiên là di chuyển dữ liệu từ Postgres vào DuckDB.

    Điều này tạo raLớp Thôcủa bạn — dữ liệu được sao chép từ nguồn với chuyển đổi tối thiểu.

    Tạo một tệp tài sản thu thập:

    touchassets/ingestion/raw.customers.asset.yml 
    Chế độ toàn màn hìnhThoát chế độ toàn màn hình

    Sau đó định nghĩa tài sản:

    # assets/ingestion/raw.customers.asset.ymlname:raw.customerstype:ingestrdescription:Ingest OLTP customers from Postgres into the DuckDB raw layer.parameters:source_connection:pg-defaultsource_table:"public.customers"destination:duckdbcolumns:-name:idtype:integerprimary_key:truechecks:-name:not_null-name:unique-name:emailtype:stringchecks:-name:not_null-name:unique-name:countrytype:stringchecks:-name:not_null
    Chế độ toàn màn hìnhThoát chế độ toàn màn hình

    Điều này báo cho Bruin trích xuất dữ liệu từ bảng Postgrespublic.customerscủa bạn, xác thực chất lượng cột và lưu trữ nó trong lớp thô của DuckDB.


    Chạy Tài Sản

    bruin run ecommerce/assets/ingestion/raw.customers.asset.yml 
    Chế độ toàn màn hìnhThoát chế độ toàn màn hình

    Kết quả mong đợi:

    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 
    Chế độ toàn màn hìnhThoát chế độ toàn màn hình

    Bây giờ bạn có thể truy vấn dữ liệu đã thu thập:

    bruin query --connection duckdb-default --query"SELECT 
    * FROM raw.customers LIMIT 5"
    Chế độ toàn màn hìnhThoát chế độ toàn màn hình

    Kết quả:

    ┌────┬───────────────────┬───────────────────────────┬───────────┬──────────────────┬──────────────────────────────────────┬──────────────────────────────────────┐ │ ID │ FULL_NAME │ EMAIL │ COUNTRY │ CITY │ CREATED_AT │ UPDATED_AT │ ├────┼───────────────────┼───────────────────────────┼───────────┼──────────────────┼──────────────────────────────────────┼──────────────────────────────────────┤ │ 1 │ Allison Hill │ donaldgarcia@example.net │ Uganda │ New Roberttown │ 2025-10-10 18:19:13.083281 +0000 UTC │ 2025-10-10 00:42:59.71112 +0000 UTC │ │ 2 │ David Guzman │ jennifermiles@example.com │ Cyprus │ Lawrencetown │ 2025-10-10 07:52:47.643619 +0000 UTC │ 2025-10-10 06:23:42.864287 +0000 UTC │ │ 3 │ Caitlin Henderson │ eric51@example.org │ 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 │ smiller@example.net │ Niger │ Barbaraland │ 2025-10-11 01:33:43.032929 +0000 UTC │ 2025-10-10 02:29:27.22515 +0000 UTC │ │ 5 │ Darren Roberts │ wyattmichelle@example.com │ Fiji │ Reidstad │ 2025-10-10 12:05:18.734246 +0000 UTC │ 2025-10-10 00:51:13.406526 +0000 UTC │ └────┴───────────────────┴───────────────────────────┴───────────┴──────────────────┴──────────────────────────────────────┴──────────────────────────────────────┘ 
    Chế độ toàn màn hìnhThoát chế độ toàn màn hình

    Lớpthôcủa bạn hiện đã được thiết lập và xác thực.


    3.2 Bước 2:
    Định dạng và Xác thực Dữ liệu (Lớp Staging)

    Tiếp theo, chúng ta sẽ làm sạch và chuẩn hóa dữ liệu đã được thu thập trước khi sử dụng nó trong phân tích.

    Lớp này được gọi làStaging (stg)— đây là nơi bạn áp dụng lược đồ, tính nhất quán của cột và áp dụng các quy tắc kinh doanh.

    Tạo tệp:

    touchecommerce/assets/staging/stg.customers.asset.sql 
    Enter fullscreen modeExit fullscreen mode

    Và định nghĩa nó như sau:

    /
    * @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 */SELECTid::INTAScustomer_id,COALESCE(TRIM(email),'')ASemail,COALESCE(TRIM(country),'Unknown')AScountry,created_at,updated_atFROMraw.customersWHEREemailISNOTNULL;
    Enter fullscreen modeExit fullscreen mode

    Đây là những gì đang diễn ra:

    • Khối chú thíchBruin (@bruin)định nghĩa siêu dữ liệu cho tài sản.
    • Khóadependsđảm bảo bước staging nàychỉ chạy sau khiraw.customershoàn tất — Bruin tự động quản lý chuỗi phụ thuộc.
    • Cáckiểm tra cộtđảm bảo chất lượng dữ liệu trước và sau khi biến đổi.
    • Truy vấn SQL tự thực hiện việc làm sạch nhẹ và đảm bảo tính nhất quán kiểu dữ liệu.

    Thiết kế này mô phỏng các công cụ điều phối nhưAirflow, nhưng không có bộ lập lịch bên ngoài — các phụ thuộc và kiểm tra được khai báo ngay trong mã của bạn.

    Xác thực và Thực thi

    Trước khi chạy, hãy xác thực tài sản:

    bruin validate ecommerce/assets/staging/stg.customers.asset.sql 
    Enter fullscreen modeExit fullscreen mode

    Kết quả mong đợi:

    Pipeline: ecommerce_pg_to_duckdb (.) No issues found ✓ Successfully validated 13 assets across 1 pipeline, all good. 
    Enter fullscreen modeExit fullscreen mode

    Bây giờ thực thi nó:

    bruin run ecommerce/assets/staging/stg.customers.asset.sql 
    Enter fullscreen modeExit fullscreen mode

    Kết quả:

    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 
    Enter fullscreen modeExit fullscreen mode

    Xác nhận rằng quá trình biến đổi đã hoạt động:

    bruin query "SELECT country, COUNT(*) AS customers FROM stg.customers GROUP BY country ORDER BY customers DESC;"
    Enter fullscreen modeExit fullscreen mode

    Kết quả mẫu:

    country | customers --------------+----------- BRAZIL | 420 GERMANY | 255 UNITED STATES | 198 ARGENTINA | 190 SOUTH KOREA | 182 
    Enter fullscreen modeExit fullscreen mode

    Tại thời điểm này, bạn đã có mộttập dữ liệu sạch, đã được xác thựcsẵn sàng cho phân tích.

    3.3 Bước 3:
    Thiết kế Lớp Phân tích (Mart)

    Bước cuối cùng là xây dựngLớp Mart, nơi dữ liệu sẵn sàng cho kinh doanh tồn tại.

    Đây là lớp mà các nhà phân tích và bảng điều khiển truy vấn trực tiếp.

    Mỗi tài sản Mart tổng hợp hoặc định hình lại dữ liệu staging thành các tập dữ liệu có ý nghĩa cho báo cáo và phân tích.

    3.3.1 Tài sản:mart.customers_by_country.asset.sql

    Tạo tệp sau:

    touchecommerce/assets/mart/mart.customers_by_country.asset.sql 
    Enter fullscreen modeExit fullscreen mode

    Sau đó định nghĩa tài sản:

    /
    * @bruin name:
    mart.customers_by_country type:
    duckdb.sql materialization:
    type:
    table depends:
    
    - stg.customers @bruin */SELECTcountry,COUNT(*)AStotal_customersFROMstg.customersGROUPBYcountryORDERBYtotal_customersDESC;
    Enter fullscreen modeExit fullscreen mode

    Tài sản SQL này tổng hợp khách hàng theo quốc gia và phụ thuộc vàostg.customers, đảm bảo lớp staging chạy trước.

    Nó được vật chất hóa thành một bảng bên trong DuckDB.

    Chạy nó:

    bruin run ecommerce/assets/mart/mart.customers_by_country.asset.sql 
    Enter fullscreen modeExit fullscreen mode

    Kết quả mong đợi:

    Pipeline: ecommerce_pg_to_duckdb (.) Running mart.customers_by_country ✓ Table materialized successfully in DuckDB 
    Enter fullscreen modeExit fullscreen mode

    Xác minh kết quả:

    bruin query --connection duckdb-default --query"SELECT 
    * FROM mart.customers_by_country LIMIT 5;"
    Enter fullscreen modeExit fullscreen mode

    Kết quả:

    ┌───────────────┬───────────────────┐ │ COUNTRY │ TOTAL_CUSTOMERS │ ├───────────────┼───────────────────┤ │ BRAZIL │ 420 │ │ GERMANY │ 255 │ │ UNITED STATES │ 198 │ │ ARGENTINA │ 190 │ │ SOUTH KOREA │ 182 │ └───────────────┴───────────────────┘ 
    Enter fullscreen modeExit fullscreen mode

    3.3.2 Tài sản:mart.customers_by_age.asset.sql

    Bây giờ, hãy tạo một mart thứ hai để phân nhóm khách hàng theo độ tuổi.

    Tạo tệp:

    touchecommerce/assets/mart/mart.customers_by_age.asset.sql 
    Enter fullscreen modeExit fullscreen mode

    Định nghĩa nó như sau:

    /
    * @bruin name:
    mart.customers_by_age type:
    duckdb.sql materialization:
    type:
    table depends:
    
    - stg.customers @bruin */WITHsrcAS(SELECTCASEWHENage<25THEN'18-24'WHENageBETWEEN25AND34THEN'25-34'WHENageBETWEEN35AND49THEN'35-49'ELSE'50+'ENDASage_groupFROMstg.customers)SELECTage_group,COUNT(*)AStotal_customersFROMsrcGROUPBYage_groupORDERBYtotal_customersDESC;
    Enter fullscreen modeExit fullscreen mode

    Tài sản này tính toán phân phối khách hàng theo nhóm tuổi bằng cách sử dụng biểu thứcCASEđơn giản và tổng hợp kết quả.

    Chạy nó:

    bruin run ecommerce/assets/mart/mart.customers_by_age.asset.sql 
    Enter fullscreen modeExit fullscreen mode

    Kết quả mong đợi:

    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 
    Enter fullscreen modeExit fullscreen mode

    Xác nhận rằng mart đã được điền dữ liệu chính xác:

    bruin query --connection duckdb-default --query"SELECT 
    * FROM mart.customers_by_age;"
    Enter fullscreen modeExit fullscreen mode

    Kết quả:

    ┌─────────────┬───────────────────┐ │ AGE_GROUP │ TOTAL_CUSTOMERS │ ├─────────────┼───────────────────┤ │ 25-34 │ 460 │ │ 35-49 │ 310 │ │ 18-24 │ 250 │ │ 50+ │ 225 │ └─────────────┴───────────────────┘ 
    Enter fullscreen modeExit fullscreen mode

    4. Xem trước toàn bộ luồng dữ liệu

    Hy vọng rằng, nếu tôi hiểu đúng, các khái niệm được giải thích ở phần đầu không quá rối rắm và chúng ta thực sự đã biến pipeline thành hiện thực chỉ bằng cách sử dụng Bruin và một vài truy vấn!

    Pipeline ví dụ của chúng ta trông như thế này:

    graph TD raw.customers --> stg.customers stg.customers --> mart.customers_by_country stg.customers --> mart.customers_by_age 
    Enter fullscreen modeExit fullscreen mode

    Ở giai đoạn này, bạn đã xây dựng mộtpipeline dữ liệu end-to-end hoàn toàn khai báovới Bruin — thu thập, staging và phân tích — tất cả đều được quản lý, xác thực và tái tạo mà không cần bất kỳ lớp điều phối bên ngoài nào.

    5. Tiện ích mở rộng VS Code mạnh mẽ

    Khi tôi lần đầu cài đặtTiện ích mở rộng VS Code của Bruin, tôi không biết mình đang làm gì.

    Lúc đó, tôi không thực sự hiểu cáchBruin— hay thậm chíKỹ thuật Dữ liệu— hoạt động.

    Tôi nhấp xung quanh, thấy một loạt YAML và các điểm đánh dấu siêu dữ liệu, và nhanh chóng bỏ cuộc.

    Một tuần sau, sau khi cuối cùng đã hiểu hệ sinh thái — thu thập, staging, marts và quản trị — tôi quyết định mở lại tiện ích mở rộng, và đó là lúc mọi thứtrở nên rõ ràng.

    Nó không chỉ là một công cụ hỗ trợ.
    Nó làmảnh ghép còn thiếu.

    Tiện ích mở rộng mang đến sức mạnh khai báo tương tự của CLI Bruin vào mộtmôi trường trực quan, thân thiện với nhà phát triển.

    Nó tự động quét các tài sản của bạn, xác thực cấu hình, chạy truy vấn trực tiếp vào cơ sở dữ liệu của bạn và thậm chí quản lý YAML của bạn trong thời gian thực.

    Mọi thứ diễn ra bên trong VS Code — xác thực, khám phá lineage, kiểm tra siêu dữ liệu và xem trước truy vấn.

    Điều gây ấn tượng nhất với tôi là tínhlinh hoạt và mởcủa nó.
    Ở đâykhông có sự ràng buộc nhà cung cấp— nó hoàn toàn mã nguồn mở.

    Bạn có thể fork nó, mở rộng nó hoặc đóng góp lại cho cộng đồng giống như chính CLI.

    Tóm lại, Tiện ích mở rộng VS Code của Bruin không chỉ là một công cụ đồng hành — nó là sự phát triển tự nhiên của quy trình làm việc.
    Một khi bạn hiểu Bruin, công cụ này cảm giác như phép thuật cuối cùng đã được giải thích.

    6. Kết luận

    Đây là lần đầu tiên tôi thực sự cố gắng tìm hiểuBruinvà ý nghĩa thực tế củaData Engineering.
    Những điều từng trừu tượng và phức tạp bắt đầu trở nên dễ hiểu hơn sau khi tách nhỏ vấn đề, thử nghiệm và kết nối các điểm lại từng bước một.

    Quá trình khám phá, thất bại, đọc hiểu và xây dựng lại hóa ra lại là phần giá trị nhất.
    Vẫn còn rất nhiều điều cần học hỏi, nhưng đây là bước đầu vững chắc để thực sự hiểu cách dữ liệu vận hành, biến đổi và kể câu chuyện (giống như bài viết này).

    GitHub Demo:
    E-commerce Pipeline with Bruin

    Bruin Website

    Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!