Data governance ও lineage
এই পাঠে যা শিখবেন
- Data governance-এর ৫টি স্তম্ভ — catalog, lineage, ownership, classification, access
- DataHub, Amundsen, OpenMetadata — কোনটি কখন ব্যবহার করবেন
- Column-level ও table-level lineage কীভাবে capture করবেন (OpenLineage, dbt)
- Bangladesh-এর Data Protection Act-এর আলোকে PII classification ও access policy
১ · Governance কেন দরকার — একটি ব্যাংকের গল্প
ভাবুন একটি বাংলাদেশি ব্যাংক — Eastern Bank PLC। তাদের ৫০০+ টেবিল আছে warehouse-এ। একদিন CFOChief Financial Officerপ্রতিষ্ঠানের সর্বোচ্চ আর্থিক কর্মকর্তা — financial reporting, audit ও regulatory compliance-এর দায়িত্ব। জিজ্ঞেস করলেন — "গত মাসে SME loan disbursement কত?" তিনজন analyst তিনটি ভিন্ন উত্তর দিল — ৪২ কোটি, ৪৭ কোটি, ৩৯ কোটি। কেন?
- একজন
fact_loansথেকে নিয়েছে — শুধু approved। - একজন
loan_disbursements_v2থেকে নিয়েছে — disbursed কিন্তু কিছু rollback miss। - একজন
finance_summary_monthlyথেকে নিয়েছে — fiscal month-এর সংজ্ঞা ভিন্ন।
এটাই data governanceData Governanceপ্রতিষ্ঠানের ডেটাকে শাসন করার নীতি, প্রক্রিয়া ও tool-এর সমষ্টি — quality, security, ownership, compliance নিশ্চিত করতে। শুধু technology নয়, বহুলাংশে process ও culture-এর কাজ।-এর অভাব। প্রতিটি প্রতিষ্ঠান যত বড় হয়, তত বেশি table তৈরি হয়, একই metric-এর একাধিক "version of truth" তৈরি হয়। Governance ছাড়া — analyst-রা পথ হারায়, audit fail হয়, regulator ক্ষুব্ধ হয়।
১) Catalog: "কোথায় কী ডেটা আছে?"
২) Lineage: "এই কলাম কোথা থেকে এলো, কোথায় যাচ্ছে?"
৩) Ownership: "এই table-এর জন্য কে দায়ী?"
৪) Classification: "এটি কি PII? কোন sensitivity tier?"
৫) Access control: "কে read/write করতে পারবে?"
২ · Catalog — ডেটার Google
Data catalog একটি searchable inventory — সব dataset, dashboard, ML model, metric-এর। আপনি যেমন Google-এ "best biriyani in Dhaka" search করেন, তেমনি একজন analyst search করেন "monthly active users" বা "loan default rate"। Catalog তাকে দেখায় — কোন table-এ আছে, কে owner, last update কখন, কতবার query হচ্ছে, এবং sample data।
প্রধান open-source choice:
- DataHub (LinkedIn): সবচেয়ে feature-rich। GraphQL API, fine-grained ACL, real-time updates, ML-feature catalog। বড় enterprise — বিকাশ, Grameenphone-এর মতো।
- Amundsen (Lyft): simple, search-first। দ্রুত deploy, কম maintenance। মাঝারি startup-এর জন্য ভালো।
- OpenMetadata: আধুনিক, schema-driven। Data quality + lineage + catalog একই platform-এ।
- Cloud-native: Unity Catalog (Databricks), DataPlex (GCP), Glue Data Catalog (AWS)।
৩ · Lineage — ডেটার বংশতালিকা
Data lineageData Lineageএকটি ডেটা-উপাদান কোথায় উৎপন্ন, কোন কোন transformation দিয়ে গেছে, এবং কোন কোন consumer (dashboard, model, report) ব্যবহার করছে — তার সম্পূর্ণ যাত্রাপথের রেকর্ড। মানে — একটি ডেটা-উপাদানের জীবনচক্র। একটি transaction PostgreSQL-এ origin → CDC দিয়ে Kafka → Spark transformation → Snowflake fact table → dbt model → Tableau dashboard → CFO-এর iPad। এই পুরো পথটা lineage।
দুই ধরনের lineage:
- Table-level: "এই table কোন কোন source থেকে তৈরি?" — মোটামুটি সহজ, dbt automatic দেয়।
- Column-level: "
fact_orders.total_amountকোন column থেকে compute হয়?" — গভীর, SQL parse করতে হয়। OpenLineage বা SQLLineage library।
Lineage-এর use case:
- Impact analysis: "
customer_emailcolumn drop করতে চাই — কোন কোন downstream report ভাঙবে?" - Root cause: "Dashboard-এ revenue ভুল — কোন upstream pipeline-এ bug?"
- Compliance: "এই PII column কোন কোন report-এ ছড়িয়েছে?" — GDPR/DPA delete request-এর জন্য।
- Cost: "এই expensive transformation-এর output আসলে কোথাও ব্যবহৃত হচ্ছে কি?"
৪ · Ownership ও stewardship
প্রতিটি dataset-এর একজন মানুষ থাকতে হবে — যিনি দায়ী। দু'টি ভূমিকা পার্থক্য করুন:
- Data owner: ব্যবসায়িক দায়িত্ব। সাধারণত VP, head of product, finance manager। "এই ডেটার মান কেমন হবে, কে access পাবে — সিদ্ধান্ত নিই।"
- Data steward: technical দায়িত্ব। সাধারণত data engineer, analytics engineer। "schema maintain করি, quality test লিখি, broken pipeline fix করি।"
একটি ব্যর্থতার কালচার — "এই table-এর কোনো owner নেই" — production-এ everyone-এর সমস্যা। Catalog-এ প্রতিটি dataset-এর owner ফিল্ড mandatory করুন।
৫ · Classification ও PII
ডেটাকে sensitivity tierSensitivity Tierডেটার গোপনীয়তা ও সংবেদনশীলতা অনুসারে শ্রেণীবিন্যাস — সাধারণত Public, Internal, Confidential, Restricted। প্রতিটি tier-এ আলাদা access ও handling নিয়ম।-এ ভাগ করতে হবে। সাধারণ ৪-tier model:
- Public: press release, public website data — যে কেউ দেখতে পারে।
- Internal: aggregated metrics, employee-only — কর্মচারীরা দেখতে পারে।
- Confidential: customer email, transaction history — শুধু authorized team।
- Restricted (PII/PHI): NID, account number, biometric — শুধু minimum-needed কর্মী, সব access logged।
Bangladesh-এ PII (Personally Identifiable Information):
- NID number, passport number
- Mobile number, email
- Bank account, MFS (bKash/Nagad) wallet
- Bio-metric fingerprint (এখন বহু সরকারি service-এ)
- Address, geo-location
৬ · Access control — RBAC থেকে ABAC
RBAC (Role-Based Access Control): "Analyst role → marketing schema-এ read access।" সহজ, scalable।
ABAC (Attribute-Based): "User-এর department=finance এবং data classification ≤ confidential হলে read।" Fine-grained কিন্তু complex।
Production pattern:
- Column masking:
SELECT *-এ NID auto-redacted হবে non-privileged user-এর জন্য। - Row-level security: Branch manager শুধু নিজের branch-এর rows দেখবেন।
- Just-in-time access: একজন engineer ৪ ঘণ্টার জন্য prod access চাইবেন — Slack approval দিয়ে — তারপর auto-revoke।
- Audit log: "X user Y time-এ Z table query করেছে" — Bangladesh Bank সব scheduled bank-কে এই log কয়েক বছর রাখতে বলে।
৭ · Lineage capture — OpenLineage ও dbt
OpenLineage একটি open standard — pipeline run করার সময় lineage event emit করে। Airflow, Spark, dbt — সবার integration আছে। নিচের YAML একটি Airflow DAG-কে OpenLineage-এ wired করে।
# airflow.cfg or env vars
[openlineage]
transport = '{"type": "http", "url": "http://datahub:8080/openlineage/api/v1"}'
namespace = ebl-bank-prod
# DAG অটোমেটিকভাবে lineage emit করবে
# fact_loans → dim_branch + dim_customer + raw_loan_app
# ↓
# sql parse → column-level edges
openlineage-airflow provider built-in। DAG-এর প্রতিটি SQL operator-এর input/output table parse করে DataHub-এ পাঠায়। আপনাকে কোড লিখতে হয় না — শুধু config।
dbt-এর built-in lineage: dbt docs generate চালালে — আপনার models-এর full graph তৈরি হয়। প্রতিটি model-এর ref() ও source() থেকে edge তৈরি।
-- models/marts/fact_loans.sql
{{
config(
materialized='table',
meta={
'owner': 'risk-analytics@ebl.com.bd',
'pii': 'restricted',
'sensitivity': 'confidential',
'retention_days': 2555 -- 7 years per BB regulation
}
)
}}
SELECT
l.loan_id,
-- NID column masked except for compliance role
CASE
WHEN is_role_member('compliance_officer')
THEN c.nid
ELSE 'XXX-XXX-' || RIGHT(c.nid, 4)
END AS customer_nid,
l.disbursed_amount,
l.disbursed_at,
b.branch_name
FROM {{ ref('stg_loans') }} l
JOIN {{ ref('dim_customers') }} c USING (customer_id)
JOIN {{ ref('dim_branches') }} b USING (branch_id)
meta block-এর সবকিছু DataHub-এ harvested হবে — owner, PII tag, retention। ref() থেকে automatic lineage। NID column conditional masking — privileged role ছাড়া কেউ পুরো NID দেখবে না।
৮ · Bangladesh-এর regulatory landscape
Bangladesh Bank — IT Risk Management Guidelines (২০১৮, updated):
- সব scheduled ব্যাংকের ডেটা Bangladesh-এ primary copy থাকতে হবে (data localization)।
- ৭ বছর transaction record retention বাধ্যতামূলক।
- Quarterly access-log audit, annual penetration test।
- Cross-border data transfer-এ BB-এর written approval।
NBR (National Board of Revenue):
- VAT/Tax-relevant data ৫ বছর immutable রাখতে হবে।
- Audit-এ lineage produce করতে হবে — "এই revenue figure কোন source থেকে এলো?"
BTRC (Telecom Regulatory):
- Telecom operators (Grameenphone, Robi, Banglalink) — call data record (CDR) ১৮০ দিন রাখতে হবে।
- Lawful intercept request-এ ২৪ ঘণ্টার মধ্যে সাড়া দিতে হবে।
৯ · DataHub সেট আপ — quick start
# Python 3.9+ ও Docker দরকার
pip install --upgrade acryl-datahub
datahub docker quickstart
# UI: http://localhost:9002
# admin / admin দিয়ে login
# Snowflake থেকে metadata ingest
datahub ingest -c snowflake_recipe.yml
# snowflake_recipe.yml
source:
type: snowflake
config:
account_id: xy12345.ap-southeast-1
username: datahub_reader
password: ${SNOWFLAKE_PWD}
warehouse: META_WH
role: DATAHUB_ROLE
include_tables: true
include_views: true
include_table_lineage: true
include_column_lineage: true
profiling:
enabled: true
profile_table_size_limit: 5
sink:
type: datahub-rest
config:
server: http://localhost:8080
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ আপনি bKash-এ data engineer। একজন user "right to be forgotten" exercise করেন — তার সব data delete চান। DPA ২০২৩-এর ৩০ দিনের requirement। কীভাবে confident হবেন যে সব trace মুছে গেছে?
এটি একটি classic governance challenge — এবং কেন catalog + lineage early-stage থেকে দরকার তার সবচেয়ে শক্তিশালী যুক্তি। bKash-এর ৭০+ million user, প্রতিদিন কয়েক কোটি transaction। একজন user-এর data কোথায় কোথায় ছড়িয়ে আছে তা manually trace করা impossible।
ধাপে ধাপে workflow:
- Step 1 — Identity resolution: User-এর primary key (user_id, mobile_number, NID) থেকে শুরু। Master Data Management (MDM) থেকে সব alias collect — তিনি কখনও আলাদা mobile-এ register হয়েছেন কিনা।
- Step 2 — Catalog query: DataHub-এ "PII tag = restricted AND classification contains user_data" — সব downstream dataset list।
- Step 3 — Lineage walk: Source tables (raw_users, raw_transactions) থেকে শুরু করে — column-level lineage walk। কোন কোন aggregation, dimension, mart-এ এই user-এর row আছে।
- Step 4 — Selective vs cascading delete: Aggregated fact-এ — pure delete না, recompute। যেমন
fact_daily_revenue-এ এই user-এর contribution বিয়োগ করতে হবে। - Step 5 — Backup ও cold storage: S3 Glacier-এ ২ বছরের archive আছে — সেগুলোতেও tombstone marker। Restore-এর সময় auto-skip।
- Step 6 — Logs: Application log, Kafka retention, ML feature store — সব check।
- Step 7 — Audit certificate: User-কে delete confirmation pdf — কোন কোন system-এ মুছেছে, কোন hash ছিল।
Practical reality: ১০০% delete কখনও সম্ভব নয় — কারণ:
- Bangladesh Bank ৭ বছর AML transaction record রাখতে বলে — legal hold।
- NBR audit-এর জন্য VAT-related data ৫ বছর।
- এই cases-এ — pseudonymization (NID hash, name → "DELETED USER #abc123") করা হয়, full delete নয়।
মূল উপলব্ধি: Privacy compliance শুধু engineering নয় — legal + product + ops-এর সমন্বয়। কিন্তু engineering-এর হাতে প্রধান tool — catalog + lineage + automated deletion pipeline। এই foundation না থাকলে কোম্পানি আদালতে দাঁড়াতে পারবে না — "আমরা চেষ্টা করেছি" বলা যথেষ্ট নয়, evidence trail চাই।
প্র ০২ একটি ৫০-জনের data team-এ DataHub না Amundsen না OpenMetadata? কোনটি কখন? Trade-off কী?
এই decision একটি startup-এর জন্য non-trivial — কারণ migration painful। ৬-১২ মাস পর regret করলে অনেক metadata + customization হারাবেন।
DataHub (LinkedIn, ২০১৯):
- Strengths: Real-time event-based architecture (Kafka backbone), column-level lineage শক্তিশালী, ML feature catalog, fine-grained RBAC, GraphQL API, plugin-rich ecosystem।
- Weaknesses: Heavy infrastructure — Kafka + Elasticsearch + Postgres + Neo4j-like graph; বিশাল team না হলে maintenance burden। UI কিছুটা cluttered।
- Best fit: ৫০+ data team, ১,০০০+ tables, complex compliance need (banking, healthcare)। Acryl-এর managed offering আছে।
Amundsen (Lyft, ২০১৯):
- Strengths: Search-first UX, simple stack (Elasticsearch + Neo4j + Atlas-light), দ্রুত deploy। PageRank-based ranking — popular tables search-এ আগে।
- Weaknesses: Lineage limited (table-level mostly), ownership/PII workflow basic, plugin ecosystem ছোট, development pace ধীর।
- Best fit: মাঝারি startup (১০-৫০ data engineer), যেখানে "search" main pain-point।
OpenMetadata (Collate, ২০২১):
- Strengths: Modern schema-driven design, data quality + catalog + lineage একই platform, glossary শক্তিশালী, fastest-growing community ২০২৪-এ।
- Weaknesses: তুলনায় young, edge case-এ documentation পাতলা, scaling কিছু large enterprise-এ চ্যালেঞ্জ।
- Best fit: Greenfield project, সব pillar একই platform চান, modern API চান।
বাংলাদেশ context-এ recommendation:
- bKash, Robi-এর মতো বড়: DataHub — compliance-heavy, audit trail important।
- Daraz, Pathao-এর মতো মাঝারি: OpenMetadata — quality + catalog + glossary unified।
- ৫০-জনের startup: Amundsen — দ্রুত value, কম maintenance। বা সরাসরি cloud (Unity Catalog যদি Databricks)।
Decision framework:
- ৩ থেকে ৬ মাসের MVP চাই → Amundsen।
- Strict regulatory compliance চাই → DataHub।
- Data quality unified চাই → OpenMetadata।
- Cloud-only ও single-vendor → Unity Catalog (Databricks) বা DataPlex (GCP)।
মূল কথা: "Best tool" নেই — context, team size, budget, vendor lock-in tolerance বিবেচ্য। যেকোনোটাই none-এর চেয়ে infinitely ভালো।
প্র ০৩ "Lineage automatically capture হবে" — promise কিন্তু practice-এ ৪০% pipeline missed। কেন? কীভাবে gap কম করবেন?
এটি real production pain — সব catalog vendor ও open-source maintainer-ই স্বীকার করেন। Lineage coverage ১০০% achieve করা অসম্ভব, কিন্তু ৬০% থেকে ৯৫%-এ আনা যায়।
কেন lineage miss হয়:
- Dynamic SQL:
EXEC('CREATE TABLE ' || @table_name)— parser বুঝতে পারে না। - Stored procedures: SQL Server, Oracle-এ procedural logic — DataHub-এর parser limited।
- Pandas/Python transformations:
df.merge(df2)— কোন framework hook করবে? - Shell scripts:
aws s3 cp,gsutilbased pipelines — invisible। - BI tool internal logic: Tableau-এর custom calculation, PowerBI-এর DAX measure।
- External APIs: Salesforce, HubSpot থেকে data — third-party।
- Streaming: Kafka topic → Flink → another topic — instrumentation কম।
Coverage বাড়ানোর strategies:
- (১) Standardize on dbt: Pandas/SQL script-এর বদলে — সব transformation dbt model হিসেবে। Free lineage automatic।
- (২) OpenLineage-এর Marquez collector: Airflow, Spark, Flink — সব OpenLineage spec follow করুক। One protocol → all backends।
- (৩) Manual lineage assertion: যা automate হয় না — manual edge add API দিয়ে। আমার team-এ "lineage debt board" — quarterly cleanup।
- (৪) Query log harvesting: Snowflake, BigQuery-এর audit log থেকে actual SQL parse। Even ad-hoc query lineage capture।
- (৫) Wrap external systems: Tableau-এর REST API → custom DataHub plugin। PowerBI-এর XMLA endpoint।
Cultural fix — যা tool-এর চেয়ে important:
- "No lineage = no merge" — PR review-এ catalog check। dbt PR-এ
ref()না থাকলে block। - Quarterly "lineage hygiene" sprint — orphan node, missing owner হ্যান্ডল।
- Onboarding-এ catalog usage বাধ্যতামূলক — প্রতিটি নতুন engineer দিন-১-এ catalog ভিজিট।
- Slack bot — "Hey, you queried
raw_orders৫০ বার, কিন্তু এতে কোনো owner set নেই। কে set করবেন?"
Realistic targets:
- Year 1: ৬০% table-level coverage।
- Year 2: ৮৫% table-level, ৫০% column-level।
- Year 3+: ৯৫% table-level, ৭৫% column-level।
- ১০০% — myth। শেষ ৫% always edge case।
মূল কথা: Lineage একটি journey, not a checkbox। Tool half-battle, culture other half। যে team lineage-কে engineering excellence-এর অংশ ভাবে — তারা successful।
প্র ০৪ আপনি Eastern Bank-এ Chief Data Officer। Bangladesh Bank quarterly audit — আপনার প্রস্তুতি কী হবে? প্রমাণ কী দেখাবেন?
BB inspection — scheduled ব্যাংকের জন্য most stressful event। Failure মানে administrative penalty, license risk। এটি শুধু technical exercise না — board-level visibility।
প্রস্তুতির ৬ pillar:
(১) Data localization proof:
- Catalog-এ প্রতিটি critical dataset-এর "primary location: BD-DC1" tag।
- Cloud usage থাকলে — region locked to
ap-south-1বা onshore data center। - Architecture diagram: কোন data কোথায় rest, কোথায় in-transit।
(২) Access audit log:
- Snowflake/Postgres query log — last ৪ quarters।
- "Who accessed customer NID column past quarter?" — DataHub query → list।
- Anomaly report: midnight access, weekend bulk export, ex-employee account।
- BB-এর recent guideline — privileged user-এর session recording (specifically on prod DBs)।
(৩) Retention compliance:
- প্রতিটি transaction table-এ retention policy attached — ৭ বছর AML, ৫ বছর VAT, ১০ বছর loan record।
- Automated archival job log: "deleted N records older than X" — daily report।
- Legal hold register — চলমান cases-এ যা delete হবে না।
(৪) PII handling:
- Catalog-এ ১০০% PII column tagged।
- Masking policy enforced — non-compliance role-এ NID দেখাবে না (live demo BB officer-এর সামনে)।
- Encryption at rest (AES-256) ও in transit (TLS 1.3) — KMS key rotation log।
- Data sharing agreement — third-party (credit bureau, NBR e-TIN check) — formal contract।
(৫) Incident response:
- Past quarter-এর সব data-related incident (breach, leak, bug) — log ও remediation।
- Tabletop exercise simulation — "যদি ০৫,০০০ customer-এর data leak হয়?" — playbook।
- Reporting timeline — BB-কে ২৪ ঘণ্টার মধ্যে notify।
(৬) Lineage proof:
- Auditor random pick — "এই quarterly Capital Adequacy report-এর numerator কোথা থেকে?" → DataHub graph দেখাবে: source ledger → fact_capital → mart_basel3 → report।
- Calculation correctness — code review trail, deployment log, change history।
Documentation:
- Data Governance Policy document — board-approved, annually reviewed।
- RACI matrix — কে owner, কে steward, কে approver।
- Org chart — DPO (Data Protection Officer), CISO, CDO-এর reporting line।
Soft factors:
- Past audit feedback-এ raised issue — সব closed status with evidence।
- Training certificate — সব data engineer compliance training (annual)।
- Vendor due diligence — cloud provider, ETL vendor — তাদের SOC 2/ISO 27001।
মূল কথা: Audit pass হয় paperwork-এ না — actual evidence-এ। Catalog + lineage + log + automated policy enforcement থাকলে — ১ ঘণ্টায় BB officer-এর প্রতিটি প্রশ্নের উত্তর। না থাকলে — ২ সপ্তাহের scrambling, এবং finding শেষ পর্যন্ত। যিনি governance-কে compliance-এর কাজ ভেবে underestimate করেন — তিনিই সবচেয়ে বড় failure।
অনুশীলন
-
PII tagging: নিচের ৬টি column-এর জন্য sensitivity tier ঠিক করুন (Public / Internal / Confidential / Restricted):
customer_emailorder_total_amount_aggregated_monthlycustomer_nidproduct_nameemployee_salarycustomer_geo_lat_long
customer_email→ Confidential (PII, কিন্তু DPA-তে regulated identity)order_total_amount_aggregated_monthly→ Internal (aggregated, individual-level নয়)customer_nid→ Restricted (national identity, highest tier)product_name→ Public (catalog-এ public)employee_salary→ Confidential (HR-sensitive)customer_geo_lat_long→ Restricted (location traceable; specific point sensitive)
-
dbt model লিখুন: Daraz-এর জন্য একটি
fact_ordersdbt model লিখুন — meta block-এ owner, PII level, retention দিন। Customer email column conditional masking করুন।-- models/marts/fact_orders.sql {{ config( materialized='incremental', unique_key='order_id', meta={ 'owner': 'commerce-analytics@daraz.com.bd', 'pii_level': 'confidential', 'retention_days': 1825, 'description': 'Daraz orders fact — incremental daily.' } ) }} SELECT o.order_id, o.customer_id, CASE WHEN current_role() IN ('analytics_admin','support_l3') THEN c.email ELSE REGEXP_REPLACE(c.email, '(.{2})(.*)(@.*)', '\\1***\\3') END AS customer_email_masked, o.order_total_bdt, o.placed_at, o.status FROM {{ ref('stg_orders') }} o JOIN {{ ref('dim_customers') }} c USING (customer_id) {% if is_incremental() %} WHERE o.placed_at > (SELECT MAX(placed_at) FROM {{ this }}) {% endif %} -
Lineage walk: আপনার warehouse-এ
raw_paymentscolumn drop করতে চান। কোন কোন artifact check করবেন lineage থেকে?Catalog-এ
raw_paymentsখুলে — "downstream" tab:- Direct downstream tables: stg_payments, fact_transactions।
- Indirect (২+ hop): mart_revenue_daily, mart_cohort_retention।
- Dashboards: Tableau "Daily Revenue", Looker "Cohort Analysis"।
- ML features: feature store-এর
user_lifetime_value_v3। - Reports: Quarterly investor deck, BB regulatory report।
- Action items: প্রতিটি downstream owner-কে notify, ২ sprint-এর migration window, deprecation flag set।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পাঠ ২৭ · Cost optimization কৌশল পরবর্তী পাঠ Catalog ও lineage-এর পর — খরচ কমান। FinOps practices।
- পাঠ ২৫ · Data quality testing আগের পাঠ Quality + governance যমজ। একটি ছাড়া অপরটি অর্থহীন।
- পাঠ ১৫ · dbt — analytics engineering এই পাঠের সাথে সম্পর্কিত dbt-এর meta + ref() থেকেই lineage automatic আসে।
- সব AI Courses দেখুন ABCL TECH Python, ML, DL, NLP, CV, GenAI, RL, MLOps — সব AI কোর্স একসাথে।