प्रतिनिधि इंटरव्यू विषय

डेटा इंजीनियरिंग इंटरव्यू: Iceberg v3 Variant को JSON स्ट्रिंग से बेहतर कब माना जाना चाहिए?

डेटाकठिन
Offer.cc संपादकीय टीमप्रकाशित अपडेट किया गया

प्रश्न

एक इवेंट लेक ऐसे वेंडर पेलोड प्राप्त करता है जिनके एक्सटेंशन बार-बार बदलते हैं। Iceberg v3 Variant, एक JSON स्ट्रिंग और एक फिक्स्ड struct की तुलना करें। आप स्कीमा को कैसे गवर्न करेंगे, क्वेरी रिग्रेशन से कैसे बचेंगे, और केवल पुराने फॉर्मेट्स का समर्थन करने वाले रीडर्स को कैसे माइग्रेट करेंगे?

प्रॉम्प्ट और दायरा

एक इवेंट लेक कई वेंडर्स से वेबहुक प्राप्त करता है। कोर फ़ील्ड्स स्थिर हैं, एक्सटेंशन अक्सर बदलते हैं, और कुछ इवेंट्स में तारीखें, टाइमस्टैम्प, बाइनरी मान और डेसिमल शामिल होते हैं। एक Iceberg v3 स्टोरेज मॉडल डिज़ाइन करें, Variant की तुलना JSON स्ट्रिंग्स और structs से करें, और एक माइग्रेशन तथा एक्सेप्टेंस योजना प्रदान करें।

यह सेमी-स्ट्रक्चर्ड डेटा मॉडलिंग का परीक्षण करता है, न कि हर फ़ील्ड को Variant में डालने के निर्णय का। Iceberg विनिर्देश Variant को ऐसे मान के रूप में परिभाषित करता है जिसकी संरचना और प्रकार पंक्तियों और फ़ाइलों में भिन्न हो सकते हैं, जिसमें JSON की तुलना में अधिक समृद्ध प्रिमिटिव होते हैं। यह एक v3 क्षमता है, इसलिए फॉर्मेट वर्ज़न और रीडर कम्पैटिबिलिटी डिज़ाइन का हिस्सा हैं।

इंटरव्यूअर क्या जांच रहा है

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

इंटरव्यूअर डेटा कॉन्ट्रैक्ट्स, नेमिंग, टाइप के टकरावों, प्राइवेसी, बैकफिल्स और फॉलबैक पाथ्स पर भी ध्यान देता है। एक उत्कृष्ट उत्तर रॉ पेलोड से कैनोनिकल कॉलम तक ड्यूल-राइट या व्यू रणनीति प्रदान करता है और बताता है कि जब कोई पुराना रीडर v3 को समझ नहीं पाता है तो क्या होता है।

स्पष्टीकरण के लिए प्रश्न

कौन से फ़ील्ड्स कीज़ और फ़िल्टर्स हैं

पुष्टि करें कि क्या टेनेंट ID, इवेंट प्रकार, इवेंट का समय और आइडमपोटेंसी की स्थिर हैं और अक्सर क्वेरी की जाती हैं। वे टाइप्ड कॉलम होने चाहिए, न कि हर क्वेरी पर Variant से पार्स किए गए पाथ।

एक्सटेंशन को किस प्रकार की क्वेरी गारंटी की आवश्यकता है

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

क्या सभी रीडर्स v3 का समर्थन करते हैं

Spark, Flink, Trino, सर्विस SDKs और एक्सपोर्ट जॉब्स की सूची बनाएं। यदि कोई v2 रीडर बना रहता है, तो एक JSON कम्पैटिबिलिटी व्यू, एक अलग v3 टेबल, या एक विलंबित अपग्रेड परिभाषित करें।

30-सेकंड का उत्तर

"मैं स्थिर और बार-बार फ़िल्टर किए जाने वाले फ़ील्ड्स को टाइप्ड कॉलम के रूप में रखता हूँ और केवल तेजी से बदलने वाले, कम-आवृत्ति वाले एक्सटेंशन को Variant में डालता हूँ। Variant एक JSON स्ट्रिंग की तुलना में अधिक प्रकारों को सुरक्षित रखता है, लेकिन यह स्वचालित रूप से कॉलम स्टैटिस्टिक्स या पुशडाउन प्रदान नहीं करता है। मैं लागत को नियंत्रित करने के लिए एक पाथ रजिस्ट्री, क्वालिटी रूल्स और मटेरियलाइज़्ड कॉलम का उपयोग करता हूँ। v3 में अपग्रेड करने से पहले, मैं रीडर्स की सूची बनाता हूँ, v2 जॉब्स को स्पष्ट प्रिसिजन हानि के साथ एक कम्पैटिबिलिटी व्यू देता हूँ, और स्कैन बाइट्स, लेटेंसी, टाइप के टकराव और बैकफिल की सफलता को मापता हूँ।"

चरण-दर-चरण समाधान

चरण 1: कैनोनिकल कॉलम को एक्सटेंशन से अलग करें

टेनेंट ID, इवेंट का नाम, इवेंट का समय, सोर्स और आइडमपोटेंसी की को सुसंगत प्रकारों, ऑप्शनेलिटी और फ़ील्ड IDs के साथ टॉप-लेवल struct फ़ील्ड्स में रखें। वेंडर-विशिष्ट कम-आवृत्ति वाले ऑब्जेक्ट्स को Variant में रखें, रीप्ले और ऑडिट के लिए सोर्स वर्ज़न और रॉ इवेंट ID को बनाए रखें।

चरण 2: तीनों निरूपणों की तुलना करें

एक फिक्स्ड struct स्थिर स्कीमा, टाइप्ड कंप्यूटेशन और कॉलम स्टैटिस्टिक्स के लिए उपयुक्त है। एक JSON स्ट्रिंग व्यापक रूप से संगत है लेकिन हर क्वेरी के लिए फिर से पार्स की जाती है, और तारीख, डेसिमल तथा बाइनरी सिमेंटिक्स पार्सर पर निर्भर करते हैं। Variant इंजन सपोर्ट, स्टैटिस्टिक्स और गवर्नेंस की लागत पर, बदलने वाले ऑब्जेक्ट्स और ऐरे के साथ-साथ समृद्ध प्रिमिटिव्स की अनुमति देता है।

चरण 3: एक Variant कॉन्ट्रैक्ट परिभाषित करें

अनुमत पाथ्स के लिए एक रजिस्ट्री बनाएं: पाथ, अपेक्षित प्रकार, संवेदनशीलता, स्वामित्व वाली टीम, पहली बार देखा गया वर्ज़न, और क्या यह प्रमोशन के लिए योग्य है। अज्ञात उच्च-जोखिम वाले प्रकारों को चुपचाप स्ट्रिंग्स में बदलने के बजाय अस्वीकार या क्वारंटीन करें।

text
event_id: string
event_time: timestamptz
payload: variant
payload_registry:
  vendor.order.total: decimal(18,2)
  vendor.order.shipped_at: timestamptz

रजिस्ट्री डेटा गुणवत्ता को नियंत्रित करती है; इसे टेबल स्कीमा में हर Variant पाथ को हार्ड-कोड नहीं करना चाहिए। स्कीमा इवोल्यूशन या मटेरियलाइज़्ड कॉलम के माध्यम से किसी पाथ को केवल तभी प्रमोट करें जब वह एक कोर क्वेरी डायमेंशन बन जाए।

चरण 4: क्वेरी लागत को नियंत्रित करें

बड़े स्कैन्स में Variant के अनबाउंडेड वाइल्डकार्ड ट्रैवर्सल से बचें। स्थिर पाथ्स के लिए प्रोजेक्टेड व्यू या मटेरियलाइज़्ड कॉलम बनाएं, इवेंट प्रकार और समय के अनुसार पार्टीशन करें, और स्कैन बाइट्स, पार्स CPU तथा हिट रेट को रिकॉर्ड करें। प्रमोट करने से पहले अज्ञात पाथ्स का ऑफ़लाइन सैंपल और प्रोफाइल लें।

चरण 5: वर्ज़न और रीडर्स को संभालें

Variant की अनुमति Iceberg v3 में है। रिलीज़ से पहले, प्रत्येक रीडर के फॉर्मेट वर्ज़न, Parquet या Avro मैपिंग, और SDK सपोर्ट की जाँच करें। एक v2 जॉब एक कम्पैटिबिलिटी व्यू का उपयोग कर सकता है जो Variant को JSON के रूप में सीरियलाइज़ करता है, लेकिन व्यू में प्रकार और प्रिसिजन की हानि तथा उन फ़ील्ड्स का विवरण होना चाहिए जिन्हें अब कुशलतापूर्वक क्वेरी नहीं किया जा सकता है।

चरण 6: बैकफिल्स, टकराव और प्राइवेसी डिज़ाइन करें

रॉ पेलोड और ट्रांसफ़ॉर्मेशन वर्ज़न को बनाए रखते हुए Variant से एक नया कैनोनिकल कॉलम बैकफिल करें। यदि कोई पाथ डेसिमल से स्ट्रिंग में बदलता है, तो चुपचाप ओवरराइट न करें: पाथ को वर्ज़न दें, एक टकराव मीट्रिक उत्सर्जित करें, और आवश्यकता पड़ने पर अमान्य रिकॉर्ड्स को क्वारंटीन करें। फ़ील्ड-लेवल मास्किंग, डिलीशन हैंडलिंग और एक्सेस ऑडिट को भी Variant पर लागू करें।

चरण 7: एक एक्सेप्टेंस मैट्रिक्स बनाएं

नल, मिक्स्ड प्रकार, डीप ऐरे, टाइम ज़ोन, प्रिसिजन, अज्ञात फ़ील्ड्स, पुराने रीडर्स, समवर्ती राइट्स और पुनः प्रयासों का परीक्षण करें। स्कैन बाइट्स, पार्स CPU, p95 लेटेंसी, टाइप-कॉन्फ्लिक्ट दर, रीप्ले कंसिस्टेंसी और v2/v3 रीडर सफलता दर को ट्रैक करें।

मॉडल उच्च-गुणवत्ता वाला उत्तर

मैं हर वेबहुक को JSON स्ट्रिंग के रूप में स्टोर नहीं करूँगा। टेनेंट, इवेंट प्रकार, समय और आइडमपोटेंसी की टाइप्ड टॉप-लेवल कॉलम बन जाते हैं; तेजी से बदलने वाले वेंडर एक्सटेंशन पाथ्स, प्रकारों और संवेदनशीलता की रजिस्ट्री के तहत Variant में जाते हैं। Variant एक स्ट्रिंग की तुलना में तारीखों, टाइमस्टैम्प्स और डेसिमल्स को बेहतर ढंग से सुरक्षित रखता है, लेकिन मैं यह नहीं मानूँगा कि हर इंजन इसमें प्रेडिकेट्स को कुशलतापूर्वक पुश कर सकता है।

Iceberg v3 में अपग्रेड करने से पहले, मैं रीडर्स की सूची बनाता हूँ और v2 जॉब्स को एक JSON कम्पैटिबिलिटी व्यू प्रदान करता हूँ जो प्रिसिजन हानि को रिकॉर्ड करता है। क्वेरी लेयर उच्च-मूल्य वाले पाथ्स को मटेरियलाइज़ करती है और अज्ञात पाथ्स को प्रोफाइल करती है। टाइप के टकराव एक क्वारंटीन स्ट्रीम में जाते हैं, और बैकफिल्स वर्ज़न्स और रॉ इवेंट्स को बनाए रखते हैं। मैं स्कैन बाइट्स, p95 लेटेंसी, टकराव दर, रीप्ले कंसिस्टेंसी और क्रॉस-इंजन सफलता को मापने के बाद ही डिज़ाइन को स्वीकार करता हूँ।

सामान्य गलतियाँ

  • लक्षण → हर फ़ील्ड को Variant में डालना → यह विफल क्यों होता है → कोर फ़िल्टर्स टाइप्ड स्टैटिस्टिक्स खो देते हैं और क्वेरी लागत अप्रत्याशित हो जाती है → समाधान → स्थिर फ़ील्ड्स को प्रमोट करें और बदलने वाले एक्सटेंशन के लिए Variant को आरक्षित रखें।
  • लक्षण → Variant को JSON स्ट्रिंग की तरह मानना → यह विफल क्यों होता है → तारीखें, डेसिमल्स और बाइनरी मान टाइप सिमेंटिक्स खो देते हैं → समाधान → एक रजिस्ट्री के तहत प्रिमिटिव्स को बनाए रखें।
  • लक्षण → रीडर परीक्षण के बिना v3 में अपग्रेड करना → यह विफल क्यों होता है → पुराने इंजन पढ़ने में विफल हो सकते हैं या चुपचाप प्रदर्शन खराब कर सकते हैं → समाधान → एक वर्ज़न मैट्रिक्स और कम्पैटिबिलिटी व्यू बनाएं।
  • लक्षण → टाइप के टकराव को जबरन स्ट्रिंग में बदलना → यह विफल क्यों होता है → डाउनस्ट्रीम एग्रीगेट्स और कंस्ट्रेंट्स टूट जाते हैं → समाधान → पाथ को वर्ज़न दें या क्वारंटीन करें और टकरावों को मापें।
  • लक्षण → बैकफिल के दौरान रॉ पेलोड को ओवरराइट करना → यह विफल क्यों होता है → रूपांतरण अंतरों को रीप्ले या ऑडिट नहीं किया जा सकता है → समाधान → रॉ इवेंट्स, ट्रांसफ़ॉर्मेशन वर्ज़न्स और आइडमपोटेंट जॉब्स को बनाए रखें।

फ़ॉलो-अप प्रश्न और उत्तर

फ़ॉलो-अप 1: JSON स्ट्रिंग को बनाए रखकर क्वेरी समय पर इसे पार्स क्यों न करें?

स्ट्रिंग्स कम्पैटिबिलिटी को अधिकतम करती हैं, लेकिन हर क्वेरी में पार्सिंग लागत चुकानी पड़ती है और प्रकार की शुद्धता पार्सर पर निर्भर करती है। यह केवल ऑडिट रीप्ले के लिए स्वीकार्य हो सकता है। एग्रीगेट्स, फ़िल्टर्स और क्रॉस-इंजन कंसिस्टेंसी को टाइप कॉन्ट्रैक्ट को Variant या कैनोनिकल कॉलम में ले जाने से लाभ होता है।

फ़ॉलो-अप 2: एक पाथ आज न्यूमेरिक है और कल स्ट्रिंग है। आप क्या करते हैं?

राइट को अस्वीकार या क्वारंटीन करने के लिए रजिस्ट्री का उपयोग करें और वेंडर वर्ज़न को रिकॉर्ड करें। यदि दोनों प्रकार वैध हैं, तो पाथ को वर्ज़न दें या एक स्पष्ट union परिभाषित करें; क्वेरी इंजन को अनुमान न लगाने दें।

फ़ॉलो-अप 3: एक पुराना रीडर केवल Iceberg v2 का समर्थन करता है। आप कैसे माइग्रेट करते हैं?

एक v2-कम्पैटिबल टेबल या व्यू बनाए रखें जो Variant को JSON के रूप में सीरियलाइज़ करता है और प्रिसिजन हानि का विवरण देता है। नए रीडर्स के साथ v3 का शैडो-रीड करें, फिर जॉब्स को धीरे-धीरे कट ओवर करें। प्रत्येक जॉब अपग्रेड गेट में अपने न्यूनतम फॉर्मेट वर्ज़न की घोषणा करता है।

फ़ॉलो-अप 4: Variant पाथ को टॉप-लेवल कॉलम कब बनना चाहिए?

इसे तब प्रमोट करें जब पाथ स्थिर हो, अक्सर एक्सेस किया जाता हो, कम टकराव वाला हो, और प्रोफाइलिंग से कम स्कैनिंग या पार्सिंग दिखाई देती हो। क्लीनअप पर विचार करने से पहले सत्यापन और रीप्ले विंडो के लिए रॉ Variant को बनाए रखें।

सार्वजनिक स्रोत

संबंधित प्रश्न