आँकड़ों और विज्ञापन के लिए कुकीज़
हम आँकड़ों और विज्ञापन के लिए कुकीज़ इस्तेमाल करते हैं, दोनों Google को जाती हैं। मना करने से आपको दिखने वाली किसी चीज़ में कोई फ़र्क़ नहीं पड़ता।निजता पेज पढ़ें
यहाँ आप Parquet को NDJSON में बदलते हैं, मुफ़्त और बिना खाते के: फ़ाइल ऊपर छोड़िए और कुछ ही सेकंड में नतीजा डाउनलोड के लिए तैयार मिलेगा। कन्वर्ज़न आपके अपने ब्राउज़र के भीतर होता है, इसलिए फ़ाइल कभी अपलोड नहीं होती। यह Windows, macOS और Linux पर वैसे ही चलता है जैसे iPhone और Android पर, और कनेक्शन काट देने पर भी चलता रहता है।
एक बार में 100 फ़ाइलें। फ़ॉर्मेट अलग-अलग हों तो भी चलेगा।
ये एक के बाद एक बदलती हैं और साथ में एक ZIP बनकर उतरती हैं।
Parquet से NDJSON
Parquet फ़ाइल अपने फ़ुटर में हर कॉलम का प्रकार दर्ज करती है। उसे CSV या टैब-सीमांकित टेक्स्ट में बदलिए और वह घोषणा चली जाती है: हर मूल्य अक्षर बन जाता है, और आगे जो कुछ भी फ़ाइल पढ़ता है वह अक्षरों की शक्ल से दोबारा प्रकार का अंदाज़ा लगाता है — आमतौर पर अलग ढंग से, और हमेशा उस स्कीमा के फ़ायदे के बिना जो वहीं मौजूद थी।
JSON के अपने प्रकार होते हैं। संख्या संख्या ही रहती है, बूलियन बूलियन ही, और null null ही, इसलिए दूसरे छोर पर पहुँचा रिकॉर्ड अपने बारे में वही कहता है जो Parquet का कॉलम कहता था। जब गंतव्य किसी स्कीमा वाली सेवा या क़तार का हो, तो यह छोटा फ़र्क़ नहीं — यह «फ़ील्ड स्ट्रिंग थी इसलिए API ने ठुकरा दिया» जैसी पूरी श्रेणी की समस्याओं को बीच से हटा देता है।
यह जान लेने लायक़ सीमा है, आउटपुट पर कुछ भी बनाने से पहले। Parquet सूचियाँ, स्ट्रक्ट और मैप को अपने ढंग से रखता है, और वे कॉलम JSON में नेस्टेड JSON के बजाय JSON रखने वाली स्ट्रिंग बनकर लिखे जाते हैं। सूची वाला कॉलम `"[\"a\",\"b\"]"` की तरह आता है, जो मूल्य का सही और पूरा रिकॉर्ड है और वह आकार नहीं जो सरणी उम्मीद रखने वाला उपभोक्ता स्वीकार करेगा।
ठीक करना एक पास है। बदली फ़ाइल पर `jq -c '.tags |= fromjson'` उस फ़ील्ड को असली सरणी में बदल देता है, और यही स्ट्रक्ट कॉलम पर भी लागू होता है। इसे साफ़-साफ़ करना यह तय करने का मौक़ा भी है कि फ़ील्ड को सचमुच क्या कहा जाए और गंतव्य को नेस्टेड चाहिए भी या नहीं — कई ख़ुशी-ख़ुशी स्ट्रिंग ही ले लेते हैं।
JSON में कोई तारीख़ प्रकार नहीं। इसलिए समय-चिह्न कॉलम ISO 8601 स्ट्रिंग की तरह लिखा जाता है — `2024-03-11T09:30:00.000Z` — जिसे हर भाषा, डेटाबेस और स्कीमा वैलिडेटर बिना किसी फ़ॉर्मेट बताए पढ़ लेता है, और जो सादे पाठ की तरह भी कालानुक्रमिक रूप से छँट जाता है।
विकल्प एपोक संख्या होती, और वह किसी इंसान के पढ़ने वाले रिकॉर्ड में बदतर है: 1710149400000 वाली फ़ील्ड बिना दोनों — एपोक और इकाई — जाने बिना समझ नहीं आती, और दो आम इकाइयाँ हज़ार के गुणक से अलग होती हैं। अगर गंतव्य को एपोक मिलीसेकंड ही चाहिए, तो ISO से बदलना एक ही अभिव्यक्ति है और दिशा साफ़ है।
Parquet में 64-बिट पूर्णांक प्रकार है और JSON की संख्याएँ व्यवहार में दोनों तरफ़ के पार्सर जो सटीक रख सकें उन्हीं तक सीमित हैं — ज़्यादातर के लिए यह 53 बिट है। उससे आगे का मूल्य बिना बदले संख्या के रूप में नहीं ढोया जा सकता।
बदलाव उन्हें स्ट्रिंग लिखता है। सुरक्षित दायरे के भीतर मूल्य संख्या ही रहता है, बाहर वाला पूरे अंक के साथ उद्धृत स्ट्रिंग बन जाता है, और सीमा-रेखा फैलाने वाला कॉलम दोनों रखेगा। यह मिला-जुला प्रकार थोड़ा परेशान करने वाला है और सही सौदा है: गोल किया गया ऑर्डर संदर्भ बिलकुल ऑर्डर संदर्भ जैसा दिखता है, किसी से मेल नहीं खाता, और बाद में उसका सुराग़ लगाना बहुत मुश्किल है।
फ़ाइल प्रति लाइन एक पूरा JSON ऑब्जेक्ट है और और कुछ नहीं — कोई खुला ब्रैकेट नहीं, रिकॉर्डों के बीच कोई कॉमा नहीं, कोई बंद ब्रैकेट नहीं। JSON सरणी की उम्मीद रखने वाला पार्सर दूसरी लाइन पर ही असफल होगा, और यह इरादे के मुताबिक़ फ़ॉर्मेट का काम है, कोई ख़राबी नहीं।
यह अनुपस्थिति जो देती है वह यह है कि उपभोक्ता एक लाइन पढ़, उस पर काम कर, उसे छोड़ और आगे बढ़ सकता है, फ़ाइल का आकार चाहे जो हो। इसका यह भी मतलब है कि आउटपुट लाइन से पहचाना जा सकता है: `head -n 1000` एक नमूना देता है जो ख़ुद बाक़ी सब में मान्य इनपुट है।
यह इस काम का आम रूप है। कोई तालिका डेटा प्लैटफ़ॉर्म में बैठी है, और उसके बाहर की कोई चीज़ — सर्च इंडेक्स, मैसेज क़तार, बैकफ़िल हो रही सेवा — JSON लेती है और Parquet के बारे में कभी नहीं सुना। NDJSON वह फ़ॉर्मेट है जो दोनों के बीच बैठता है, और इसे एक नई लाइन के अलावा किसी फ़्रेमिंग की ज़रूरत नहीं।
लाइनें पढ़कर हर एक को पोस्ट करने वाला शेल लूप छोटे बैकफ़िल के लिए काफ़ी है। पहले जाँचने लायक़ चीज़ है फ़ील्ड नाम: डेटा प्लैटफ़ॉर्म कॉलम को उस पाइपलाइन के हिसाब से नाम देता है जिसने उसे बनाया, और सेवा को आमतौर पर कुछ और चाहिए होता है।
Parquet कॉलम में null JSON में `null` लिखा जाता है, जो एक ऐसा फ़र्क़ सुरक्षित रखता है जो कोई सीमांकित फ़ॉर्मेट नहीं ढो सकता: null और ख़ाली स्ट्रिंग अलग-अलग मूल्य हैं, और वे अलग-अलग ही पहुँचते हैं।
यह वहाँ मायने रखता है जहाँ गंतव्य के पास स्कीमा है। स्ट्रिंग घोषित फ़ील्ड null को ठुकरा देगी जब तक कि उसे nullable न घोषित किया गया हो, और वैलिडेटर उसी रिकॉर्ड पर बताएगा जहाँ यह हुआ, लोड होने के वक़्त की जगह।
आउटपुट उस फ़ाइल से कहीं बड़ा है जिससे वह आया। हर रिकॉर्ड हर फ़ील्ड नाम दोहराता है, हर स्ट्रिंग उद्धृत होती है, और Parquet फ़ाइल को छोटा रखने वाला संपीड़न, डिक्शनरी एनकोडिंग या बाइनरी रूप में से कुछ भी टेक्स्ट में नहीं बचता।
यह इसलिए स्वीकार्य है क्योंकि यह फ़ाइल एक परिवहन कलाकृति है। यह किसी उपभोक्ता से एक बार पढ़े जाने और फिर मिटाए जाने के लिए है, और स्थायी कॉपी Parquet ही रहती है। जहाँ NDJSON को उपभोग की जगह सँभालकर रखा जा रहा हो, वह संकेत है कि डिज़ाइन में कुछ ग़लत हुआ है।
Parquet रीडर इस पन्ने से मांग पर लोड होने वाली लाइब्रेरी है और JSON वहीं लिखा जाता है, इसलिए कोई अनुरोध फ़ाइल नहीं ढोता। किसी प्लैटफ़ॉर्म के बीच से — जोड़ से पहले, नक़ाब लगाने से पहले — लिया एक्सट्रैक्ट के लिए यह आमतौर पर तय करता है कि कोई ऑनलाइन कन्वर्टर इस्तेमाल किया भी जा सकता है या नहीं।
हर पंक्ति कुछ भी लिखे जाने से पहले पूरी तरह बना ली जाती है, इसलिए याददाश्त ही सीमा है। Parquet संपीड़ित है, इसलिए मामूली फ़ाइल भी बहुत फैल सकती है और सीमा डिस्क वाले आकार से पहले आ जाती है। बड़ी तालिका के लिए, DuckDB Parquet फ़ाइल पढ़कर एक ही statement में NDJSON लिख सकता है, दोनों को याददाश्त में रखे बिना।
| Parquet | NDJSON | |
|---|---|---|
| पूरा नाम | Apache Parquet | Newline-Delimited JSON |
| फ़ाइल एक्सटेंशन | .parquet | .ndjson, .jsonl |
| मीडिया टाइप | application/vnd.apache.parquet | application/x-ndjson |
| कंप्रेशन | बिना नुक़सान — कुछ छोड़ा नहीं जाता | — |
| पहली बार प्रकाशित | 2013 | 2013 |
| प्रकाशक | Apache Software Foundation | — |
| लाइसेंस | खुला मानक | खुला मानक |
| आज की स्थिति | मौजूदा | मौजूदा |
| ब्राउज़र में खुलता है | कोई ब्राउज़र नहीं | कोई ब्राउज़र नहीं |
| इसकी जगह विचारणीय | CSV, JSON | JSON, CSV |
कुछ नहीं खोता। Parquet और NDJSON — दोनों अपनी सामग्री बिना नुक़सान सँभालते हैं: यह कन्वर्ज़न पैकिंग बदलता है, गुणवत्ता नहीं, और आप इसे दोहरा सकते हैं बिना इस डर के कि नुक़सान जमा होता जाएगा।
NDJSON काम करने का फ़ॉर्मेट है और Parquet बनकर तैयार फ़ॉर्मेट। जो लौटता है वह पन्ने की तस्वीर नहीं बल्कि बदली जा सकने वाली लिखावट है — आम तौर पर यही इस कन्वर्ज़न की वजह होती है, और यही इसकी सीमा भी।
pandas Parquet और NDJSON — दोनों पढ़ लेता है, इसलिए आप नतीजे को असली फ़ाइल के बग़ल में रखकर देख सकते हैं, बिना दूसरा प्रोग्राम खोले।
NDJSON 2013 से चला आ रहा है। jq और pandas इस फ़ॉर्मेट को पढ़ लेते है।
नहीं। यह कन्वर्ज़न पूरी तरह आपके ब्राउज़र में होता है, इसलिए फ़ाइल आपके डिवाइस से बाहर नहीं जाती। आप ख़ुद जाँच सकते हैं: डेवलपर टूल्स का नेटवर्क टैब खोलिए और कुछ बदल कर देखिए। आपको पेज ख़ुद दिखेगा और आँकड़ों तथा विज्ञापन के वे अनुरोध दिखेंगे जिनसे इस सेवा का ख़र्च निकलता है — और एक भी ऐसा अनुरोध नहीं जो आपकी फ़ाइल साथ ले जा रहा हो। इस जोड़ी के पीछे parquet-wasm है, Apache Arrow के पाठक का एक WebAssembly संस्करण; आपका ब्राउज़र इसे एक बार उतारता है और फिर सहेज कर रखता है।
हाँ। न खाता, न वॉटरमार्क, और न कोई रोज़ का कोटा जो ख़त्म हो: यह आपकी अपनी मशीन पर चलता है, इसलिए आप जितनी बार चाहें लौट सकते हैं। ब्राउज़र 100 MB तक की फ़ाइलें सँभालता है, एक बार में 100। parquet-wasm आपकी अपनी मशीन पर उतरता है और वहीं चलता है — इसीलिए उस पर कोई गिनती नहीं है।
नहीं। NDJSON वही सामग्री बिना कुछ फेंके सँभालता है: नतीजा गुणवत्ता में असली फ़ाइल जैसा ही होता है।
कुछ नहीं खोता। Parquet और NDJSON — दोनों अपनी सामग्री बिना नुक़सान सँभालते हैं: यह कन्वर्ज़न पैकिंग बदलता है, गुणवत्ता नहीं, और आप इसे दोहरा सकते हैं बिना इस डर के कि नुक़सान जमा होता जाएगा।
NDJSON काम करने का फ़ॉर्मेट है और Parquet बनकर तैयार फ़ॉर्मेट। जो लौटता है वह पन्ने की तस्वीर नहीं बल्कि बदली जा सकने वाली लिखावट है — आम तौर पर यही इस कन्वर्ज़न की वजह होती है, और यही इसकी सीमा भी।