Clickhouse को जानें: OLAP (ऑनलाइन एनालिटिक प्रोसेसिंग) के लिए उच्च-प्रदर्शन वाला कॉलम-ओरिएंटेड DBMS
- डेटाबेस का परिचय
- कॉलम-ओरिएंटेड डेटाबेस के मूल सिद्धांत
- ClickHouse का परिचय
- ClickHouse की वास्तुकला
- ClickHouse के साथ शुरुआत करना
- Clickhouse क्लाउड के साथ शुरुआत करना
- chDB - एक अवलोकन
- डेमो - google collab
- संदर्भ:
डेटाबेस का परिचय
डेटाबेस क्या है?
डेटाबेस जानकारी को संग्रहीत, व्यवस्थित और एक्सेस करने के लिए उपयोग की जाने वाली एक प्रणाली है। यह उपयोगकर्ताओं को डेटा को कुशलतापूर्वक और सुरक्षित रूप से इनपुट करने, प्रबंधित करने और पुनः प्राप्त करने की अनुमति देता है। डेटाबेस को बड़ी मात्रा में जानकारी को संभालने के लिए संरचित किया गया है, जिससे डेटा को ऐसी तालिकाओं (tables) में संग्रहीत किया जा सकता है जिन्हें आसानी से खोजा, हेरफेर (manipulate) और बनाए रखा जा सकता है।
डेटाबेस के प्रकार
रिलेशनल (Relational) डेटा को पंक्तियों (rows) और कॉलम के साथ संरचित तालिकाओं में संग्रहीत करता है, जिससे SQL का उपयोग करके जटिल क्वेरी की जा सकती है। उदाहरण: HR और CRM डेटाबेस
नॉन-रिलेशनल (Non-relational) बिना किसी निश्चित तालिका संरचना के असंरचित और अर्ध-संरचित डेटा को संभालता है, जिसमें की-वैल्यू (key-value), दस्तावेज़ और ग्राफ़ जैसे प्रारूपों का उपयोग किया जाता है। उदाहरण: ई-कॉमर्स प्लेटफ़ॉर्म, कंटेंट मैनेजमेंट, IoT और रीयल-टाइम एनालिटिक्स
डेटाबेस मैनेजमेंट सिस्टम (DBMS) का परिचय
यह ऐसा सॉफ़्टवेयर है जो उपयोगकर्ताओं को डेटाबेस को परिभाषित करने, बनाने, बनाए रखने और एक्सेस को नियंत्रित करने की अनुमति देता है। यह डेटा स्टोरेज, हेरफेर और पुनर्प्राप्ति का प्रबंधन करता है, जिससे विभिन्न डेटाबेस के साथ कई उपयोगकर्ताओं की बातचीत आसान हो जाती है।
कॉलम-ओरिएंटेड डेटाबेस के मूल सिद्धांत
रो-ओरिएंटेड बनाम कॉलम-ओरिएंटेड स्टोरेज
रो-ओरिएंटेड डेटाबेस:
- संरचना: डेटा को पंक्तियों (rows) के अनुसार संग्रहीत करता है, जो लेखन कार्यों और ट्रांजेक्शनल प्रोसेसिंग के लिए कुशल है जहाँ पूर्ण रिकॉर्ड तक पहुंच सामान्य है।
- लाभ: OLTP सिस्टम (ऑनलाइन ट्रांजेक्शन प्रोसेसिंग) जैसे ग्राहक संबंध प्रबंधन (CRM) के लिए इष्टतम, जहाँ तेज़ अपडेट और इंसर्ट महत्वपूर्ण हैं।
कॉलम-ओरिएंटेड डेटाबेस:
- संरचना: डेटा को कॉलम के अनुसार संग्रहीत करता है, जो पढ़ने के कार्यों और डेटा एनालिटिक्स को बढ़ाता है जहाँ बड़े डेटासेट पर एकत्रीकरण (aggregations) की आवश्यकता होती है।
- लाभ: OLAP सिस्टम (ऑनलाइन एनालिटिकल प्रोसेसिंग) जैसे डेटा वेयरहाउसिंग और बिग डेटा एनालिटिक्स के लिए आदर्श, जो केवल कॉलम के एक सबसेट तक पहुंचने वाली क्वेरी के लिए उच्च प्रदर्शन प्रदान करता है।
फायदे:
- रो-ओरिएंटेड: पूरी पंक्ति द्वारा त्वरित डेटा पुनर्प्राप्ति, सरल कार्यान्वयन, रिकॉर्ड दर्ज करने और अपडेट करने के लिए कुशल।
- कॉलम-ओरिएंटेड: बेहतर संपीड़न (compression), कुशल भंडारण जो कॉलम डेटा को तेज़ी से पढ़ने की ओर ले जाता है, बड़े डेटासेट को क्वेरी करने के लिए अनुकूलित, जो I/O संचालन को कम करता है।
कॉलम-ओरिएंटेड डेटाबेस
graph TD
subgraph "Column-Oriented Database"
subgraph "ID Column"
ID1[1]
ID2[2]
ID3[3]
end
subgraph "Name Column"
Name1[John]
Name2[Alice]
Name3[Bob]
end
subgraph "Age Column"
Age1[30]
Age2[25]
Age3[35]
end
subgraph "City Column"
City1[New York]
City2[Los Angeles]
City3[San Francisco]
end
endरो-ओरिएंटेड डेटाबेस
graph TD
subgraph "Row-Oriented Storage"
A["Row 1: ID | Name | Age | City"]
B["Row 2: ID | Name | Age | City"]
C["Row 3: ID | Name | Age | City"]
endClickHouse का परिचय
ClickHouse क्या है?
ClickHouse एक ओपन-सोर्स कॉलम-ओरिएंटेड डेटाबेस मैनेजमेंट सिस्टम (DBMS) है जिसे ऑनलाइन एनालिटिकल प्रोसेसिंग (OLAP) के लिए डिज़ाइन किया गया है। यह उपयोगकर्ताओं को रीयल-टाइम में SQL क्वेरी का उपयोग करके विश्लेषणात्मक रिपोर्ट तैयार करने की अनुमति देता है, जो बड़ी मात्रा में डेटा को संसाधित करने के लिए उच्च प्रदर्शन और स्केलेबिलिटी प्रदान करता है। मुख्य विशेषताओं में शामिल हैं:
- कॉलम-ओरिएंटेड स्टोरेज
- डेटा संपीड़न (Data compression)
- वितरित क्वेरी प्रोसेसिंग
- SQL समर्थन
- विश्लेषणात्मक क्वेरी के लिए उच्च प्रदर्शन
- पेटाबाइट्स डेटा को संभालने की क्षमता
- प्रतिकृति (replication) के माध्यम से फॉल्ट टॉलरेंस
ClickHouse विशेष रूप से उन अनुप्रयोगों के लिए उपयुक्त है जिन्हें बड़े डेटासेट पर तेज़ एनालिटिक्स की आवश्यकता होती है, जैसे कि बिज़नेस इंटेलिजेंस, ऑब्जर्वेबिलिटी और रीयल-टाइम डेटा वेयरहाउसिंग।
ClickHouse की मुख्य विशेषताएं और गति
- कॉलम-ओरिएंटेड स्टोरेज: अक्सर, रिपोर्ट के लिए स्रोत डेटा के सैकड़ों कॉलम में से केवल कुछ की ही आवश्यकता होती है। कॉलम-ओरिएंटेड स्टोरेज केवल आवश्यक कॉलम तक पहुंचकर दक्षता में सुधार करता है, जिससे डिस्क रीड कम हो जाता है।
- इंडेक्स: ClickHouse केवल आवश्यक कॉलम और विशिष्ट पंक्ति श्रेणियों को पढ़ने के लिए इन-मेमोरी डेटा संरचनाओं का उपयोग करता है, जिससे डेटा पुनर्प्राप्ति अनुकूलित होती है।
- डेटा संपीड़न: एक ही कॉलम के मानों को समूहित करने से रो-ओरिएंटेड सिस्टम की तुलना में संपीड़न बेहतर होता है, क्योंकि आसन्न पंक्तियों में समान मान सामान्य होते हैं। ClickHouse डेटा को और अधिक कॉम्पैक्ट बनाने के लिए विशेष कोडेक्स का भी उपयोग करता है।
- वेक्टराइज्ड क्वेरी निष्पादन: ClickHouse डेटा को कॉलम के अनुसार संसाधित करता है, जिससे CPU कैश दक्षता में सुधार होता है और तेज़ संचालन के लिए SIMD CPU निर्देशों का उपयोग संभव होता है।
- स्केलेबिलिटी: ClickHouse सभी उपलब्ध CPU कोर और डिस्क का लाभ उठाकर संसाधन उपयोग को अधिकतम करता है, न केवल एक सर्वर पर बल्कि पूरे क्लस्टर में, जिससे जटिल क्वेरी के लिए प्रदर्शन बढ़ता है।
प्राइमरी की, इंडेक्स और ग्रैन्यूल
प्राइमरी की (Primary Key):
- डिस्क पर डेटा के भौतिक छँटाई क्रम (sorting order) को निर्धारित करती है
- स्पार्स इंडेक्स बनाने के लिए उपयोग की जाती है
इंडेक्स:
- इंडेक्स हर N पंक्तियों (डिफ़ॉल्ट 8192) के लिए बनाया जाता है, जिसे ग्रैन्यूल कहा जाता है
- primary.idx फ़ाइल में संग्रहीत होता है
- प्रासंगिक डेटा ब्लॉक को जल्दी से खोजने के लिए उपयोग किया जाता है
ग्रैन्यूल (Granules):
- एक ग्रैन्यूल पंक्तियों का एक तार्किक समूह है (डिफ़ॉल्ट 8192 पंक्तियाँ)
- डेटा को कई भागों में विभाजित किया जाता है, और प्रत्येक भाग को ग्रैन्यूल में विभाजित किया जाता है
वे एक साथ कैसे काम करते हैं:
- जब कोई क्वेरी निष्पादित की जाती है, तो ClickHouse स्पार्स इंडेक्स को खोजने के लिए प्राइमरी की का उपयोग करता है
- इंडेक्स यह पहचानने में मदद करता है कि किन ग्रैन्यूल में संभावित रूप से प्रासंगिक डेटा है
- ClickHouse फिर केवल मिलान वाले ग्रैन्यूल को मेमोरी में लोड करता है
- ग्रैन्यूल के भीतर के डेटा को सटीक मिलान वाली पंक्तियों को खोजने के लिए संसाधित किया जाता है
ClickHouse की वास्तुकला
ClickHouse आर्किटेक्चर का अवलोकन
- इंजन ClickHouse इंजन एक प्रकार का टेबल इंजन है जो यह निर्धारित करता है कि डेटा कैसे और कहाँ संग्रहीत किया जाता है, क्वेरी कैसे निष्पादित की जाती हैं, और डेटाबेस की समवर्ती (concurrency) और प्रतिकृति क्षमताएं क्या हैं। प्रत्येक इंजन विशिष्ट उपयोग के मामलों के लिए अनुकूलित है, जो डेटा विभाजन, इंडेक्सिंग और विभिन्न क्वेरी प्रकारों के लिए समर्थन जैसी विभिन्न कार्यात्मकताएं प्रदान करता है।
Clickhouse इंजन
MergeTree परिवार:
- MergeTree: सबसे बहुमुखी और आमतौर पर उपयोग किया जाने वाला इंजन, जिसे उच्च-प्रदर्शन पढ़ने और लिखने के संचालन के लिए डिज़ाइन किया गया है, जो डेटा विभाजन, प्राइमरी की और डेटा प्रतिकृति का समर्थन करता है।
- ReplacingMergeTree: सॉर्टिंग की के आधार पर मर्ज के दौरान पंक्तियों के डिडुप्लीकेशन (deduplication) की अनुमति देता है।
- SummingMergeTree: मर्ज के दौरान समान सॉर्टिंग की वाली पंक्तियों के लिए संख्यात्मक कॉलम का योग करता है।
- AggregatingMergeTree: निर्दिष्ट एग्रीगेट फ़ंक्शंस का उपयोग करके मर्ज के दौरान डेटा को एग्रीगेट करता है।
- CollapsingMergeTree: एक विशेष 'Sign' कॉलम के आधार पर, मर्ज के दौरान समान सॉर्टिंग की वाली पंक्तियों को कोलैप्स (collapse) करता है।
- VersionedCollapsingMergeTree: पंक्तियों के लिए वर्ज़न कंट्रोल के साथ CollapsingMergeTree का विस्तार करता है।
- GraphiteMergeTree: टाइम सीरीज़ डेटा को संग्रहीत करने के लिए विशेष।
इंटीग्रेशन इंजन:
- ODBC: ODBC का उपयोग करके बाहरी डेटाबेस को क्वेरी करने की अनुमति देता है।
- JDBC: JDBC का उपयोग करके बाहरी डेटाबेस को क्वेरी करने में सक्षम बनाता है।
- MySQL: MySQL डेटाबेस को क्वेरी करने के लिए।
- MongoDB: MongoDB डेटाबेस को क्वेरी करने की अनुमति देता है।
- HDFS: Hadoop डिस्ट्रिब्यूटेड फ़ाइल सिस्टम में संग्रहीत डेटा के साथ काम करने के लिए।
- S3: Amazon S3 में संग्रहीत डेटा के साथ काम करने में सक्षम बनाता है।
- Kafka: Apache Kafka स्ट्रीम के साथ काम करने के लिए।
ClickHouse के साथ शुरुआत करना
इंस्टॉलेशन और सेटअप - Mac या Linux पर
- लाइब्रेरी इंस्टॉल करें
curl https://clickhouse.com/ | sh- Clickhouse सर्वर शुरू करने के लिए निम्नलिखित कमांड चलाएँ:
./clickhouse server- एक नया टर्मिनल खोलें और सर्वर से कनेक्ट करें
clickhouse-client- रिमोट फ़ाइलों को क्वेरी करें
--फ़ाइल की जाँच करें
SELECT * FROM s3('https://clickhouse-public-datasets.s3.amazonaws.com/ontime/csv_by_year/*.csv.gz', CSVWithNames) limit 10;
--बेसिक काउंट
SELECT count() FROM s3('https://clickhouse-public-datasets.s3.amazonaws.com/ontime/csv_by_year/*.csv.gz', CSVWithNames) limit 10;
--2007 के लिए कैरियर द्वारा देरी की संख्या
SELECT IATA_CODE_Reporting_Airline AS Carrier, count(*)
FROM s3('https://clickhouse-public-datasets.s3.amazonaws.com/ontime/csv_by_year/*.csv.gz')
WHERE DepDelay>10 AND Year=2007
GROUP BY Carrier
ORDER BY count(*) DESC limit 5;
परिणाम
┌─Carrier─┬─count()─┐
- │ WN │ 296293 │ └─────────┴─────────┘ ┌─Carrier─┬─count()─┐
- │ AA │ 176203 │
- │ MQ │ 145630 │
- │ US │ 135987 │
- │ UA │ 128174 │ └─────────┴─────────┘
5 rows in set. Elapsed: 420.586 sec. Processed 204.84 million rows, 11.66 GB (487.03 thousand rows/s., 27.72 MB/s.) Peak memory usage: 1.18 GiB.
अपनी पहली क्वेरी चलाना
टेबल बनाएँ
CREATE TABLE `ontime`
(
`Year` UInt16,
`Quarter` UInt8,
`Month` UInt8,
`DayofMonth` UInt8,
`DayOfWeek` UInt8,
`FlightDate` Date,
`Reporting_Airline` LowCardinality(String),
`DOT_ID_Reporting_Airline` Int32,
`IATA_CODE_Reporting_Airline` LowCardinality(String),
`Tail_Number` LowCardinality(String),
`Flight_Number_Reporting_Airline` LowCardinality(String),
`OriginAirportID` Int32,
`OriginAirportSeqID` Int32,
`OriginCityMarketID` Int32,
`Origin` FixedString(5),
`OriginCityName` LowCardinality(String),
`OriginState` FixedString(2),
`OriginStateFips` FixedString(2),
`OriginStateName` LowCardinality(String),
`OriginWac` Int32,
`DestAirportID` Int32,
`DestAirportSeqID` Int32,
`DestCityMarketID` Int32,
`Dest` FixedString(5),
`DestCityName` LowCardinality(String),
`DestState` FixedString(2),
`DestStateFips` FixedString(2),
`DestStateName` LowCardinality(String),
`DestWac` Int32,
`CRSDepTime` Int32,
`DepTime` Int32,
`DepDelay` Int32,
`DepDelayMinutes` Int32,
`DepDel15` Int32,
`DepartureDelayGroups` LowCardinality(String),
`DepTimeBlk` LowCardinality(String),
`TaxiOut` Int32,
`WheelsOff` LowCardinality(String),
`WheelsOn` LowCardinality(String),
`TaxiIn` Int32,
`CRSArrTime` Int32,
`ArrTime` Int32,
`ArrDelay` Int32,
`ArrDelayMinutes` Int32,
`ArrDel15` Int32,
`ArrivalDelayGroups` LowCardinality(String),
`ArrTimeBlk` LowCardinality(String),
`Cancelled` Int8,
`CancellationCode` FixedString(1),
`Diverted` Int8,
`CRSElapsedTime` Int32,
`ActualElapsedTime` Int32,
`AirTime` Int32,
`Flights` Int32,
`Distance` Int32,
`DistanceGroup` Int8,
`CarrierDelay` Int32,
`WeatherDelay` Int32,
`NASDelay` Int32,
`SecurityDelay` Int32,
`LateAircraftDelay` Int32,
`FirstDepTime` Int16,
`TotalAddGTime` Int16,
`LongestAddGTime` Int16,
`DivAirportLandings` Int8,
`DivReachedDest` Int8,
`DivActualElapsedTime` Int16,
`DivArrDelay` Int16,
`DivDistance` Int16,
`Div1Airport` LowCardinality(String),
`Div1AirportID` Int32,
`Div1AirportSeqID` Int32,
`Div1WheelsOn` Int16,
`Div1TotalGTime` Int16,
`Div1LongestGTime` Int16,
`Div1WheelsOff` Int16,
`Div1TailNum` LowCardinality(String),
`Div2Airport` LowCardinality(String),
`Div2AirportID` Int32,
`Div2AirportSeqID` Int32,
`Div2WheelsOn` Int16,
`Div2TotalGTime` Int16,
`Div2LongestGTime` Int16,
`Div2WheelsOff` Int16,
`Div2TailNum` LowCardinality(String),
`Div3Airport` LowCardinality(String),
`Div3AirportID` Int32,
`Div3AirportSeqID` Int32,
`Div3WheelsOn` Int16,
`Div3TotalGTime` Int16,
`Div3LongestGTime` Int16,
`Div3WheelsOff` Int16,
`Div3TailNum` LowCardinality(String),
`Div4Airport` LowCardinality(String),
`Div4AirportID` Int32,
`Div4AirportSeqID` Int32,
`Div4WheelsOn` Int16,
`Div4TotalGTime` Int16,
`Div4LongestGTime` Int16,
`Div4WheelsOff` Int16,
`Div4TailNum` LowCardinality(String),
`Div5Airport` LowCardinality(String),
`Div5AirportID` Int32,
`Div5AirportSeqID` Int32,
`Div5WheelsOn` Int16,
`Div5TotalGTime` Int16,
`Div5LongestGTime` Int16,
`Div5WheelsOff` Int16,
`Div5TailNum` LowCardinality(String)
) ENGINE = MergeTree
ORDER BY (Year, Quarter, Month, DayofMonth, FlightDate, IATA_CODE_Reporting_Airline);डेटा लोड करें - 1M रिकॉर्ड और केवल 2002 लोड किया गया
INSERT INTO ontime SELECT *
FROM s3('https://clickhouse-public-datasets.s3.amazonaws.com/ontime/csv_by_year/*2001*.csv.gz', CSVWithNames)
WHERE Year=2001 limit 1000000
SETTINGS max_insert_threads = 40;- एयरपोर्ट द्वारा देरी की संख्या
SELECT Origin, count(*) AS c
FROM ontime
WHERE DepDelay>10
GROUP BY Origin
ORDER BY c DESC
LIMIT 10;स्थानीय डेटा क्वेरी करें - फ़ाइल स्थानीय है
NY शिकायतों के डेटासेट का उपयोग करना।
describe table file("/Users/[you]/user_files/nypd_complaint.tsv")
select * from file("/Users/[you]/user_files/nypd_complaint.tsv") limit 10त्वरित विश्लेषण
- अपराध के प्रकार के अनुसार शिकायतों की संख्या
SELECT IFNULL(NYPD_Complaint_Data_Current_Year_To_Date.`OFNS_DESC`, 'Unknown') AS Crime_Type,
COUNT(*) AS Complaint_Count
FROM url('https://data.cityofnewyork.us/api/views/5uac-w243/rows.csv?accessType=DOWNLOAD', CSVWithNames)
AS NYPD_Complaint_Data_Current_Year_To_Date
GROUP BY Crime_Type ORDER BY Complaint_Count DESC limit 10- रात में होने वाले सबसे आम अपराध
SELECT IFNULL(NYPD_Complaint.`OFNS_DESC`, 'Unknown') AS Crime_Type,
COUNT(*) AS Complaint_Count
FROM url('https://data.cityofnewyork.us/api/views/5uac-w243/rows.csv?accessType=DOWNLOAD', CSVWithNames)
AS NYPD_Complaint
WHERE (NYPD_Complaint.`CMPLNT_FR_TM` >= '18:00:00' OR NYPD_Complaint.`CMPLNT_FR_TM` <= '06:00:00')
GROUP BY Crime_Type ORDER BY Complaint_Count DESC limit 10Clickhouse क्लाउड के साथ शुरुआत करना
chDB - एक अवलोकन
अवलोकन
chDB एक इन-प्रोसेस SQL OLAP (ऑनलाइन एनालिटिकल प्रोसेसिंग) इंजन है जो ClickHouse द्वारा संचालित है। इसे एक एम्बेडेड डेटाबेस के रूप में डिज़ाइन किया गया है जो अलग सर्वर इंस्टॉलेशन की आवश्यकता के बिना अनुप्रयोगों में ClickHouse की शक्ति लाता है। chDB को ClickHouse, Inc. और ओपन-सोर्स योगदानकर्ताओं द्वारा विकसित किया गया है।
chDB की मुख्य विशेषताओं में शामिल हैं:
- सर्वरलेस ऑपरेशन - ClickHouse सेवाओं को इंस्टॉल या चलाने की आवश्यकता नहीं है
- Python, Go, Rust, NodeJS और Bun सहित कई प्रोग्रामिंग भाषाओं के लिए समर्थन
- Parquet, CSV, JSON, Arrow और ORC जैसे विभिन्न डेटा प्रारूपों के साथ काम करने की क्षमता
- कस्टम यूज़र डिफाइंड फ़ंक्शंस (UDFs)
उपयोग का मामला - chDB का उपयोग क्यों करें
प्रदान की गई जानकारी के आधार पर, वास्तविक दुनिया के अनुप्रयोगों में chDB के लिए कुछ व्यावहारिक उपयोग के मामले यहाँ दिए गए हैं:
- Jupyter नोटबुक में डेटा विश्लेषण: chDB उपयोगकर्ताओं को सीधे Jupyter नोटबुक में ClickHouse क्वेरी चलाने की अनुमति देता है, जिससे डेटा वैज्ञानिकों और विश्लेषकों के लिए अलग ClickHouse सर्वर की आवश्यकता के बिना बड़े डेटासेट के साथ काम करना सुविधाजनक हो जाता है।
- अनुप्रयोगों में एम्बेडेड एनालिटिक्स: डेवलपर्स अलग डेटाबेस सर्वर की आवश्यकता के बिना तेज़ विश्लेषणात्मक क्षमताएं प्रदान करने के लिए chDB को अपने अनुप्रयोगों में एम्बेड कर सकते हैं।
- स्थानीय रूप से बड़े डेटासेट को संसाधित करना: chDB पूर्ण डेटाबेस सिस्टम सेट अप करने की आवश्यकता के बिना स्थानीय मशीन पर बड़े डेटासेट (जैसे Parquet, CSV, JSON फ़ाइलें) के प्रसंस्करण को सक्षम बनाता है।
- त्वरित प्रोटोटाइपिंग: डेटा इंजीनियर और विश्लेषक पूर्ण ClickHouse क्लस्टर को तैनात किए बिना बड़े डेटासेट पर क्वेरी को जल्दी से प्रोटोटाइप और परीक्षण कर सकते हैं।
- सर्वरलेस वातावरण: chDB का उपयोग डेटाबेस इंफ्रास्ट्रक्चर का प्रबंधन किए बिना विश्लेषणात्मक क्षमताएं प्रदान करने के लिए सर्वरलेस फ़ंक्शंस में किया जा सकता है।
- डेटा पाइपलाइन प्रोसेसिंग: chDB को तेज़ डेटा ट्रांसफ़ॉर्मेशन और एग्रीगेशन के लिए डेटा पाइपलाइनों में एकीकृत किया जा सकता है।

