आँकड़ों और विज्ञापन के लिए कुकीज़
हम आँकड़ों और विज्ञापन के लिए कुकीज़ इस्तेमाल करते हैं, दोनों Google को जाती हैं। मना करने से आपको दिखने वाली किसी चीज़ में कोई फ़र्क़ नहीं पड़ता।निजता पेज पढ़ें
यहाँ आप NDJSON को Parquet में बदलते हैं, मुफ़्त और बिना खाते के: फ़ाइल ऊपर छोड़िए और कुछ ही सेकंड में नतीजा डाउनलोड के लिए तैयार मिलेगा। कन्वर्ज़न आपके अपने ब्राउज़र के भीतर होता है, इसलिए फ़ाइल कभी अपलोड नहीं होती। यह Windows, macOS और Linux पर वैसे ही चलता है जैसे iPhone और Android पर, और कनेक्शन काट देने पर भी चलता रहता है।
एक बार में 100 फ़ाइलें। फ़ॉर्मेट अलग-अलग हों तो भी चलेगा।
ये एक के बाद एक बदलती हैं और साथ में एक ZIP बनकर उतरती हैं।
NDJSON से Parquet
NDJSON की हर लाइन अपने आप में स्वतंत्र है, और यही वजह है कि चीज़ें इसी में जोड़ी जाती हैं — मंगलवार को कोई नया खाना जोड़ा जा सकता है और पुरानी किसी लाइन को दोबारा लिखना नहीं पड़ता। महीनों के बाद एक ही फ़ाइल में रिकॉर्ड की कई पीढ़ियाँ जमा हो जाती हैं।
Parquet इसे बर्दाश्त नहीं करता। उसका फ़ूटर एक तय कॉलम-सूची और हर एक का एक टाइप घोषित करता है, और हर पंक्ति उसका पालन करती है। इसलिए बदलाव को सारी पीढ़ियों को एक ढाँचे में समेटना पड़ता है, और आगे की हर बात इसी का नतीजा है।
कोई खाना जो तीन लाख लाइनों बाद पहली बार दिखता है, वह भी कॉलम बनता है, और उससे पहले की पंक्तियों में ख़ाली जगह भर जाती है। यही एकमात्र तरीक़ा है जिसमें कुछ खोता नहीं, और इसीलिए लिखने से पहले पूरी फ़ाइल एक बार पढ़ी जाती है।
ज़्यादातर औज़ार नमूना लेते हैं — पहली हज़ार लाइनें — और यही वजह है कि जो टेस्ट फ़ाइल पर चला, वह असली इस्तेमाल में टूट जाता है। नमूने से तय ढाँचा जो खाना नहीं देखा, उसे चुपचाप गिरा देता है; पूरा पढ़ना यह ख़तरा हटा देता है।
भटकाव का दूसरा रूप वह खाना है जिसका नाम वही रहा और टाइप बदल गया — कोई पहचान संख्या जो पहले अंक थी और अब उद्धरण में है, कोई स्थिति जो बूलियन थी और अब स्ट्रिंग बन गई।
हर कॉलम का टाइप उसके सभी मानों को देखकर तय होता है: सारे बूलियन होने पर BOOLEAN, 32-बिट के भीतर सारे पूर्णांक होने पर INT32, बाक़ी संख्याओं पर DOUBLE, और मिश्रित होने पर स्ट्रिंग कॉलम। स्ट्रिंग कॉलम दिखता है और कभी चुपचाप कोई पंक्ति नहीं गिराता।
structured इवेंट में अक्सर घोंसले होते हैं — कोई request खंड, कोई user खंड — और Parquet में किसी सेल के अंदर वस्तु रखने की जगह नहीं है। इसलिए हर रिकॉर्ड पहले अपने पत्तों तक खोला जाता है, और पथ ही कॉलम का नाम बन जाता है — request.method, user.id।
सूचियाँ स्थिति के हिसाब से खुलती हैं, इसलिए tags नाम की सूची tags.0, tags.1 बन जाती है, और कॉलम-सूची पूरी फ़ाइल का जोड़ है — कहीं एक बहुत लंबी सूची पूरे महीने के ढाँचे को चौड़ा कर सकती है।
Parquet के पास 64-बिट पूर्णांक टाइप है और यह बदलाव उसे कभी नहीं लिखता। मान JavaScript की संख्याओं से गुज़रते हैं, जो 53 बिट तक ही पूर्णांक सँभालती हैं, इसलिए 32-बिट के बाहर की हर संख्या DOUBLE बनकर लिखी जाती है।
इवेंट फ़ाइलों में इससे प्रभावित होने वाले मान भरे रहते हैं — मिलीसेकंड टाइमस्टैंप, बड़ी पहचान संख्याएँ। टाइमस्टैंप के लिए DOUBLE काफ़ी है; पहचान संख्या के लिए नहीं, और उसका इलाज उस जगह है जहाँ इवेंट लिखे जाते हैं — उन्हें JSON स्ट्रिंग के रूप में भेजना सटीकता बचाए रखता है।
छह खानों वाले पचास हज़ार बनाए गए ऑर्डर रिकॉर्ड NDJSON में 4.8 मेगाबाइट और Parquet में 207 किलोबाइट निकले — इस डेटा पर बीस गुना से भी बेहतर।
दो चीज़ें साथ काम कर रही हैं। NDJSON की हर लाइन हर खाने का नाम दोहराती है; कॉलम-भंडार में हर नाम फ़ूटर में एक बार लिखा जाता है। और एक तरह के मानों का साथ बैठना अलग-अलग लाइनों में बिखरे मानों से कहीं ज़्यादा दबता है।
यहाँ एक हल्की विडंबना है। NDJSON इसलिए बना ताकि पढ़ने वाले को पूरी फ़ाइल कभी न थामनी पड़े, और यह बदलाव पूरी फ़ाइल थाम लेता है — क्योंकि आख़िरी लाइन कोई नया कॉलम जोड़ सकती है, और फ़ूटर तब तक नहीं लिखा जा सकता जब तक यह पता न हो।
सीमा योजना की नहीं, याददाश्त की है। मुफ़्त दर्जा 100 मेगाबाइट तक लेता है; कुछ दर्जन मेगाबाइट बिना दिक़्क़त के बदल जाते हैं। इससे बड़ी फ़ाइल हो तो split -l जैसी कमान से बाँटकर हर हिस्सा अलग बदलिए — Parquet फ़ाइलों का फ़ोल्डर एक टेबल की तरह पढ़ा जा सकता है।
Parquet लिखने वाला और JSON पढ़ने वाला दोनों साधारण JavaScript हैं, जो यह पेज ज़रूरत पड़ने पर ही उतारता है — कोई सर्वर क़दम बीच में नहीं। कोई अनुरोध फ़ाइल कहीं नहीं ले जाता; कोई खाता नहीं, कोई क़तार नहीं।
टेलीमेट्री के लिए यही अक्सर तय करने वाली बात होती है। इवेंट धाराओं में उपयोगकर्ता की पहचान, IP पता और जो कुछ भी ऐप्लिकेशन दर्ज करना चाहे, रहता है — और यह किसी अनजान वेब परिवर्तक के लिए ठहरने की वजह नहीं बनता।
| NDJSON | Parquet | |
|---|---|---|
| पूरा नाम | Newline-Delimited JSON | Apache Parquet |
| फ़ाइल एक्सटेंशन | .ndjson, .jsonl | .parquet |
| मीडिया टाइप | application/x-ndjson | application/vnd.apache.parquet |
| कंप्रेशन | — | बिना नुक़सान — कुछ छोड़ा नहीं जाता |
| पहली बार प्रकाशित | 2013 | 2013 |
| प्रकाशक | — | Apache Software Foundation |
| लाइसेंस | खुला मानक | खुला मानक |
| आज की स्थिति | मौजूदा | मौजूदा |
| ब्राउज़र में खुलता है | कोई ब्राउज़र नहीं | कोई ब्राउज़र नहीं |
| इसकी जगह विचारणीय | JSON, CSV | CSV, JSON |
pandas NDJSON और Parquet — दोनों पढ़ लेता है, इसलिए आप नतीजे को असली फ़ाइल के बग़ल में रखकर देख सकते हैं, बिना दूसरा प्रोग्राम खोले।
Parquet Apache Software Foundation का है और 2013 से चला आ रहा है। pandas, Apache Spark और DuckDB इस फ़ॉर्मेट को पढ़ लेते है।
नहीं। यह कन्वर्ज़न पूरी तरह आपके ब्राउज़र में होता है, इसलिए फ़ाइल आपके डिवाइस से बाहर नहीं जाती। आप ख़ुद जाँच सकते हैं: डेवलपर टूल्स का नेटवर्क टैब खोलिए और कुछ बदल कर देखिए। आपको पेज ख़ुद दिखेगा और आँकड़ों तथा विज्ञापन के वे अनुरोध दिखेंगे जिनसे इस सेवा का ख़र्च निकलता है — और एक भी ऐसा अनुरोध नहीं जो आपकी फ़ाइल साथ ले जा रहा हो। इस जोड़ी के पीछे parquet-wasm है, Apache Arrow के पाठक का एक WebAssembly संस्करण; आपका ब्राउज़र इसे एक बार उतारता है और फिर सहेज कर रखता है।
हाँ। न खाता, न वॉटरमार्क, और न कोई रोज़ का कोटा जो ख़त्म हो: यह आपकी अपनी मशीन पर चलता है, इसलिए आप जितनी बार चाहें लौट सकते हैं। ब्राउज़र 100 MB तक की फ़ाइलें सँभालता है, एक बार में 100। parquet-wasm आपकी अपनी मशीन पर उतरता है और वहीं चलता है — इसीलिए उस पर कोई गिनती नहीं है।
NDJSON और Parquet सामग्री का वर्णन बुनियादी तौर पर अलग-अलग तरीक़ों से करते हैं। इसलिए यह कन्वर्ज़न नक़ल नहीं, पुनर्निर्माण है: ईमानदार, पर बाइट-दर-बाइट एक जैसा नहीं। एक के अंदर एक बैठी वस्तुएँ चपटी होकर कॉलम बन जाती हैं। गहराई तक बैठा डेटा अपना आकार खो देता है।
कन्वर्ज़न के लिए नहीं: वह उसी ब्राउज़र में होता है जो आपने पहले से खोल रखा है। नतीजा खोलने के लिए उसके बाद वही प्रोग्राम चाहिए जिससे आपका डिवाइस Apache Parquet आम तौर पर दिखाता है।