मुख्य सामग्री पर जाएँ

dbt-utils पैकेज का परिचय

जानें कि dbt-utils प्री-बिल्ट मैक्रोज़, प्रमुख फीचर्स और व्यावहारिक उपयोग मामलों के साथ dbt को कैसे बेहतर बनाता है। हमारे चरण-दर-चरण गाइड के साथ अपने डेटा ट्रांसफॉर्मेशन को सरल बनाएं।
Austin Chia
Austin Chia

अपना निःशुल्क खाता बनाएँ

अभ्यास और ट्रैक अपनी प्रगति को।

Google के साथ जारी रखेंजारी रखकर, आप हमारी उपयोग की शर्तें, हमारी गोपनीयता नीति को स्वीकार करते हैं और यह भी कि आपका डेटा USA में संग्रहीत है।

dbt-utils पैकेज एक शक्तिशाली टूलकिट है जो आपके डेटा ट्रांसफॉर्मेशन प्रोसेस को सरल और बेहतर बनाता है। इस गाइड में, हम आपको dbt-utils से परिचित कराएँगे और दिखाएँगे कि सामान्य SQL ऑपरेशंस के लिए इसके प्री-बिल्ट मैक्रोज़ कैसे आपके वर्कफ़्लो को सुव्यवस्थित कर सकते हैं।

dbt-utils क्या है?

dbt-utils पैकेज

dbt-utils, dbt में एक पैकेज है जो प्री-बिल्ट मैक्रोज़ का टूलकिट प्रदान करता है और dbt प्रोजेक्ट्स की कार्यक्षमता बढ़ाता है। dbt-utils एब्स्ट्रैक्शन की लेयर जोड़कर जटिलता को कम करता है, जिससे डेटा ट्रांसफॉर्मेशन अधिक कुशल और सुसंगत हो जाता है।

यदि आप Python की लाइब्रेरी और R में पैकेज से परिचित हैं, तो dbt-utils पैकेज कुछ वैसा ही है।

सामान्य Structured Query Language (SQL) ऑपरेशंस के लिए इन मानकीकृत मैक्रोज़ के साथ, dbt-utils यह सुनिश्चित करता है कि सभी ट्रांसफॉर्मेशन को शुरू से कोड करने का कठिन काम आवश्यक न रहे।

इन यूटिलिटीज़ का लाभ उठाकर आप समुदाय-द्वारा परखे गए मैक्रोज़ के सूट को अपने प्रोजेक्ट्स में एकीकृत करते हैं, जिससे मेन्टेनेबिलिटी बढ़ती है और सर्वोत्तम प्रथाओं की संस्कृति को बढ़ावा मिलता है।

मुख्य फीचर्स और कार्यक्षमताएँ

dbt-utils कई ऐसे फीचर्स और कार्यक्षमताएँ देता है जो डेटा ट्रांसफॉर्मेशन को अधिक कुशल और सुव्यवस्थित बनाते हैं। इनमें शामिल हैं:

1. मानकीकृत मैक्रोज़

dbt-utils Jinja टेम्पलेटिंग के ज़रिए सामान्य SQL ऑपरेशंस, जैसे जोइन्स, एग्रीगेशन, फ़िल्टरिंग, आदि के लिए प्री-बिल्ट मैक्रोज़ की एक विस्तृत श्रृंखला प्रदान करता है।

ये मैक्रोज़ प्रोजेक्ट्स में स्थिरता सुनिश्चित करने और दोहरावदार कोडिंग की आवश्यकता को कम करने के लिए मानकीकृत किए गए हैं।

उदाहरण के लिए, यहाँ कुछ मैक्रोज़ हैं जिनका उपयोग एनालिटिक्स इंजीनियर करते हैं:

  • date_spine: दो निर्दिष्ट तिथियों के बीच निरंतर तारीख़ों का अनुक्रम बनाता है, जो टाइम-सीरीज़ विश्लेषण के लिए उपयोगी है।
  • pivot: पंक्तियों को गतिशील रूप से स्तंभों में बदलता है, जिससे क्रॉस-टैब ऑपरेशंस सरल हो जाते हैं।
  • star: मॉडल में निर्दिष्ट टेबल्स से सभी फ़ील्ड्स प्राप्त करता है, except आर्ग्युमेंट में दिए गए फ़ील्ड्स को छोड़कर।
  • union_relations: समान संरचना वाले कई रिलेशंस के डेटा को union all के साथ संयोजित करता है।
  • generate_series: संख्यात्मक डेटा की एक श्रृंखला बनाता है, जो टाइम-सीरीज़ विश्लेषण के लिए सहायक है।
  • surrogate_key: कई फ़ील्ड्स को जोड़कर पंक्तियों के लिए एक यूनिक आइडेंटिफ़ायर बनाता है।

इन मैक्रोज़ के साथ, SQL वे कार्य पूरा कर सकता है जो अन्यथा जटिल और दोहरावदार होते।

2. स्कीमा और डाक्यूमेंटेशन सहायता

dbt-utils डेटा मॉडल्स के भीतर स्कीमा और डाक्यूमेंटेशन प्रबंधन के लिए उपयोगी टूल्स प्रदान करता है। इससे बदलावों पर नज़र रखना और प्रोजेक्ट्स में संगठन बनाए रखना आसान हो जाता है।

4. टेस्टिंग क्षमताएँ

dbt-utils के साथ, उपयोगकर्ता आसानी से टेस्ट लिख सकते हैं ताकि उनके डेटा ट्रांसफॉर्मेशन की शुद्धता और गुणवत्ता सुनिश्चित हो सके। ये टेस्ट स्वचालित किए जा सकते हैं और कंटीन्युअस इंटीग्रेशन प्रोसेस में एकीकृत किए जा सकते हैं, जिससे डेटा पाइपलाइंस अधिक कुशल और भरोसेमंद बनती हैं।

dbt-utils का उपयोग क्यों करें?

तो, इस पैकेज का उपयोग क्यों करें?

पहले इसके कुछ फ़ायदों पर नज़र डालते हैं:

  1. जटिल SQL को सरल बनाना: मैक्रोज़ के उपयोग से dbt-utils जटिल SQL क्वेरीज लिखना आसान बनाता है। इससे डेटा एनालिस्ट्स और इंजीनियर्स का समय और मेहनत बचती है, ताकि वे कोड में उलझने के बजाय उच्च-स्तरीय विश्लेषण पर ध्यान दे सकें।
  2. कुशल डाक्यूमेंटेशन: जैसा पहले बताया गया, dbt-utils डाक्यूमेंटेशन को स्वतः जनरेट करने में मदद कर सकता है।
  3. क्वालिटी कंट्रोल में वृद्धि: डेटा पाइपलाइंस में टेस्टिंग क्षमताएँ जोड़कर, dbt-utils डेटा ट्रांसफॉर्मेशन की सटीकता और विश्वसनीयता सुनिश्चित करने में मदद करता है।
  4. स्वचालित डेटा वैलिडेशन: dbt-utils के साथ, डेटा वैलिडेशन को स्वचालित किया जा सकता है और डेवलपमेंट प्रक्रिया में एकीकृत किया जा सकता है। इससे डेटा मॉडलों में किए गए किसी भी बदलाव की तुरंत वैलिडेशन हो जाती है और संभावित समस्याएँ शुरुआती चरण में पकड़ में आ जाती हैं।
  5. ओपन-सोर्स: dbt-utils ओपन सोर्स है, इसलिए कई डेवलपर्स इस पैकेज के विकास में योगदान कर सकते हैं। इसका अर्थ है कि पैकेज लगातार अपडेट होता रहेगा।

dbt-utils इंस्टॉलेशन और सेटअप

नीचे देखते हैं कि dbt-utils पैकेज को आपके डेटा वर्कफ़्लो में कैसे जोड़ा जा सकता है।

पूर्वापेक्षाएँ

dbt-utils का उपयोग करने से पहले, SQL से परिचित होना और dbt (data build tool) की बुनियादी समझ आवश्यक है। आपके पास पहले से एक इनिशियलाइज़ और कॉन्फ़िगर किया हुआ dbt प्रोजेक्ट होना चाहिए।

यदि आपको रिफ़्रेशर चाहिए, तो आप हमारा Introduction to dbt कोर्स और dbt ट्यूटोरियल देख सकते हैं।

इसके अलावा, आपके dbt core और dbt-utils पैकेज के बीच वर्ज़न का स्पष्ट संरेखण आवश्यक है। कॉन्फ्लिक्ट्स या डिप्रिकेटेड कार्यक्षमताओं से बचने के लिए dbt वर्ज़न्स के बीच कम्पैटिबिलिटी की जाँच करना उचित है।

चरण-दर-चरण इंस्टॉलेशन

dbt-utils को अपने डेटा स्टैक में एकीकृत करना शुरू करने के लिए, पहले सुनिश्चित करें कि आपका डेवलपमेंट एनवायरनमेंट ठीक से सेटअप है।

चरण 1: dbt इंस्टॉल करें

पहले सुनिश्चित करें कि आपके एनवायरनमेंट में dbt इंस्टॉल है। आप pip के ज़रिए dbt इंस्टॉल कर सकते हैं:

pip install dbt

चरण 2: अपने dbt प्रोजेक्ट में dbt-utils जोड़ें

dbt-utils इंस्टॉल करने के लिए, अपने dbt प्रोजेक्ट की रूट डायरेक्टरी में packages.yml फ़ाइल में निम्नलिखित जोड़ें।

यदि यह फ़ाइल मौजूद नहीं है, तो इसे अपने dbt प्रोजेक्ट रूट में बनाएँ और निम्नलिखित जोड़ें:

packages:
- package: dbt-labs/dbt_utils
version: "1.1.1" # Use the latest version compatible with your dbt version

इस yaml फ़ाइल में, आप आवश्यक पैकेज वर्ज़न भी निर्दिष्ट करेंगे। सुनिश्चित करें कि आप अपने इंस्टॉल्ड dbt वर्ज़न के साथ कम्पैटिबल नवीनतम वर्ज़न का उपयोग करें।

चरण 3: पैकेज इंस्टॉल करें

संशोधन के बाद, इंस्टॉलेशन केवल एक सरल कमांड दूर है।

इस कमांड के सफल निष्पादन से dbt-utils फ़ेच और इंस्टॉल हो जाएगा, और आप उन्नत कार्यक्षमता के लिए तैयार होंगे।

अपने dbt प्रोजेक्ट डायरेक्टरी के भीतर टर्मिनल में निम्न कमांड चलाएँ:

dbt deps

यह कमांड आपकी packages.yml में सूचीबद्ध सभी पैकेज इंस्टॉल करता है।

dbt-utils की प्रमुख यूटिलिटीज़ और उनके अनुप्रयोग

dbt-utils पैकेज dbt प्रोजेक्ट्स के भीतर SQL ट्रांसफॉर्मेशन को सुव्यवस्थित करने वाली सामान्य सहायक फ़ंक्शंस का एक सूट प्रदान करता है।

ये फ़ंक्शंस डेवलपर्स को दोहराव से बचने और अपनी विशिष्ट बिज़नेस लॉजिक पर ध्यान केंद्रित करने में मदद करते हैं।

यहाँ dbt-utils के कुछ फ़ंक्शंस हैं:

1. SQL जेनरेटर्स

dbt-utils में SQL जेनरेटर्स मॉड्यूलर SQL कोड बनाने के लिए उपयोगी हैं।

उदाहरण के लिए, deduplicate मैक्रोज़ डुप्लिकेट पंक्तियों को हटाने के लिए उत्कृष्ट हैं, जबकि डेटा के क्रम को बनाए रखते हैं। डुप्लिकेट्स को मॉडलों, टेबलों और यहाँ तक कि Common Table Expressions (CTEs) से भी हटाया जा सकता है।

2. जेनेरिक टेस्ट्स

जेनेरिक टेस्ट्स का उपयोग टेबल या व्यू में डेटा को वैलिडेट करने के लिए किया जाता है। इन्हें आसानी से विशिष्ट आवश्यकताओं के अनुरूप कस्टमाइज़ किया जा सकता है और प्रोसेस किए जा रहे डेटा की गुणवत्ता पर मूल्यवान अंतर्दृष्टि प्रदान करते हैं।

उदाहरण के लिए, expression_is_true मैक्रो जाँचता है कि कोई निश्चित एक्सप्रेशन true है या नहीं। इसे कई शर्तों की पुष्टि के लिए लचीले ढंग से प्रयोग किया जा सकता है, जैसे:

  • कॉलम की लंबाई
  • किसी विशिष्ट बुनियादी बीजगणितीय ऑपरेशन का आउटपुट

3. Jinja हेल्पर्स

Jinja हेल्पर्स ऐसे डायनेमिक SQL क्वेरीज बनाने में उपयोगी हैं जिन्हें यूज़र इनपुट या वेरिएबल डेटा के आधार पर आसानी से कस्टमाइज़ किया जा सके। ये SQL स्टेटमेंट्स के भीतर कंडीशनल लॉजिक और लूपिंग की अनुमति देते हैं।

Jinja टेम्पलेट्स इन मैक्रोज़ को परिभाषित और निर्दिष्ट करने के लिए उपयोग किए जाते हैं।

एक उदाहरण pretty_time मैक्रो है, जो वर्तमान टाइमस्टैम्प की स्ट्रिंग लौटाता है।

4. वेब मैक्रोज़

वेब मैक्रोज़ Jinja हेल्पर्स के समान होते हैं, लेकिन विशेष रूप से वेब-आधारित प्रोजेक्ट्स के लिए डिज़ाइन किए गए हैं। ये डायनेमिक HTML जेनरेशन और मैनिप्युलेशन की सुविधा देते हैं, जिससे इंटरैक्टिव और रिस्पॉन्सिव वेब पेज बनाना आसान हो जाता है।

एक उपयोगी मैक्रो get_url_path है, जो URL का पेज पाथ प्राप्त करता है। इसका सिंटैक्स इस प्रकार दिखता है:

{{ dbt_utils.get_url_path(field='page_url') }}

5. इंट्रोस्पेक्टिव मैक्रोज़

इंट्रोस्पेक्टिव मैक्रोज़ वे मैक्रोज़ हैं जो वर्तमान स्कोप के भीतर डेटा तक पहुँच और मैनिप्युलेशन कर सकते हैं। यह डायनेमिक और कुशल डेटा प्रोसेसिंग की अनुमति देता है, जिससे अतिरिक्त फ़ंक्शंस या कोड की आवश्यकता कम हो जाती है।

एक उदाहरण get_column_values मैक्रो है, जो क्वेरी के परिणामों को एक ऑब्जेक्ट के रूप में लौटाता है।

dbt utils के व्यावहारिक उपयोग के मामले

उपयोग मामला 1: जटिल क्वेरीज को सरल बनाना

उदाहरण परिदृश्य: किसी कंपनी के पास ग्राहक जानकारी, ट्रांज़ैक्शन डेटा और प्रोडक्ट डेटा वाला बड़ा डेटासेट है। उन्हें पिछले क्वार्टर में प्रत्येक प्रोडक्ट श्रेणी के कुल बिक्री दिखाने वाली एक रिपोर्ट बनानी है।

कई टेबल्स को जॉइन करने और प्रत्येक श्रेणी की बिक्री की गणना करने के लिए जटिल SQL क्वेरीज लिखने के बजाय, वे dbt utils का उपयोग करके संबंधित डेटा को आसानी से एक्सट्रैक्ट कर सकते हैं और अपने मैक्रोज़ या मॉडलों के भीतर उसका मैनिप्युलेशन कर सकते हैं।

उदाहरण के लिए, वे get_filtered_columns_in_relation का उपयोग करके केवल प्रोडक्ट डेटा से संबंधित आवश्यक कॉलम फ़िल्टर कर सकते हैं और फिर प्रत्येक श्रेणी की कुल बिक्री की गणना के लिए sum मैक्रो का उपयोग कर सकते हैं।

यह प्रक्रिया को सरल और अधिक कुशल बनाता है, समय बचाता है और त्रुटियों को कम करता है।

कोड इम्प्लीमेंटेशन:

इस समाधान को एक मॉक डेटाबेस में लागू करने के लिए, आप निम्न चरणों का पालन कर सकते हैं:

प्रोडक्ट डेटा से केवल आवश्यक कॉलम फ़िल्टर करने के लिए get_filtered_columns_in_relation मैक्रो का उपयोग करें। यह मैक्रो आपको प्रासंगिक कॉलम को कुशलतापूर्वक चुनने में मदद करेगा।

-- models/product_data_filtered.sql
with product_data as (
select
{{ dbt_utils.get_filtered_columns_in_relation(
relation=ref('products'),
include=['product_id', 'category']
) }}
from {{ ref('products') }}
)
select * from product_data

इसके बाद, प्रोडक्ट, ट्रांज़ैक्शन और कस्टमर डेटा को जॉइन करने के लिए एक मॉडल बनाएँ। फिर पिछले क्वार्टर में प्रत्येक प्रोडक्ट श्रेणी की कुल बिक्री की गणना करने के लिए sum फ़ंक्शन का उपयोग करें।

-- models/total_sales_by_category.sql
with product_data as (
select
{{ dbt_utils.get_filtered_columns_in_relation(
relation=ref('products'),
include=['product_id', 'category']
) }}
from {{ ref('products') }}
),
transaction_data as (
select
product_id,
sale_amount,
transaction_date
from {{ ref('transactions') }}
where transaction_date >= date_trunc('quarter', current_date) - interval '1 quarter'
),
joined_data as (
select
p.category,
t.sale_amount
from product_data p
join transaction_data t
on p.product_id = t.product_id
)
select
category,
sum(sale_amount) as total_sales
from joined_data
group by category

मॉडलों को परिभाषित करने के बाद, ट्रांसफॉर्मेशन निष्पादित करने और रिपोर्ट जनरेट करने के लिए dbt मॉडल्स चलाएँ।

dbt run

उपर्युक्त कोड का स्पष्टीकरण:

get_filtered_columns_in_relation मैक्रो प्रोडक्ट्स टेबल से केवल आवश्यक कॉलम (product_id और category) चुनने में मदद करता है, जिससे डेटासेट सरल हो जाता है।

इसके बाद, फ़िल्टर किया गया प्रोडक्ट डेटा ट्रांज़ैक्शन डेटा के साथ SQL के माध्यम से जॉइन किया जाता है ताकि प्रत्येक प्रोडक्ट की बिक्री राशि प्राप्त हो सके। फिर sum एग्रीगेशन फ़ंक्शन का उपयोग करके पिछले क्वार्टर के भीतर प्रत्येक प्रोडक्ट श्रेणी की कुल बिक्री की गणना की जाती है।

उपयोग मामला 2: जेनेरिक टेस्ट्स के साथ डेटा गुणवत्ता सुनिश्चित करना

उदाहरण परिदृश्य:

इस उपयोग मामले में, हम उपयोग मामला 1 के उसी मॉक डेटासेट के साथ काम करना जारी रखेंगे। हालाँकि, रिपोर्ट बनाने के बजाय, हमारा लक्ष्य डेटा पर जेनेरिक टेस्ट्स चलाकर डेटा गुणवत्ता सुनिश्चित करना है।

कोड इम्प्लीमेंटेशन:

नीचे आपके डेटासेट के लिए इन टेस्ट्स को लागू करने के उदाहरण दिए गए हैं:

1. nulls के अनुपात का परीक्षण

इस जेनेरिक टेस्ट में, हम केवल उन्हीं मानों की पुष्टि करेंगे जो हमारे द्वारा निर्दिष्ट non-null अनुपात में फिट बैठते हैं। हम यह not_null_proportion टेस्ट का उपयोग करके करेंगे।

# models/products.yml
version: 2
models:
- name: products
columns:
- name: product_id
tests:
- dbt_utils.not_null_proportion:
at_least: 0.95

इस उदाहरण में, हमने अतिरिक्त वैकल्पिक आर्ग्युमेंट at_least शामिल किया है ताकि non-null अनुपात को अधिकतम 0.95 पर सेट किया जा सके।

2. खाली फ़ील्ड्स का परीक्षण

इस उदाहरण में, हम product_id फ़ील्ड में खाली स्ट्रिंग्स की जाँच के लिए not_empty_string टेस्ट का उपयोग करेंगे।

# models/products.yml
version: 2
models:
- name: products
columns:
- name: product_id
tests:
- dbt_utils.not_empty_string

3. रेफ़रेंशियल इंटीग्रिटी का परीक्षण

relationships_where फ़ंक्शन का उपयोग यह सुनिश्चित करेगा कि ट्रांज़ैक्शंस टेबल में प्रत्येक product_id प्रोडक्ट्स टेबल में मौजूद हो।

# models/transactions.yml
version: 2
models:
- name: transactions
columns:
- name: product_id
tests:
- dbt_utils.relationships_where:
to: ref('products')
field: product_id

इस उदाहरण में, हम यह सुनिश्चित करते हैं कि transactions टेबल के सभी product_id मान टेबल में वैध एंट्रीज़ से मेल खाते हों। यह एक बुनियादी रिलेशनशिप इंटीग्रिटी जाँच है।

ध्यान दें कि आप एक ही समय में कई टेस्ट्स को भी संयोजित कर सकते हैं ताकि कई इंटीग्रिटी जाँचों को कवर किया जा सके।

जब सभी टेस्ट्स आपकी yaml कॉन्फ़िग फ़ाइल में परिभाषित हो जाएँ, तो सभी परिभाषित स्कीमा टेस्ट्स को निष्पादित करने के लिए dbt test कमांड का उपयोग करें।

dbt test

dbt utils सर्वोत्तम प्रथाएँ

dbt-utils का कुशलतापूर्वक लाभ उठाना

dbt का उपयोग करते समय, यह महत्वपूर्ण है कि आप सर्वोत्तम प्रथाओं का पालन करें ताकि आपका प्रोजेक्ट कुशलतापूर्वक और प्रभावी ढंग से चले। dbt-utils का उपयोग करते समय, कुछ मुख्य बिंदु ध्यान में रखें:

  1. कई टेस्ट्स को अलग-अलग परिभाषित करने के बजाय संयोजित करें: जैसा पहले बताया गया, आप कई टेस्ट्स को एक ही टेस्ट स्टेटमेंट में जोड़ सकते हैं। यह दोहराव को कम करता है और आपके प्रोजेक्ट के समग्र प्रदर्शन में सुधार करता है।
  2. सरोगेट की बनाते समय dbt_utils.surrogate_key मैक्रो का उपयोग करें: यह मैक्रो आपकी टेबल के अन्य कॉलम्स के आधार पर सरोगेट की स्वतः जेनरेट करता है, जिससे आपका समय और मेहनत बचती है।

सामान्य गलतियाँ और उनसे कैसे बचें

यहाँ कुछ सामान्य गलतियाँ हैं जिनका सामना उपयोगकर्ता dbt-utils का उपयोग करते समय कर सकते हैं, और उनसे बचने के लिए सुझाव:

  1. कस्टम मैक्रोज़ को सही से कॉन्फ़िगर न करना: यदि आप अपने कस्टम मैक्रोज़ बना रहे हैं, तो सुनिश्चित करें कि वे आपके प्रोजेक्ट में शामिल करने से पहले ठीक से कॉन्फ़िगर और टेस्ट किए गए हों।
  2. dbt-utils के नवीनतम वर्ज़न पर अपडेट न करना: नए फीचर्स और बग फ़िक्स का लाभ उठाने के लिए dbt-utils के नवीनतम वर्ज़न पर नियमित रूप से अपडेट करना महत्वपूर्ण है।

निष्कर्ष

dbt-utils आपके डेटा मॉडेलिंग प्रोसेस में कार्यों को सुव्यवस्थित करने, टेस्ट करने और स्वचालित करने के लिए एक शक्तिशाली टूल है। यह dbt का एक आवश्यक हिस्सा है और आपके डेटा मॉडल विकसित करने में समय और मेहनत बचा सकता है।

आपको यह dbt ट्यूटोरियल या वैकल्पिक डेटा इंजीनियरिंग टूल्स की यह सूची भी उपयोगी लग सकती है।

यदि आप dbt के साथ शुरुआत करने में रुचि रखते हैं और आगे सीखना चाहते हैं, तो हमारा Introduction to dbt Course भी देखें!

Austin Chia

लेखक

Austin Chia

मैं ऑस्टिन हूँ—एक ब्लॉगर और टेक राइटर, जिसके पास स्वास्थ्य सेवा क्षेत्र में डेटा वैज्ञानिक और डेटा विश्लेषक के रूप में वर्षों का अनुभव है। जीवविज्ञान की पृष्ठभूमि से अपनी टेक यात्रा शुरू करने के बाद, अब मैं अपने टेक ब्लॉग के माध्यम से दूसरों को भी यही बदलाव करने में मदद करता हूँ। प्रौद्योगिकी के प्रति मेरे जुनून ने मुझे दर्जनों SaaS कंपनियों के लिए लिखने के लिए प्रेरित किया है, जहाँ मैं अपनी अनुभूतियाँ साझा करता हूँ और दूसरों को प्रेरित करता हूँ।

विषय